@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
|
@@ -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
|
+
};
|