@takaro/gameserver 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -0
- package/dist/TakaroEmitter.d.ts +26 -0
- package/dist/TakaroEmitter.js +97 -0
- package/dist/TakaroEmitter.js.map +1 -0
- package/dist/gameservers/7d2d/apiResponses.d.ts +193 -0
- package/dist/gameservers/7d2d/apiResponses.js +2 -0
- package/dist/gameservers/7d2d/apiResponses.js.map +1 -0
- package/dist/gameservers/7d2d/connectionInfo.d.ts +32 -0
- package/dist/gameservers/7d2d/connectionInfo.js +58 -0
- package/dist/gameservers/7d2d/connectionInfo.js.map +1 -0
- package/dist/gameservers/7d2d/emitter.d.ts +30 -0
- package/dist/gameservers/7d2d/emitter.js +261 -0
- package/dist/gameservers/7d2d/emitter.js.map +1 -0
- package/dist/gameservers/7d2d/index.d.ts +28 -0
- package/dist/gameservers/7d2d/index.js +267 -0
- package/dist/gameservers/7d2d/index.js.map +1 -0
- package/dist/gameservers/7d2d/itemWorker.d.ts +1 -0
- package/dist/gameservers/7d2d/itemWorker.js +31 -0
- package/dist/gameservers/7d2d/itemWorker.js.map +1 -0
- package/dist/gameservers/7d2d/items-7d2d.json +17705 -0
- package/dist/gameservers/7d2d/sdtdAPIClient.d.ts +14 -0
- package/dist/gameservers/7d2d/sdtdAPIClient.js +60 -0
- package/dist/gameservers/7d2d/sdtdAPIClient.js.map +1 -0
- package/dist/gameservers/mock/connectionInfo.d.ts +20 -0
- package/dist/gameservers/mock/connectionInfo.js +37 -0
- package/dist/gameservers/mock/connectionInfo.js.map +1 -0
- package/dist/gameservers/mock/emitter.d.ts +12 -0
- package/dist/gameservers/mock/emitter.js +33 -0
- package/dist/gameservers/mock/emitter.js.map +1 -0
- package/dist/gameservers/mock/index.d.ts +31 -0
- package/dist/gameservers/mock/index.js +135 -0
- package/dist/gameservers/mock/index.js.map +1 -0
- package/dist/gameservers/rust/connectionInfo.d.ts +28 -0
- package/dist/gameservers/rust/connectionInfo.js +51 -0
- package/dist/gameservers/rust/connectionInfo.js.map +1 -0
- package/dist/gameservers/rust/emitter.d.ts +30 -0
- package/dist/gameservers/rust/emitter.js +160 -0
- package/dist/gameservers/rust/emitter.js.map +1 -0
- package/dist/gameservers/rust/index.d.ts +29 -0
- package/dist/gameservers/rust/index.js +189 -0
- package/dist/gameservers/rust/index.js.map +1 -0
- package/dist/gameservers/rust/items-rust.json +20771 -0
- package/dist/getGame.d.ts +8 -0
- package/dist/getGame.js +26 -0
- package/dist/getGame.js.map +1 -0
- package/dist/interfaces/GameServer.d.ts +57 -0
- package/dist/interfaces/GameServer.js +95 -0
- package/dist/interfaces/GameServer.js.map +1 -0
- package/dist/main.d.ts +9 -0
- package/dist/main.js +10 -0
- package/dist/main.js.map +1 -0
- package/package.json +26 -0
- package/src/TakaroEmitter.ts +138 -0
- package/src/TakaroEmitter.unit.test.ts +125 -0
- package/src/__tests__/gameEventEmitter.test.ts +36 -0
- package/src/gameservers/7d2d/__tests__/7d2dActions.unit.test.ts +91 -0
- package/src/gameservers/7d2d/__tests__/7d2dEventDetection.unit.test.ts +324 -0
- package/src/gameservers/7d2d/apiResponses.ts +214 -0
- package/src/gameservers/7d2d/connectionInfo.ts +40 -0
- package/src/gameservers/7d2d/emitter.ts +325 -0
- package/src/gameservers/7d2d/index.ts +318 -0
- package/src/gameservers/7d2d/itemWorker.ts +34 -0
- package/src/gameservers/7d2d/items-7d2d.json +17705 -0
- package/src/gameservers/7d2d/sdtdAPIClient.ts +82 -0
- package/src/gameservers/mock/connectionInfo.ts +25 -0
- package/src/gameservers/mock/emitter.ts +37 -0
- package/src/gameservers/mock/index.ts +156 -0
- package/src/gameservers/rust/__tests__/rustActions.unit.test.ts +140 -0
- package/src/gameservers/rust/connectionInfo.ts +35 -0
- package/src/gameservers/rust/emitter.ts +198 -0
- package/src/gameservers/rust/index.ts +230 -0
- package/src/gameservers/rust/items-rust.json +20771 -0
- package/src/getGame.ts +32 -0
- package/src/interfaces/GameServer.ts +95 -0
- package/src/main.ts +14 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.json +9 -0
- package/typedoc.json +3 -0
package/README.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# @takaro/config
|
|
2
|
+
|
|
3
|
+
An opinionated config manager based on [node-convict](https://github.com/mozilla/node-convict)
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { Config, IBaseConfig } from '@takaro/config';
|
|
9
|
+
|
|
10
|
+
interface IExampleConfig extends IBaseConfig {
|
|
11
|
+
test: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// This is a schema from convict
|
|
15
|
+
const exampleSchema = {
|
|
16
|
+
test: {
|
|
17
|
+
doc: 'Test value',
|
|
18
|
+
format: String,
|
|
19
|
+
default: 'test',
|
|
20
|
+
env: 'TAKARO_TEST'
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const config = new Config<IExampleConfig>([exampleSchema]);
|
|
25
|
+
|
|
26
|
+
// ---
|
|
27
|
+
|
|
28
|
+
config.load({ test: 1 });
|
|
29
|
+
// Error! 'test' should be a string
|
|
30
|
+
config.validate();
|
|
31
|
+
|
|
32
|
+
// ---
|
|
33
|
+
|
|
34
|
+
config.load({ test: 'Hello world' });
|
|
35
|
+
config.get('test') // 'Hello world'
|
|
36
|
+
```
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { BaseEvent, EventChatMessage, EventEntityKilled, EventLogLine, EventPlayerConnected, EventPlayerDeath, EventPlayerDisconnected, GameEvents } from '@takaro/modules';
|
|
2
|
+
import { errors } from '@takaro/util';
|
|
3
|
+
/**
|
|
4
|
+
* Maps event types to their listener function signatures
|
|
5
|
+
* This allows our EventEmitter to be strongly typed
|
|
6
|
+
*/
|
|
7
|
+
export interface IEventMap {
|
|
8
|
+
[GameEvents.LOG_LINE]: (log: EventLogLine) => Promise<void>;
|
|
9
|
+
[GameEvents.PLAYER_CONNECTED]: (player: EventPlayerConnected) => Promise<void>;
|
|
10
|
+
[GameEvents.PLAYER_DISCONNECTED]: (player: EventPlayerDisconnected) => Promise<void>;
|
|
11
|
+
[GameEvents.CHAT_MESSAGE]: (chatMessage: EventChatMessage) => Promise<void>;
|
|
12
|
+
[GameEvents.PLAYER_DEATH]: (playerDeath: EventPlayerDeath) => Promise<void>;
|
|
13
|
+
[GameEvents.ENTITY_KILLED]: (entityKilled: EventEntityKilled) => Promise<void>;
|
|
14
|
+
error: (error: errors.TakaroError | Error) => Promise<void> | void;
|
|
15
|
+
}
|
|
16
|
+
export declare abstract class TakaroEmitter {
|
|
17
|
+
private listenerMap;
|
|
18
|
+
abstract stop(): Promise<void>;
|
|
19
|
+
abstract start(): Promise<void>;
|
|
20
|
+
constructor();
|
|
21
|
+
emit<E extends keyof IEventMap>(event: E, data: BaseEvent<unknown> | Error): Promise<void>;
|
|
22
|
+
on<E extends keyof IEventMap>(event: E, listener: IEventMap[E]): this;
|
|
23
|
+
off<E extends keyof IEventMap>(event: E, listener: IEventMap[E]): this;
|
|
24
|
+
hasErrorListener(): boolean;
|
|
25
|
+
}
|
|
26
|
+
export declare function getErrorProxyHandler<T extends TakaroEmitter>(emitter: T): T;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { GameEvents, } from '@takaro/modules';
|
|
2
|
+
import { errors, isTakaroDTO, logger } from '@takaro/util';
|
|
3
|
+
import { isPromise } from 'util/types';
|
|
4
|
+
const log = logger('TakaroEmitter');
|
|
5
|
+
export class TakaroEmitter {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.listenerMap = new Map();
|
|
8
|
+
return getErrorProxyHandler(this);
|
|
9
|
+
}
|
|
10
|
+
async emit(event, data) {
|
|
11
|
+
try {
|
|
12
|
+
// No listeners are attached, return early
|
|
13
|
+
if (!this.listenerMap.has(event))
|
|
14
|
+
return;
|
|
15
|
+
// Validate the data, it is user-input after all :)
|
|
16
|
+
if (isTakaroDTO(data)) {
|
|
17
|
+
if (!data.timestamp)
|
|
18
|
+
data.timestamp = new Date().toISOString();
|
|
19
|
+
// await data.validate();
|
|
20
|
+
}
|
|
21
|
+
const listeners = this.listenerMap.get(event);
|
|
22
|
+
if (listeners) {
|
|
23
|
+
for (const listener of listeners) {
|
|
24
|
+
// We know this is okay because our listener map always corresponds to the right event
|
|
25
|
+
// This is implicit in our implementation and checked in the tests
|
|
26
|
+
// @ts-expect-error Can't get the types quite right :(
|
|
27
|
+
await listener(data);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
this.emit('error', error);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
on(event, listener) {
|
|
36
|
+
this.listenerMap.set(event, [listener]);
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
off(event, listener) {
|
|
40
|
+
const listeners = this.listenerMap.get(event);
|
|
41
|
+
if (listeners) {
|
|
42
|
+
this.listenerMap.set(event, listeners.filter((l) => l !== listener));
|
|
43
|
+
}
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
hasErrorListener() {
|
|
47
|
+
return this.listenerMap.has('error');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export function getErrorProxyHandler(emitter) {
|
|
51
|
+
const errorProxyHandler = {
|
|
52
|
+
construct(target, argArray) {
|
|
53
|
+
return Reflect.construct(target, argArray, TakaroEmitter);
|
|
54
|
+
},
|
|
55
|
+
set: function (obj, prop, value) {
|
|
56
|
+
obj[prop] = value;
|
|
57
|
+
return true;
|
|
58
|
+
},
|
|
59
|
+
get(target, prop) {
|
|
60
|
+
return async (...[one, two]) => {
|
|
61
|
+
try {
|
|
62
|
+
// Check if callable function
|
|
63
|
+
if (typeof target[prop] === 'function') {
|
|
64
|
+
return await target[prop](one, two);
|
|
65
|
+
// Or if its a Promise, await it
|
|
66
|
+
}
|
|
67
|
+
else if (isPromise(target[prop])) {
|
|
68
|
+
return await target[prop];
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// Otherwise, return the value
|
|
72
|
+
return target[prop];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
if (!target.hasErrorListener()) {
|
|
77
|
+
log.error('Unhandled error', error);
|
|
78
|
+
const err = new Error('Unhandled error in TakaroEmitter, attach a listener to the "error" event to handle this');
|
|
79
|
+
Error.captureStackTrace(err);
|
|
80
|
+
throw err;
|
|
81
|
+
}
|
|
82
|
+
if (error instanceof errors.TakaroError) {
|
|
83
|
+
await target.emit('error', error);
|
|
84
|
+
}
|
|
85
|
+
else if (error instanceof Error) {
|
|
86
|
+
await target.emit('error', error);
|
|
87
|
+
}
|
|
88
|
+
if (!TakaroEmitter.prototype.hasOwnProperty(prop)) {
|
|
89
|
+
return Promise.reject(error);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
return new Proxy(emitter, errorProxyHandler);
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=TakaroEmitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TakaroEmitter.js","sourceRoot":"","sources":["../src/TakaroEmitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;AAgBpC,MAAM,OAAgB,aAAa;IAMjC;QALQ,gBAAW,GAAuD,IAAI,GAAG,EAAE,CAAC;QAMlF,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,IAAI,CAA4B,KAAQ,EAAE,IAAgC;QAC9E,IAAI,CAAC;YACH,0CAA0C;YAC1C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,OAAO;YAEzC,mDAAmD;YACnD,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,SAAS;oBAAE,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC/D,yBAAyB;YAC3B,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAE9C,IAAI,SAAS,EAAE,CAAC;gBACd,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,sFAAsF;oBACtF,kEAAkE;oBAClE,sDAAsD;oBACtD,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAc,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,EAAE,CAA4B,KAAQ,EAAE,QAAsB;QAC5D,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAA4B,KAAQ,EAAE,QAAsB;QAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAE9C,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,WAAW,CAAC,GAAG,CAClB,KAAK,EACL,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CACxC,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;CACF;AAED,MAAM,UAAU,oBAAoB,CAA0B,OAAU;IACtE,MAAM,iBAAiB,GAAoB;QACzC,SAAS,CAAC,MAAW,EAAE,QAAQ;YAC7B,OAAO,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC5D,CAAC;QAED,GAAG,EAAE,UAAU,GAAG,EAAE,IAAyB,EAAE,KAAK;YAClD,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,GAAG,CAAC,MAAM,EAAE,IAAyB;YACnC,OAAO,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAQ,EAAE,EAAE;gBACpC,IAAI,CAAC;oBACH,6BAA6B;oBAC7B,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;wBACvC,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;wBACpC,gCAAgC;oBAClC,CAAC;yBAAM,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;wBACnC,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC5B,CAAC;yBAAM,CAAC;wBACN,8BAA8B;wBAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;oBACtB,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,EAAE,CAAC;wBAC/B,GAAG,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;wBACpC,MAAM,GAAG,GAAG,IAAI,KAAK,CACnB,yFAAyF,CAC1F,CAAC;wBACF,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;wBAC7B,MAAM,GAAG,CAAC;oBACZ,CAAC;oBAED,IAAI,KAAK,YAAY,MAAM,CAAC,WAAW,EAAE,CAAC;wBACxC,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;oBACpC,CAAC;yBAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;wBAClC,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;oBACpC,CAAC;oBAED,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;wBAClD,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC;YACH,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;IAEF,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
export interface GameTime {
|
|
2
|
+
days: number;
|
|
3
|
+
hours: number;
|
|
4
|
+
minutes: number;
|
|
5
|
+
}
|
|
6
|
+
export interface StatsResponse {
|
|
7
|
+
gametime: GameTime;
|
|
8
|
+
players: number;
|
|
9
|
+
hostiles: number;
|
|
10
|
+
animals: number;
|
|
11
|
+
}
|
|
12
|
+
export interface Position {
|
|
13
|
+
x: number;
|
|
14
|
+
y: number;
|
|
15
|
+
z: number;
|
|
16
|
+
}
|
|
17
|
+
export interface OnlinePlayerResponse {
|
|
18
|
+
steamid: string;
|
|
19
|
+
crossplatformid: string;
|
|
20
|
+
entityid: number;
|
|
21
|
+
ip: string;
|
|
22
|
+
name: string;
|
|
23
|
+
online: boolean;
|
|
24
|
+
position: Position;
|
|
25
|
+
level: number;
|
|
26
|
+
health: number;
|
|
27
|
+
stamina: number;
|
|
28
|
+
zombiekills: number;
|
|
29
|
+
playerkills: number;
|
|
30
|
+
playerdeaths: number;
|
|
31
|
+
score: number;
|
|
32
|
+
totalplaytime: number;
|
|
33
|
+
lastonline: string;
|
|
34
|
+
ping: number;
|
|
35
|
+
}
|
|
36
|
+
export interface EntityLocation {
|
|
37
|
+
id: number;
|
|
38
|
+
name: string;
|
|
39
|
+
position: Position;
|
|
40
|
+
}
|
|
41
|
+
export interface LandClaimsResponse {
|
|
42
|
+
claimsize: number;
|
|
43
|
+
claimowners: Array<ClaimOwner>;
|
|
44
|
+
}
|
|
45
|
+
export interface ClaimOwner {
|
|
46
|
+
steamid: string;
|
|
47
|
+
claimactive: boolean;
|
|
48
|
+
playername: string;
|
|
49
|
+
claims: Array<Position>;
|
|
50
|
+
}
|
|
51
|
+
export interface CommandResponse {
|
|
52
|
+
command: string;
|
|
53
|
+
parameters: string;
|
|
54
|
+
result: string;
|
|
55
|
+
}
|
|
56
|
+
export interface AllowedCommands {
|
|
57
|
+
commands: Array<CommandEntry>;
|
|
58
|
+
}
|
|
59
|
+
export interface CommandEntry {
|
|
60
|
+
command: string;
|
|
61
|
+
description: string;
|
|
62
|
+
help: string;
|
|
63
|
+
}
|
|
64
|
+
export interface InventoryResponse {
|
|
65
|
+
playername: string;
|
|
66
|
+
userid: string;
|
|
67
|
+
crossplatformid: string;
|
|
68
|
+
bag: Array<InventoryItem>;
|
|
69
|
+
belt: Array<InventoryItem>;
|
|
70
|
+
equipment: PlayerEquipment;
|
|
71
|
+
}
|
|
72
|
+
export interface InventoryItem {
|
|
73
|
+
count: number;
|
|
74
|
+
name: string;
|
|
75
|
+
icon: string;
|
|
76
|
+
iconcolor: string;
|
|
77
|
+
quality: number;
|
|
78
|
+
}
|
|
79
|
+
export interface PlayerEquipment extends Record<string, InventoryItem> {
|
|
80
|
+
head: InventoryItem;
|
|
81
|
+
eyes: InventoryItem;
|
|
82
|
+
face: InventoryItem;
|
|
83
|
+
armor: InventoryItem;
|
|
84
|
+
jacket: InventoryItem;
|
|
85
|
+
shirt: InventoryItem;
|
|
86
|
+
legarmor: InventoryItem;
|
|
87
|
+
pants: InventoryItem;
|
|
88
|
+
boots: InventoryItem;
|
|
89
|
+
gloves: InventoryItem;
|
|
90
|
+
}
|
|
91
|
+
export interface PlayerListResponse {
|
|
92
|
+
total: number;
|
|
93
|
+
totalUnfiltered: number;
|
|
94
|
+
firstResult: number;
|
|
95
|
+
players: Array<PlayerNotOnline>;
|
|
96
|
+
}
|
|
97
|
+
export interface PlayerNotOnline {
|
|
98
|
+
steamid: string;
|
|
99
|
+
entityid: number;
|
|
100
|
+
ip: string;
|
|
101
|
+
name: string;
|
|
102
|
+
online: boolean;
|
|
103
|
+
position: Position;
|
|
104
|
+
totalplaytime: number;
|
|
105
|
+
lastonline: string;
|
|
106
|
+
ping: number;
|
|
107
|
+
banned: boolean;
|
|
108
|
+
}
|
|
109
|
+
export interface PlayerLocation {
|
|
110
|
+
steamid: string;
|
|
111
|
+
crossplatformid: string;
|
|
112
|
+
name: string;
|
|
113
|
+
online: boolean;
|
|
114
|
+
position: Position;
|
|
115
|
+
}
|
|
116
|
+
export interface GetServerInfo {
|
|
117
|
+
GameType: GetServerInfoEntry;
|
|
118
|
+
GameName: GetServerInfoEntry;
|
|
119
|
+
GameHost: GetServerInfoEntry;
|
|
120
|
+
ServerDescription: GetServerInfoEntry;
|
|
121
|
+
ServerWebsiteURL: GetServerInfoEntry;
|
|
122
|
+
LevelName: GetServerInfoEntry;
|
|
123
|
+
GameMode: GetServerInfoEntry;
|
|
124
|
+
Version: GetServerInfoEntry;
|
|
125
|
+
IP: GetServerInfoEntry;
|
|
126
|
+
CountryCode: GetServerInfoEntry;
|
|
127
|
+
SteamID: GetServerInfoEntry;
|
|
128
|
+
CompatibilityVersion: GetServerInfoEntry;
|
|
129
|
+
Platform: GetServerInfoEntry;
|
|
130
|
+
Port: GetServerInfoEntry;
|
|
131
|
+
CurrentPlayers: GetServerInfoEntry;
|
|
132
|
+
MaxPlayers: GetServerInfoEntry;
|
|
133
|
+
GameDifficulty: GetServerInfoEntry;
|
|
134
|
+
DayNightLength: GetServerInfoEntry;
|
|
135
|
+
ZombiesRun: GetServerInfoEntry;
|
|
136
|
+
DayCount: GetServerInfoEntry;
|
|
137
|
+
Ping: GetServerInfoEntry;
|
|
138
|
+
DropOnDeath: GetServerInfoEntry;
|
|
139
|
+
DropOnQuit: GetServerInfoEntry;
|
|
140
|
+
BloodMoonEnemyCount: GetServerInfoEntry;
|
|
141
|
+
EnemyDifficulty: GetServerInfoEntry;
|
|
142
|
+
PlayerKillingMode: GetServerInfoEntry;
|
|
143
|
+
CurrentServerTime: GetServerInfoEntry;
|
|
144
|
+
DayLightLength: GetServerInfoEntry;
|
|
145
|
+
BlockDurabilityModifier: GetServerInfoEntry;
|
|
146
|
+
AirDropFrequency: GetServerInfoEntry;
|
|
147
|
+
LootAbundance: GetServerInfoEntry;
|
|
148
|
+
LootRespawnDays: GetServerInfoEntry;
|
|
149
|
+
MaxSpawnedZombies: GetServerInfoEntry;
|
|
150
|
+
LandClaimSize: GetServerInfoEntry;
|
|
151
|
+
LandClaimDeadZone: GetServerInfoEntry;
|
|
152
|
+
LandClaimExpiryTime: GetServerInfoEntry;
|
|
153
|
+
LandClaimDecayMode: GetServerInfoEntry;
|
|
154
|
+
LandClaimOnlineDurabilityModifier: GetServerInfoEntry;
|
|
155
|
+
LandClaimOfflineDurabilityModifier: GetServerInfoEntry;
|
|
156
|
+
MaxSpawnedAnimals: GetServerInfoEntry;
|
|
157
|
+
IsDedicated: GetServerInfoEntry;
|
|
158
|
+
IsPasswordProtected: GetServerInfoEntry;
|
|
159
|
+
ShowFriendPlayerOnMap: GetServerInfoEntry;
|
|
160
|
+
BuildCreate: GetServerInfoEntry;
|
|
161
|
+
EACEnabled: GetServerInfoEntry;
|
|
162
|
+
Architecture64: GetServerInfoEntry;
|
|
163
|
+
StockSettings: GetServerInfoEntry;
|
|
164
|
+
StockFiles: GetServerInfoEntry;
|
|
165
|
+
RequiresMod: GetServerInfoEntry;
|
|
166
|
+
AirDropMarker: GetServerInfoEntry;
|
|
167
|
+
EnemySpawnMode: GetServerInfoEntry;
|
|
168
|
+
IsPublic: GetServerInfoEntry;
|
|
169
|
+
}
|
|
170
|
+
export interface GetServerInfoEntry {
|
|
171
|
+
type: string;
|
|
172
|
+
value: any;
|
|
173
|
+
}
|
|
174
|
+
export interface GetWebUIUpdatesResponse {
|
|
175
|
+
gametime: GameTime;
|
|
176
|
+
players: number;
|
|
177
|
+
hostiles: number;
|
|
178
|
+
animals: number;
|
|
179
|
+
newlogs: number;
|
|
180
|
+
}
|
|
181
|
+
export interface LogLine {
|
|
182
|
+
date: string;
|
|
183
|
+
time: string;
|
|
184
|
+
uptime: string;
|
|
185
|
+
msg: string;
|
|
186
|
+
trace: string;
|
|
187
|
+
type: string;
|
|
188
|
+
}
|
|
189
|
+
export interface GetLog {
|
|
190
|
+
firstLine: number;
|
|
191
|
+
lastLine: number;
|
|
192
|
+
entries: Array<LogLine>;
|
|
193
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiResponses.js","sourceRoot":"","sources":["../../../src/gameservers/7d2d/apiResponses.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { TakaroDTO } from '@takaro/util';
|
|
2
|
+
export declare class SdtdConnectionInfo extends TakaroDTO<SdtdConnectionInfo> {
|
|
3
|
+
readonly host: string;
|
|
4
|
+
readonly adminUser: string;
|
|
5
|
+
readonly adminToken: string;
|
|
6
|
+
readonly useTls: boolean;
|
|
7
|
+
readonly useCPM: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare const sdtdJsonSchema: {
|
|
10
|
+
$schema: string;
|
|
11
|
+
title: string;
|
|
12
|
+
type: string;
|
|
13
|
+
properties: {
|
|
14
|
+
host: {
|
|
15
|
+
type: string;
|
|
16
|
+
};
|
|
17
|
+
adminUser: {
|
|
18
|
+
type: string;
|
|
19
|
+
};
|
|
20
|
+
adminToken: {
|
|
21
|
+
type: string;
|
|
22
|
+
};
|
|
23
|
+
useTls: {
|
|
24
|
+
type: string;
|
|
25
|
+
};
|
|
26
|
+
useCPM: {
|
|
27
|
+
type: string;
|
|
28
|
+
default: boolean;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
required: string[];
|
|
32
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { IsString, IsBoolean } from 'class-validator';
|
|
11
|
+
import { TakaroDTO } from '@takaro/util';
|
|
12
|
+
export class SdtdConnectionInfo extends TakaroDTO {
|
|
13
|
+
}
|
|
14
|
+
__decorate([
|
|
15
|
+
IsString(),
|
|
16
|
+
__metadata("design:type", String)
|
|
17
|
+
], SdtdConnectionInfo.prototype, "host", void 0);
|
|
18
|
+
__decorate([
|
|
19
|
+
IsString(),
|
|
20
|
+
__metadata("design:type", String)
|
|
21
|
+
], SdtdConnectionInfo.prototype, "adminUser", void 0);
|
|
22
|
+
__decorate([
|
|
23
|
+
IsString(),
|
|
24
|
+
__metadata("design:type", String)
|
|
25
|
+
], SdtdConnectionInfo.prototype, "adminToken", void 0);
|
|
26
|
+
__decorate([
|
|
27
|
+
IsBoolean(),
|
|
28
|
+
__metadata("design:type", Boolean)
|
|
29
|
+
], SdtdConnectionInfo.prototype, "useTls", void 0);
|
|
30
|
+
__decorate([
|
|
31
|
+
IsBoolean(),
|
|
32
|
+
__metadata("design:type", Boolean)
|
|
33
|
+
], SdtdConnectionInfo.prototype, "useCPM", void 0);
|
|
34
|
+
export const sdtdJsonSchema = {
|
|
35
|
+
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
36
|
+
title: 'SdtdConnectionInfo',
|
|
37
|
+
type: 'object',
|
|
38
|
+
properties: {
|
|
39
|
+
host: {
|
|
40
|
+
type: 'string',
|
|
41
|
+
},
|
|
42
|
+
adminUser: {
|
|
43
|
+
type: 'string',
|
|
44
|
+
},
|
|
45
|
+
adminToken: {
|
|
46
|
+
type: 'string',
|
|
47
|
+
},
|
|
48
|
+
useTls: {
|
|
49
|
+
type: 'boolean',
|
|
50
|
+
},
|
|
51
|
+
useCPM: {
|
|
52
|
+
type: 'boolean',
|
|
53
|
+
default: false,
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
required: ['host', 'adminUser', 'adminToken', 'useTls'],
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=connectionInfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectionInfo.js","sourceRoot":"","sources":["../../../src/gameservers/7d2d/connectionInfo.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,OAAO,kBAAmB,SAAQ,SAA6B;CAWpE;AATiB;IADf,QAAQ,EAAE;;gDACmB;AAEd;IADf,QAAQ,EAAE;;qDACwB;AAEnB;IADf,QAAQ,EAAE;;sDACyB;AAEpB;IADf,SAAS,EAAE;;kDACqB;AAEjB;IADf,SAAS,EAAE;;kDACqB;AAGnC,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE,yCAAyC;IAClD,KAAK,EAAE,oBAAoB;IAC3B,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,IAAI,EAAE;YACJ,IAAI,EAAE,QAAQ;SACf;QACD,SAAS,EAAE;YACT,IAAI,EAAE,QAAQ;SACf;QACD,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;SACf;QACD,MAAM,EAAE;YACN,IAAI,EAAE,SAAS;SAChB;QACD,MAAM,EAAE;YACN,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,KAAK;SACf;KACF;IACD,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,CAAC;CACxD,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/// <reference types="eventsource" resolution-mode="require"/>
|
|
2
|
+
import { JsonObject } from 'type-fest';
|
|
3
|
+
import { SdtdConnectionInfo } from './connectionInfo.js';
|
|
4
|
+
import { TakaroEmitter } from '../../TakaroEmitter.js';
|
|
5
|
+
interface I7DaysToDieEvent extends JsonObject {
|
|
6
|
+
msg: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class SevenDaysToDieEmitter extends TakaroEmitter {
|
|
9
|
+
private config;
|
|
10
|
+
private SSERegex;
|
|
11
|
+
private eventSource;
|
|
12
|
+
private logger;
|
|
13
|
+
private sdtd;
|
|
14
|
+
private recentMessages;
|
|
15
|
+
private checkInterval;
|
|
16
|
+
private lastMessageTimestamp;
|
|
17
|
+
private keepAliveTimeout;
|
|
18
|
+
constructor(config: SdtdConnectionInfo);
|
|
19
|
+
get url(): string;
|
|
20
|
+
start(): Promise<void>;
|
|
21
|
+
stop(): Promise<void>;
|
|
22
|
+
parseMessage(logLine: I7DaysToDieEvent): Promise<void>;
|
|
23
|
+
private handlePlayerConnected;
|
|
24
|
+
private handlePlayerDisconnected;
|
|
25
|
+
private handleChatMessage;
|
|
26
|
+
private handlePlayerDeath;
|
|
27
|
+
private handleEntityKilled;
|
|
28
|
+
listener(data: MessageEvent): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
export {};
|