@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.
Files changed (78) hide show
  1. package/README.md +36 -0
  2. package/dist/TakaroEmitter.d.ts +26 -0
  3. package/dist/TakaroEmitter.js +97 -0
  4. package/dist/TakaroEmitter.js.map +1 -0
  5. package/dist/gameservers/7d2d/apiResponses.d.ts +193 -0
  6. package/dist/gameservers/7d2d/apiResponses.js +2 -0
  7. package/dist/gameservers/7d2d/apiResponses.js.map +1 -0
  8. package/dist/gameservers/7d2d/connectionInfo.d.ts +32 -0
  9. package/dist/gameservers/7d2d/connectionInfo.js +58 -0
  10. package/dist/gameservers/7d2d/connectionInfo.js.map +1 -0
  11. package/dist/gameservers/7d2d/emitter.d.ts +30 -0
  12. package/dist/gameservers/7d2d/emitter.js +261 -0
  13. package/dist/gameservers/7d2d/emitter.js.map +1 -0
  14. package/dist/gameservers/7d2d/index.d.ts +28 -0
  15. package/dist/gameservers/7d2d/index.js +267 -0
  16. package/dist/gameservers/7d2d/index.js.map +1 -0
  17. package/dist/gameservers/7d2d/itemWorker.d.ts +1 -0
  18. package/dist/gameservers/7d2d/itemWorker.js +31 -0
  19. package/dist/gameservers/7d2d/itemWorker.js.map +1 -0
  20. package/dist/gameservers/7d2d/items-7d2d.json +17705 -0
  21. package/dist/gameservers/7d2d/sdtdAPIClient.d.ts +14 -0
  22. package/dist/gameservers/7d2d/sdtdAPIClient.js +60 -0
  23. package/dist/gameservers/7d2d/sdtdAPIClient.js.map +1 -0
  24. package/dist/gameservers/mock/connectionInfo.d.ts +20 -0
  25. package/dist/gameservers/mock/connectionInfo.js +37 -0
  26. package/dist/gameservers/mock/connectionInfo.js.map +1 -0
  27. package/dist/gameservers/mock/emitter.d.ts +12 -0
  28. package/dist/gameservers/mock/emitter.js +33 -0
  29. package/dist/gameservers/mock/emitter.js.map +1 -0
  30. package/dist/gameservers/mock/index.d.ts +31 -0
  31. package/dist/gameservers/mock/index.js +135 -0
  32. package/dist/gameservers/mock/index.js.map +1 -0
  33. package/dist/gameservers/rust/connectionInfo.d.ts +28 -0
  34. package/dist/gameservers/rust/connectionInfo.js +51 -0
  35. package/dist/gameservers/rust/connectionInfo.js.map +1 -0
  36. package/dist/gameservers/rust/emitter.d.ts +30 -0
  37. package/dist/gameservers/rust/emitter.js +160 -0
  38. package/dist/gameservers/rust/emitter.js.map +1 -0
  39. package/dist/gameservers/rust/index.d.ts +29 -0
  40. package/dist/gameservers/rust/index.js +189 -0
  41. package/dist/gameservers/rust/index.js.map +1 -0
  42. package/dist/gameservers/rust/items-rust.json +20771 -0
  43. package/dist/getGame.d.ts +8 -0
  44. package/dist/getGame.js +26 -0
  45. package/dist/getGame.js.map +1 -0
  46. package/dist/interfaces/GameServer.d.ts +57 -0
  47. package/dist/interfaces/GameServer.js +95 -0
  48. package/dist/interfaces/GameServer.js.map +1 -0
  49. package/dist/main.d.ts +9 -0
  50. package/dist/main.js +10 -0
  51. package/dist/main.js.map +1 -0
  52. package/package.json +26 -0
  53. package/src/TakaroEmitter.ts +138 -0
  54. package/src/TakaroEmitter.unit.test.ts +125 -0
  55. package/src/__tests__/gameEventEmitter.test.ts +36 -0
  56. package/src/gameservers/7d2d/__tests__/7d2dActions.unit.test.ts +91 -0
  57. package/src/gameservers/7d2d/__tests__/7d2dEventDetection.unit.test.ts +324 -0
  58. package/src/gameservers/7d2d/apiResponses.ts +214 -0
  59. package/src/gameservers/7d2d/connectionInfo.ts +40 -0
  60. package/src/gameservers/7d2d/emitter.ts +325 -0
  61. package/src/gameservers/7d2d/index.ts +318 -0
  62. package/src/gameservers/7d2d/itemWorker.ts +34 -0
  63. package/src/gameservers/7d2d/items-7d2d.json +17705 -0
  64. package/src/gameservers/7d2d/sdtdAPIClient.ts +82 -0
  65. package/src/gameservers/mock/connectionInfo.ts +25 -0
  66. package/src/gameservers/mock/emitter.ts +37 -0
  67. package/src/gameservers/mock/index.ts +156 -0
  68. package/src/gameservers/rust/__tests__/rustActions.unit.test.ts +140 -0
  69. package/src/gameservers/rust/connectionInfo.ts +35 -0
  70. package/src/gameservers/rust/emitter.ts +198 -0
  71. package/src/gameservers/rust/index.ts +230 -0
  72. package/src/gameservers/rust/items-rust.json +20771 -0
  73. package/src/getGame.ts +32 -0
  74. package/src/interfaces/GameServer.ts +95 -0
  75. package/src/main.ts +14 -0
  76. package/tsconfig.build.json +9 -0
  77. package/tsconfig.json +9 -0
  78. package/typedoc.json +3 -0
@@ -0,0 +1,324 @@
1
+ /* eslint-disable quotes */
2
+ import { expect, sandbox } from '@takaro/test';
3
+ import {
4
+ EventChatMessage,
5
+ EventEntityKilled,
6
+ EventPlayerConnected,
7
+ EventPlayerDeath,
8
+ GameEvents,
9
+ IGamePlayer,
10
+ } from '@takaro/modules';
11
+ import { SdtdConnectionInfo } from '../connectionInfo.js';
12
+ import { SevenDaysToDieEmitter } from '../emitter.js';
13
+ import { SevenDaysToDie } from '../index.js';
14
+
15
+ const mockConnectionInfo = async (overrides?: Partial<SdtdConnectionInfo>) =>
16
+ new SdtdConnectionInfo({
17
+ adminToken: 'aaa',
18
+ adminUser: 'aaa',
19
+ useTls: false,
20
+ host: 'localhost',
21
+ ...overrides,
22
+ });
23
+
24
+ const mockGamePlayer = new IGamePlayer({
25
+ name: 'Catalysm',
26
+ ping: undefined,
27
+ gameId: '0002b5d970954287afdcb5dc35af0424',
28
+ steamId: '76561198028175941',
29
+ });
30
+
31
+ describe('7d2d event detection', () => {
32
+ let emitStub = sandbox.stub(SevenDaysToDieEmitter.prototype, 'emit');
33
+
34
+ beforeEach(() => {
35
+ sandbox.restore();
36
+ emitStub = sandbox.stub(SevenDaysToDieEmitter.prototype, 'emit');
37
+ sandbox.stub(SevenDaysToDie.prototype, 'steamIdOrXboxToGameId').resolves(mockGamePlayer);
38
+ });
39
+
40
+ it('[PlayerConnected]: Can detect simple player connected', async () => {
41
+ const emitter = new SevenDaysToDieEmitter(await mockConnectionInfo());
42
+ await emitter.parseMessage({
43
+ msg: `PlayerSpawnedInWorld (reason: JoinMultiplayer, position: 1873, 66, 347): EntityID=171, PltfmId='Steam_76561198028175941', CrossId='EOS_0002b5d970954287afdcb5dc35af0424', OwnerID='Steam_76561198028175941', PlayerName='Catalysm'`,
44
+ });
45
+ expect(emitStub).to.have.been.calledTwice;
46
+
47
+ expect(emitStub.getCalls()[0].args[0]).to.equal(GameEvents.PLAYER_CONNECTED);
48
+ expect((emitStub.getCalls()[0].args[1] as EventPlayerConnected).player).to.deep.equal({
49
+ name: 'Catalysm',
50
+ ping: undefined,
51
+ gameId: '0002b5d970954287afdcb5dc35af0424',
52
+ steamId: '76561198028175941',
53
+ epicOnlineServicesId: '0002b5d970954287afdcb5dc35af0424',
54
+ xboxLiveId: undefined,
55
+ ip: undefined,
56
+ platformId: undefined,
57
+ });
58
+ expect(emitStub.getCalls()[1].args[0]).to.equal(GameEvents.LOG_LINE);
59
+ });
60
+
61
+ it('[PlayerConnected]: Can detect simple player connected when player connects for the first time', async () => {
62
+ const emitter = new SevenDaysToDieEmitter(await mockConnectionInfo());
63
+ await emitter.parseMessage({
64
+ msg: `PlayerSpawnedInWorld (reason: EnterMultiplayer, position: 1080, 61, 1089): EntityID=3812, PltfmId='Steam_76561198028175941', CrossId='EOS_0002b5d970954287afdcb5dc35af0424', OwnerID='Steam_76561198028175941', PlayerName='Catalysm', ClientNumber='6'`,
65
+ });
66
+ expect(emitStub).to.have.been.calledTwice;
67
+
68
+ expect(emitStub.getCalls()[0].args[0]).to.equal(GameEvents.PLAYER_CONNECTED);
69
+ expect((emitStub.getCalls()[0].args[1] as EventPlayerConnected).player).to.deep.equal({
70
+ name: 'Catalysm',
71
+ ping: undefined,
72
+ gameId: '0002b5d970954287afdcb5dc35af0424',
73
+ steamId: '76561198028175941',
74
+ epicOnlineServicesId: '0002b5d970954287afdcb5dc35af0424',
75
+ xboxLiveId: undefined,
76
+ ip: undefined,
77
+ platformId: undefined,
78
+ });
79
+ expect(emitStub.getCalls()[1].args[0]).to.equal(GameEvents.LOG_LINE);
80
+ });
81
+
82
+ it('[PlayerConnected]: Can detect Xbox player connected', async () => {
83
+ await new SevenDaysToDieEmitter(await mockConnectionInfo()).parseMessage({
84
+ msg: `PlayerSpawnedInWorld (reason: JoinMultiplayer, position: 1873, 66, 347): EntityID=171, PltfmId='XBL_123456abcdef', CrossId='EOS_0002b5d970954287afdcb5dc35af0424', OwnerID='Steam_76561198028175941', PlayerName='Catalysm'`,
85
+ });
86
+ expect(emitStub).to.have.been.calledTwice;
87
+
88
+ expect(emitStub.getCalls()[0].args[0]).to.equal(GameEvents.PLAYER_CONNECTED);
89
+ expect((emitStub.getCalls()[0].args[1] as EventPlayerConnected).player).to.deep.equal({
90
+ name: 'Catalysm',
91
+ ping: undefined,
92
+ gameId: '0002b5d970954287afdcb5dc35af0424',
93
+ steamId: undefined,
94
+ xboxLiveId: '123456abcdef',
95
+ epicOnlineServicesId: '0002b5d970954287afdcb5dc35af0424',
96
+ ip: undefined,
97
+ platformId: undefined,
98
+ });
99
+ expect(emitStub.getCalls()[1].args[0]).to.equal(GameEvents.LOG_LINE);
100
+ });
101
+
102
+ it('[PlayerConnected]: Can detect player connected with space', async () => {
103
+ await new SevenDaysToDieEmitter(await mockConnectionInfo()).parseMessage({
104
+ msg: `PlayerSpawnedInWorld (reason: JoinMultiplayer, position: 1873, 66, 347): EntityID=171, PltfmId='Steam_76561198028175941', CrossId='EOS_0002b5d970954287afdcb5dc35af0424', OwnerID='Steam_76561198028175941', PlayerName='Cata lysm'`,
105
+ });
106
+ expect(emitStub).to.have.been.calledTwice;
107
+
108
+ expect(emitStub.getCalls()[0].args[0]).to.equal(GameEvents.PLAYER_CONNECTED);
109
+ expect((emitStub.getCalls()[0].args[1] as EventPlayerConnected).player).to.deep.equal({
110
+ name: 'Cata lysm',
111
+ ping: undefined,
112
+ gameId: '0002b5d970954287afdcb5dc35af0424',
113
+ steamId: '76561198028175941',
114
+ epicOnlineServicesId: '0002b5d970954287afdcb5dc35af0424',
115
+ xboxLiveId: undefined,
116
+ ip: undefined,
117
+ platformId: undefined,
118
+ });
119
+ expect(emitStub.getCalls()[1].args[0]).to.equal(GameEvents.LOG_LINE);
120
+ });
121
+
122
+ it('[PlayerDisconnected]: Can detect simple player disconnected', async () => {
123
+ await new SevenDaysToDieEmitter(await mockConnectionInfo()).parseMessage({
124
+ // eslint-disable-next-line quotes
125
+ msg: `Player disconnected: EntityID=171, PltfmId='Steam_76561198028175941', CrossId='EOS_0002b5d970954287afdcb5dc35af0424', OwnerID='Steam_76561198028175941', PlayerName='Catalysm'`,
126
+ });
127
+ expect(emitStub).to.have.been.calledTwice;
128
+
129
+ expect(emitStub.getCalls()[0].args[0]).to.equal(GameEvents.PLAYER_DISCONNECTED);
130
+ expect((emitStub.getCalls()[0].args[1] as EventPlayerConnected).player).to.deep.equal({
131
+ name: 'Catalysm',
132
+ ping: undefined,
133
+ gameId: '0002b5d970954287afdcb5dc35af0424',
134
+ steamId: '76561198028175941',
135
+ xboxLiveId: undefined,
136
+ ip: undefined,
137
+ platformId: undefined,
138
+ epicOnlineServicesId: undefined,
139
+ });
140
+ expect(emitStub.getCalls()[1].args[0]).to.equal(GameEvents.LOG_LINE);
141
+ });
142
+
143
+ it('[ChatMessage] Can detect chat message', async () => {
144
+ // Chat handled by mod 'CSMM Patrons': Chat (from 'Steam_76561198028175941', entity id '549', to 'Global'): 'Catalysm': /ping
145
+ const emitter = new SevenDaysToDieEmitter(await mockConnectionInfo());
146
+
147
+ await emitter.parseMessage({
148
+ // eslint-disable-next-line quotes
149
+ msg: `Chat handled by mod 'CSMM Patrons': Chat (from 'Steam_76561198028175941', entity id '549', to 'Global'): 'Catalysm': fsafsafasf`,
150
+ });
151
+
152
+ expect(emitStub).to.have.been.calledTwice;
153
+
154
+ expect(emitStub.getCalls()[0].args[0]).to.equal(GameEvents.CHAT_MESSAGE);
155
+ expect(emitStub.getCalls()[1].args[0]).to.equal(GameEvents.LOG_LINE);
156
+
157
+ expect((emitStub.getCalls()[0].args[1] as EventChatMessage).player).to.deep.equal({
158
+ name: 'Catalysm',
159
+ ping: undefined,
160
+ gameId: '0002b5d970954287afdcb5dc35af0424',
161
+ steamId: '76561198028175941',
162
+ xboxLiveId: undefined,
163
+ ip: undefined,
164
+ platformId: undefined,
165
+ epicOnlineServicesId: undefined,
166
+ });
167
+ });
168
+
169
+ it('[ChatMessage] Can deduplicate messages when a mod handles it', async () => {
170
+ const emitter = new SevenDaysToDieEmitter(await mockConnectionInfo());
171
+
172
+ await emitter.parseMessage({
173
+ // eslint-disable-next-line quotes
174
+ msg: `"Chat (from '-non-player-', entity id '-1', to 'Global'): 'Cata': a"`,
175
+ });
176
+
177
+ await emitter.parseMessage({
178
+ // eslint-disable-next-line quotes
179
+ msg: `Chat handled by mod '1CSMM_Patrons': Chat (from 'Steam_76561198028175941', entity id '546', to 'Global'): 'Catalysm': &ping`,
180
+ });
181
+
182
+ expect(emitStub).to.have.been.calledThrice;
183
+
184
+ expect(emitStub.getCalls()[0].args[0]).to.equal(GameEvents.LOG_LINE);
185
+ expect(emitStub.getCalls()[1].args[0]).to.equal(GameEvents.CHAT_MESSAGE);
186
+ expect(emitStub.getCalls()[2].args[0]).to.equal(GameEvents.LOG_LINE);
187
+
188
+ expect((emitStub.getCalls()[1].args[1] as EventChatMessage).player).to.deep.equal({
189
+ name: 'Catalysm',
190
+ ping: undefined,
191
+ gameId: '0002b5d970954287afdcb5dc35af0424',
192
+ steamId: '76561198028175941',
193
+ xboxLiveId: undefined,
194
+ ip: undefined,
195
+ platformId: undefined,
196
+ epicOnlineServicesId: undefined,
197
+ });
198
+ });
199
+
200
+ it('[ChatMessage] Can deduplicate messages when a mod handles it (bulk test)', async () => {
201
+ const messages = ['Hello', 'Testing', 'If the', 'chat is', 'working'];
202
+
203
+ const logsToSend = messages
204
+ .map((message) => {
205
+ return [
206
+ {
207
+ msg: `Chat handled by mod 'ServerTools': Chat (from 'Steam_76561198028175941', entity id '2196446', to 'Global'): 'Catalysm': ${message}`,
208
+ },
209
+ {
210
+ msg: `Chat (from 'Steam_76561198028175941', entity id '-1', to 'Global'): 'Catalysm': ${message}`,
211
+ },
212
+ ];
213
+ })
214
+ .flat();
215
+
216
+ const logsToSendRandomized = logsToSend.sort(() => Math.random() - 0.5);
217
+
218
+ const emitter = new SevenDaysToDieEmitter(await mockConnectionInfo());
219
+
220
+ await Promise.all(logsToSendRandomized.map(emitter.parseMessage));
221
+
222
+ expect(emitStub).to.have.callCount(messages.length * 3);
223
+
224
+ for (const msg of messages) {
225
+ expect(
226
+ emitStub.getCalls().some((call) => {
227
+ return call.args[0] === GameEvents.CHAT_MESSAGE && (call.args[1] as EventChatMessage).msg === msg;
228
+ })
229
+ ).to.equal(true);
230
+ }
231
+ });
232
+
233
+ it('[PlayerDeath] Can detect player death', async () => {
234
+ const emitter = new SevenDaysToDieEmitter(await mockConnectionInfo());
235
+
236
+ await emitter.parseMessage({
237
+ msg: `GMSG: Player '${mockGamePlayer.name}' died`,
238
+ });
239
+ await emitter.parseMessage({
240
+ msg: `[CSMM_Patrons]playerDied: ${mockGamePlayer.name} (Steam_${mockGamePlayer.steamId}) died @ 702 34 -2938`,
241
+ });
242
+
243
+ expect(emitStub).to.have.been.calledThrice;
244
+
245
+ expect(emitStub.getCalls()[0].args[0]).to.equal(GameEvents.PLAYER_DEATH);
246
+ expect(emitStub.getCalls()[1].args[0]).to.equal(GameEvents.LOG_LINE);
247
+ expect(emitStub.getCalls()[2].args[0]).to.equal(GameEvents.LOG_LINE);
248
+
249
+ expect((emitStub.getCalls()[0].args[1] as EventPlayerDeath).player.name).to.equal(mockGamePlayer.name);
250
+
251
+ expect((emitStub.getCalls()[0].args[1] as EventPlayerDeath).position).to.deep.equal({
252
+ x: NaN,
253
+ y: NaN,
254
+ z: NaN,
255
+ });
256
+ });
257
+
258
+ it('[PlayerDeath] Can detect CPM player death', async () => {
259
+ const emitter = new SevenDaysToDieEmitter(await mockConnectionInfo({ useCPM: true }));
260
+
261
+ await emitter.parseMessage({
262
+ msg: `GMSG: Player '${mockGamePlayer.name}' died`,
263
+ });
264
+ await emitter.parseMessage({
265
+ msg: `[CSMM_Patrons]playerDied: ${mockGamePlayer.name} (Steam_${mockGamePlayer.steamId}) died @ 702 34 -2938`,
266
+ });
267
+
268
+ expect(emitStub).to.have.been.calledThrice;
269
+
270
+ expect(emitStub.getCalls()[0].args[0]).to.equal(GameEvents.LOG_LINE);
271
+ expect(emitStub.getCalls()[1].args[0]).to.equal(GameEvents.PLAYER_DEATH);
272
+ expect(emitStub.getCalls()[2].args[0]).to.equal(GameEvents.LOG_LINE);
273
+
274
+ expect((emitStub.getCalls()[1].args[1] as EventPlayerDeath).player.name).to.equal(mockGamePlayer.name);
275
+
276
+ expect((emitStub.getCalls()[1].args[1] as EventPlayerDeath).position).to.deep.equal({
277
+ x: 702,
278
+ y: 34,
279
+ z: -2938,
280
+ });
281
+ });
282
+
283
+ it('[EntityKilled] Can detect entity killed', async () => {
284
+ const emitter = new SevenDaysToDieEmitter(await mockConnectionInfo());
285
+
286
+ await emitter.parseMessage({
287
+ msg: `Entity zombieNurse 613814 killed by ${mockGamePlayer.name} 54854`,
288
+ });
289
+ await emitter.parseMessage({
290
+ msg: `[CSMM_Patrons]entityKilled: ${mockGamePlayer.name} (Steam_${mockGamePlayer.steamId}) killed zombie zombieNurse with S.H.I.E.L.D. Auto Shotgun`,
291
+ });
292
+
293
+ expect(emitStub).to.have.been.calledThrice;
294
+
295
+ expect(emitStub.getCalls()[0].args[0]).to.equal(GameEvents.ENTITY_KILLED);
296
+ expect(emitStub.getCalls()[1].args[0]).to.equal(GameEvents.LOG_LINE);
297
+ expect(emitStub.getCalls()[2].args[0]).to.equal(GameEvents.LOG_LINE);
298
+
299
+ expect((emitStub.getCalls()[0].args[1] as EventEntityKilled).entity).to.equal('zombieNurse');
300
+ expect((emitStub.getCalls()[0].args[1] as EventEntityKilled).player.name).to.equal(mockGamePlayer.name);
301
+ expect((emitStub.getCalls()[0].args[1] as EventEntityKilled).weapon).to.equal(undefined);
302
+ });
303
+
304
+ it('[EntityKilled] Can detect CPM entity killed', async () => {
305
+ const emitter = new SevenDaysToDieEmitter(await mockConnectionInfo({ useCPM: true }));
306
+
307
+ await emitter.parseMessage({
308
+ msg: `Entity zombieNurse 613814 killed by ${mockGamePlayer.name} 54854`,
309
+ });
310
+ await emitter.parseMessage({
311
+ msg: `[CSMM_Patrons]entityKilled: ${mockGamePlayer.name} (Steam_${mockGamePlayer.steamId}) killed zombie zombieNurse with S.H.I.E.L.D. Auto Shotgun`,
312
+ });
313
+
314
+ expect(emitStub).to.have.been.calledThrice;
315
+
316
+ expect(emitStub.getCalls()[0].args[0]).to.equal(GameEvents.LOG_LINE);
317
+ expect(emitStub.getCalls()[1].args[0]).to.equal(GameEvents.ENTITY_KILLED);
318
+ expect(emitStub.getCalls()[2].args[0]).to.equal(GameEvents.LOG_LINE);
319
+
320
+ expect((emitStub.getCalls()[1].args[1] as EventEntityKilled).entity).to.equal('zombieNurse');
321
+ expect((emitStub.getCalls()[1].args[1] as EventEntityKilled).player.name).to.equal(mockGamePlayer.name);
322
+ expect((emitStub.getCalls()[1].args[1] as EventEntityKilled).weapon).to.equal('S.H.I.E.L.D. Auto Shotgun');
323
+ });
324
+ });
@@ -0,0 +1,214 @@
1
+ export interface GameTime {
2
+ days: number;
3
+ hours: number;
4
+ minutes: number;
5
+ }
6
+
7
+ export interface StatsResponse {
8
+ gametime: GameTime;
9
+ players: number;
10
+ hostiles: number;
11
+ animals: number;
12
+ }
13
+
14
+ export interface Position {
15
+ x: number;
16
+ y: number;
17
+ z: number;
18
+ }
19
+
20
+ export interface OnlinePlayerResponse {
21
+ steamid: string;
22
+ crossplatformid: string;
23
+ entityid: number;
24
+ ip: string;
25
+ name: string;
26
+ online: boolean;
27
+ position: Position;
28
+ level: number;
29
+ health: number;
30
+ stamina: number;
31
+ zombiekills: number;
32
+ playerkills: number;
33
+ playerdeaths: number;
34
+ score: number;
35
+ totalplaytime: number;
36
+ lastonline: string;
37
+ ping: number;
38
+ }
39
+
40
+ export interface EntityLocation {
41
+ id: number;
42
+ name: string;
43
+ position: Position;
44
+ }
45
+
46
+ export interface LandClaimsResponse {
47
+ claimsize: number;
48
+ claimowners: Array<ClaimOwner>;
49
+ }
50
+
51
+ export interface ClaimOwner {
52
+ steamid: string;
53
+ claimactive: boolean;
54
+ playername: string;
55
+ claims: Array<Position>;
56
+ }
57
+
58
+ export interface CommandResponse {
59
+ command: string;
60
+ parameters: string;
61
+ result: string;
62
+ }
63
+
64
+ export interface AllowedCommands {
65
+ commands: Array<CommandEntry>;
66
+ }
67
+
68
+ export interface CommandEntry {
69
+ command: string;
70
+ description: string;
71
+ help: string;
72
+ }
73
+
74
+ export interface InventoryResponse {
75
+ playername: string;
76
+ userid: string;
77
+ crossplatformid: string;
78
+ bag: Array<InventoryItem>;
79
+ belt: Array<InventoryItem>;
80
+ equipment: PlayerEquipment;
81
+ }
82
+
83
+ export interface InventoryItem {
84
+ count: number;
85
+ name: string;
86
+ icon: string;
87
+ iconcolor: string;
88
+ quality: number;
89
+ }
90
+
91
+ export interface PlayerEquipment extends Record<string, InventoryItem> {
92
+ head: InventoryItem;
93
+ eyes: InventoryItem;
94
+ face: InventoryItem;
95
+ armor: InventoryItem;
96
+ jacket: InventoryItem;
97
+ shirt: InventoryItem;
98
+ legarmor: InventoryItem;
99
+ pants: InventoryItem;
100
+ boots: InventoryItem;
101
+ gloves: InventoryItem;
102
+ }
103
+ /* eslint-enable */
104
+
105
+ export interface PlayerListResponse {
106
+ total: number;
107
+ totalUnfiltered: number;
108
+ firstResult: number;
109
+ players: Array<PlayerNotOnline>;
110
+ }
111
+
112
+ export interface PlayerNotOnline {
113
+ steamid: string;
114
+ entityid: number;
115
+ ip: string;
116
+ name: string;
117
+ online: boolean;
118
+ position: Position;
119
+ totalplaytime: number;
120
+ lastonline: string;
121
+ ping: number;
122
+ banned: boolean;
123
+ }
124
+
125
+ export interface PlayerLocation {
126
+ steamid: string;
127
+ crossplatformid: string;
128
+ name: string;
129
+ online: boolean;
130
+ position: Position;
131
+ }
132
+
133
+ export interface GetServerInfo {
134
+ GameType: GetServerInfoEntry;
135
+ GameName: GetServerInfoEntry;
136
+ GameHost: GetServerInfoEntry;
137
+ ServerDescription: GetServerInfoEntry;
138
+ ServerWebsiteURL: GetServerInfoEntry;
139
+ LevelName: GetServerInfoEntry;
140
+ GameMode: GetServerInfoEntry;
141
+ Version: GetServerInfoEntry;
142
+ IP: GetServerInfoEntry;
143
+ CountryCode: GetServerInfoEntry;
144
+ SteamID: GetServerInfoEntry;
145
+ CompatibilityVersion: GetServerInfoEntry;
146
+ Platform: GetServerInfoEntry;
147
+ Port: GetServerInfoEntry;
148
+ CurrentPlayers: GetServerInfoEntry;
149
+ MaxPlayers: GetServerInfoEntry;
150
+ GameDifficulty: GetServerInfoEntry;
151
+ DayNightLength: GetServerInfoEntry;
152
+ ZombiesRun: GetServerInfoEntry;
153
+ DayCount: GetServerInfoEntry;
154
+ Ping: GetServerInfoEntry;
155
+ DropOnDeath: GetServerInfoEntry;
156
+ DropOnQuit: GetServerInfoEntry;
157
+ BloodMoonEnemyCount: GetServerInfoEntry;
158
+ EnemyDifficulty: GetServerInfoEntry;
159
+ PlayerKillingMode: GetServerInfoEntry;
160
+ CurrentServerTime: GetServerInfoEntry;
161
+ DayLightLength: GetServerInfoEntry;
162
+ BlockDurabilityModifier: GetServerInfoEntry;
163
+ AirDropFrequency: GetServerInfoEntry;
164
+ LootAbundance: GetServerInfoEntry;
165
+ LootRespawnDays: GetServerInfoEntry;
166
+ MaxSpawnedZombies: GetServerInfoEntry;
167
+ LandClaimSize: GetServerInfoEntry;
168
+ LandClaimDeadZone: GetServerInfoEntry;
169
+ LandClaimExpiryTime: GetServerInfoEntry;
170
+ LandClaimDecayMode: GetServerInfoEntry;
171
+ LandClaimOnlineDurabilityModifier: GetServerInfoEntry;
172
+ LandClaimOfflineDurabilityModifier: GetServerInfoEntry;
173
+ MaxSpawnedAnimals: GetServerInfoEntry;
174
+ IsDedicated: GetServerInfoEntry;
175
+ IsPasswordProtected: GetServerInfoEntry;
176
+ ShowFriendPlayerOnMap: GetServerInfoEntry;
177
+ BuildCreate: GetServerInfoEntry;
178
+ EACEnabled: GetServerInfoEntry;
179
+ Architecture64: GetServerInfoEntry;
180
+ StockSettings: GetServerInfoEntry;
181
+ StockFiles: GetServerInfoEntry;
182
+ RequiresMod: GetServerInfoEntry;
183
+ AirDropMarker: GetServerInfoEntry;
184
+ EnemySpawnMode: GetServerInfoEntry;
185
+ IsPublic: GetServerInfoEntry;
186
+ }
187
+
188
+ export interface GetServerInfoEntry {
189
+ type: string;
190
+ value: any; // eslint-disable-line
191
+ }
192
+
193
+ export interface GetWebUIUpdatesResponse {
194
+ gametime: GameTime;
195
+ players: number;
196
+ hostiles: number;
197
+ animals: number;
198
+ newlogs: number;
199
+ }
200
+
201
+ export interface LogLine {
202
+ date: string;
203
+ time: string;
204
+ uptime: string;
205
+ msg: string;
206
+ trace: string;
207
+ type: string;
208
+ }
209
+
210
+ export interface GetLog {
211
+ firstLine: number;
212
+ lastLine: number;
213
+ entries: Array<LogLine>;
214
+ }
@@ -0,0 +1,40 @@
1
+ import { IsString, IsBoolean } from 'class-validator';
2
+ import { TakaroDTO } from '@takaro/util';
3
+
4
+ export class SdtdConnectionInfo extends TakaroDTO<SdtdConnectionInfo> {
5
+ @IsString()
6
+ public readonly host!: string;
7
+ @IsString()
8
+ public readonly adminUser!: string;
9
+ @IsString()
10
+ public readonly adminToken!: string;
11
+ @IsBoolean()
12
+ public readonly useTls!: boolean;
13
+ @IsBoolean()
14
+ public readonly useCPM!: boolean;
15
+ }
16
+
17
+ export const sdtdJsonSchema = {
18
+ $schema: 'http://json-schema.org/draft-07/schema#',
19
+ title: 'SdtdConnectionInfo',
20
+ type: 'object',
21
+ properties: {
22
+ host: {
23
+ type: 'string',
24
+ },
25
+ adminUser: {
26
+ type: 'string',
27
+ },
28
+ adminToken: {
29
+ type: 'string',
30
+ },
31
+ useTls: {
32
+ type: 'boolean',
33
+ },
34
+ useCPM: {
35
+ type: 'boolean',
36
+ default: false,
37
+ },
38
+ },
39
+ required: ['host', 'adminUser', 'adminToken', 'useTls'],
40
+ };