@takaro/gameserver 0.0.0-next.0da151e

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 (106) hide show
  1. package/README.md +36 -0
  2. package/dist/TakaroEmitter.d.ts +30 -0
  3. package/dist/TakaroEmitter.d.ts.map +1 -0
  4. package/dist/TakaroEmitter.js +101 -0
  5. package/dist/TakaroEmitter.js.map +1 -0
  6. package/dist/config.d.ts +9 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +13 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/gameservers/7d2d/apiResponses.d.ts +194 -0
  11. package/dist/gameservers/7d2d/apiResponses.d.ts.map +1 -0
  12. package/dist/gameservers/7d2d/apiResponses.js +2 -0
  13. package/dist/gameservers/7d2d/apiResponses.js.map +1 -0
  14. package/dist/gameservers/7d2d/connectionInfo.d.ts +38 -0
  15. package/dist/gameservers/7d2d/connectionInfo.d.ts.map +1 -0
  16. package/dist/gameservers/7d2d/connectionInfo.js +66 -0
  17. package/dist/gameservers/7d2d/connectionInfo.js.map +1 -0
  18. package/dist/gameservers/7d2d/emitter.d.ts +32 -0
  19. package/dist/gameservers/7d2d/emitter.d.ts.map +1 -0
  20. package/dist/gameservers/7d2d/emitter.js +273 -0
  21. package/dist/gameservers/7d2d/emitter.js.map +1 -0
  22. package/dist/gameservers/7d2d/index.d.ts +34 -0
  23. package/dist/gameservers/7d2d/index.d.ts.map +1 -0
  24. package/dist/gameservers/7d2d/index.js +304 -0
  25. package/dist/gameservers/7d2d/index.js.map +1 -0
  26. package/dist/gameservers/7d2d/itemWorker.d.ts +2 -0
  27. package/dist/gameservers/7d2d/itemWorker.d.ts.map +1 -0
  28. package/dist/gameservers/7d2d/itemWorker.js +36 -0
  29. package/dist/gameservers/7d2d/itemWorker.js.map +1 -0
  30. package/dist/gameservers/7d2d/items-7d2d.json +25051 -0
  31. package/dist/gameservers/7d2d/sdtdAPIClient.d.ts +19 -0
  32. package/dist/gameservers/7d2d/sdtdAPIClient.d.ts.map +1 -0
  33. package/dist/gameservers/7d2d/sdtdAPIClient.js +57 -0
  34. package/dist/gameservers/7d2d/sdtdAPIClient.js.map +1 -0
  35. package/dist/gameservers/generic/connectionInfo.d.ts +16 -0
  36. package/dist/gameservers/generic/connectionInfo.d.ts.map +1 -0
  37. package/dist/gameservers/generic/connectionInfo.js +29 -0
  38. package/dist/gameservers/generic/connectionInfo.js.map +1 -0
  39. package/dist/gameservers/generic/connectorClient.d.ts +7 -0
  40. package/dist/gameservers/generic/connectorClient.d.ts.map +1 -0
  41. package/dist/gameservers/generic/connectorClient.js +60 -0
  42. package/dist/gameservers/generic/connectorClient.js.map +1 -0
  43. package/dist/gameservers/generic/emitter.d.ts +13 -0
  44. package/dist/gameservers/generic/emitter.d.ts.map +1 -0
  45. package/dist/gameservers/generic/emitter.js +31 -0
  46. package/dist/gameservers/generic/emitter.js.map +1 -0
  47. package/dist/gameservers/generic/index.d.ts +36 -0
  48. package/dist/gameservers/generic/index.d.ts.map +1 -0
  49. package/dist/gameservers/generic/index.js +170 -0
  50. package/dist/gameservers/generic/index.js.map +1 -0
  51. package/dist/gameservers/rust/connectionInfo.d.ts +29 -0
  52. package/dist/gameservers/rust/connectionInfo.d.ts.map +1 -0
  53. package/dist/gameservers/rust/connectionInfo.js +51 -0
  54. package/dist/gameservers/rust/connectionInfo.js.map +1 -0
  55. package/dist/gameservers/rust/emitter.d.ts +32 -0
  56. package/dist/gameservers/rust/emitter.d.ts.map +1 -0
  57. package/dist/gameservers/rust/emitter.js +160 -0
  58. package/dist/gameservers/rust/emitter.js.map +1 -0
  59. package/dist/gameservers/rust/index.d.ts +35 -0
  60. package/dist/gameservers/rust/index.d.ts.map +1 -0
  61. package/dist/gameservers/rust/index.js +217 -0
  62. package/dist/gameservers/rust/index.js.map +1 -0
  63. package/dist/gameservers/rust/items-rust.json +20771 -0
  64. package/dist/getGame.d.ts +10 -0
  65. package/dist/getGame.d.ts.map +1 -0
  66. package/dist/getGame.js +27 -0
  67. package/dist/getGame.js.map +1 -0
  68. package/dist/interfaces/GameServer.d.ts +99 -0
  69. package/dist/interfaces/GameServer.d.ts.map +1 -0
  70. package/dist/interfaces/GameServer.js +235 -0
  71. package/dist/interfaces/GameServer.js.map +1 -0
  72. package/dist/main.d.ts +12 -0
  73. package/dist/main.d.ts.map +1 -0
  74. package/dist/main.js +12 -0
  75. package/dist/main.js.map +1 -0
  76. package/package.json +16 -0
  77. package/src/TakaroEmitter.ts +146 -0
  78. package/src/TakaroEmitter.unit.test.ts +201 -0
  79. package/src/__tests__/gameEventEmitter.test.ts +29 -0
  80. package/src/config.ts +20 -0
  81. package/src/gameservers/7d2d/__tests__/7d2dActions.unit.test.ts +96 -0
  82. package/src/gameservers/7d2d/__tests__/7d2dEventDetection.unit.test.ts +424 -0
  83. package/src/gameservers/7d2d/apiResponses.ts +213 -0
  84. package/src/gameservers/7d2d/connectionInfo.ts +46 -0
  85. package/src/gameservers/7d2d/emitter.ts +334 -0
  86. package/src/gameservers/7d2d/emitter.unit.test.ts +117 -0
  87. package/src/gameservers/7d2d/index.ts +367 -0
  88. package/src/gameservers/7d2d/itemWorker.ts +41 -0
  89. package/src/gameservers/7d2d/items-7d2d.json +25051 -0
  90. package/src/gameservers/7d2d/sdtdAPIClient.ts +82 -0
  91. package/src/gameservers/generic/connectionInfo.ts +19 -0
  92. package/src/gameservers/generic/connectorClient.ts +73 -0
  93. package/src/gameservers/generic/emitter.ts +36 -0
  94. package/src/gameservers/generic/index.ts +193 -0
  95. package/src/gameservers/rust/__tests__/rustActions.unit.test.ts +141 -0
  96. package/src/gameservers/rust/connectionInfo.ts +35 -0
  97. package/src/gameservers/rust/emitter.ts +198 -0
  98. package/src/gameservers/rust/emitter.unit.test.ts +95 -0
  99. package/src/gameservers/rust/index.ts +270 -0
  100. package/src/gameservers/rust/items-rust.json +20771 -0
  101. package/src/getGame.ts +34 -0
  102. package/src/interfaces/GameServer.ts +215 -0
  103. package/src/main.ts +16 -0
  104. package/tsconfig.build.json +9 -0
  105. package/tsconfig.json +9 -0
  106. package/typedoc.json +3 -0
@@ -0,0 +1,19 @@
1
+ import { AxiosResponse } from 'axios';
2
+ import { SdtdConnectionInfo } from './connectionInfo.js';
3
+ import { CommandResponse, InventoryResponse, OnlinePlayerResponse, PlayerLocation, StatsResponse } from './apiResponses.js';
4
+ import { MapInfoDTO } from '../../main.js';
5
+ export declare class SdtdApiClient {
6
+ private config;
7
+ private client;
8
+ private log;
9
+ constructor(config: SdtdConnectionInfo);
10
+ private get url();
11
+ getStats(): Promise<AxiosResponse<StatsResponse>>;
12
+ executeConsoleCommand(command: string): Promise<AxiosResponse<CommandResponse>>;
13
+ getPlayersLocation(): Promise<AxiosResponse<Array<PlayerLocation>>>;
14
+ getOnlinePlayers(): Promise<AxiosResponse<Array<OnlinePlayerResponse>>>;
15
+ getPlayerInventory(id: string): Promise<AxiosResponse<InventoryResponse>>;
16
+ getMapInfo(): Promise<MapInfoDTO>;
17
+ getMapTile(x: number, y: number, z: number): Promise<string>;
18
+ }
19
+ //# sourceMappingURL=sdtdAPIClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdtdAPIClient.d.ts","sourceRoot":"","sources":["../../../src/gameservers/7d2d/sdtdAPIClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,aAAa,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,aAAa,EACd,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,qBAAa,aAAa;IAIZ,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,GAAG,CAAsB;gBAEb,MAAM,EAAE,kBAAkB;IAqB9C,OAAO,KAAK,GAAG,GAEd;IAEK,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAIjD,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IAI/E,kBAAkB,IAAI,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;IAInE,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAIvE,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAIzE,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC;IAajC,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAOnE"}
@@ -0,0 +1,57 @@
1
+ import { addCounterToAxios, createAxios, logger } from '@takaro/util';
2
+ import { MapInfoDTO } from '../../main.js';
3
+ export class SdtdApiClient {
4
+ constructor(config) {
5
+ this.config = config;
6
+ this.log = logger('7d2d:api');
7
+ this.client = createAxios({
8
+ baseURL: this.url,
9
+ }, { logger: this.log });
10
+ addCounterToAxios(this.client, {
11
+ name: 'sdtd_api_requests_total',
12
+ help: 'Total number of requests to the 7D2D API',
13
+ });
14
+ this.client.interceptors.request.use((req) => {
15
+ req.headers['X-SDTD-API-TOKENNAME'] = config.adminUser;
16
+ req.headers['X-SDTD-API-SECRET'] = config.adminToken;
17
+ return req;
18
+ });
19
+ }
20
+ get url() {
21
+ return `${this.config.useTls ? 'https' : 'http'}://${this.config.host}`;
22
+ }
23
+ async getStats() {
24
+ return this.client.get('/api/getstats');
25
+ }
26
+ async executeConsoleCommand(command) {
27
+ return this.client.get(`/api/executeconsolecommand?command=${command}`);
28
+ }
29
+ async getPlayersLocation() {
30
+ return this.client.get('/api/getplayerslocation');
31
+ }
32
+ async getOnlinePlayers() {
33
+ return this.client.get('/api/getplayersonline');
34
+ }
35
+ async getPlayerInventory(id) {
36
+ return this.client.get(`/api/getplayerinventory?userid=${id}`);
37
+ }
38
+ async getMapInfo() {
39
+ const res = await this.client.get('/api/map/config');
40
+ return new MapInfoDTO({
41
+ enabled: res.data.data.enabled,
42
+ mapBlockSize: res.data.data.mapBlockSize,
43
+ maxZoom: res.data.data.maxZoom,
44
+ mapSizeX: res.data.data.mapSize.x,
45
+ mapSizeY: res.data.data.mapSize.y,
46
+ mapSizeZ: res.data.data.mapSize.z,
47
+ });
48
+ }
49
+ async getMapTile(x, y, z) {
50
+ const res = await this.client.get(`/map/${z}/${x}/${y}.png?t=${Date.now() / 1000}`, {
51
+ responseType: 'arraybuffer',
52
+ });
53
+ // Convert to b64
54
+ return Buffer.from(res.data, 'binary').toString('base64');
55
+ }
56
+ }
57
+ //# sourceMappingURL=sdtdAPIClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdtdAPIClient.js","sourceRoot":"","sources":["../../../src/gameservers/7d2d/sdtdAPIClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { TakaroDTO } from '@takaro/util';
2
+ export declare class GenericConnectionInfo extends TakaroDTO<GenericConnectionInfo> {
3
+ identityToken: string;
4
+ }
5
+ export declare const genericJsonSchema: {
6
+ $schema: string;
7
+ title: string;
8
+ type: string;
9
+ properties: {
10
+ identityToken: {
11
+ type: string;
12
+ };
13
+ };
14
+ required: string[];
15
+ };
16
+ //# sourceMappingURL=connectionInfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectionInfo.d.ts","sourceRoot":"","sources":["../../../src/gameservers/generic/connectionInfo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,qBAAa,qBAAsB,SAAQ,SAAS,CAAC,qBAAqB,CAAC;IAElE,aAAa,EAAE,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;CAU7B,CAAC"}
@@ -0,0 +1,29 @@
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 } from 'class-validator';
11
+ import { TakaroDTO } from '@takaro/util';
12
+ export class GenericConnectionInfo extends TakaroDTO {
13
+ }
14
+ __decorate([
15
+ IsString(),
16
+ __metadata("design:type", String)
17
+ ], GenericConnectionInfo.prototype, "identityToken", void 0);
18
+ export const genericJsonSchema = {
19
+ $schema: 'http://json-schema.org/draft-07/schema#',
20
+ title: 'GenericConnectionInfo',
21
+ type: 'object',
22
+ properties: {
23
+ identityToken: {
24
+ type: 'string',
25
+ },
26
+ },
27
+ required: ['identityToken'],
28
+ };
29
+ //# sourceMappingURL=connectionInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectionInfo.js","sourceRoot":"","sources":["../../../src/gameservers/generic/connectionInfo.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,OAAO,qBAAsB,SAAQ,SAAgC;CAG1E;AADQ;IADN,QAAQ,EAAE;;4DACkB;AAG/B,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,OAAO,EAAE,yCAAyC;IAClD,KAAK,EAAE,uBAAuB;IAC9B,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,aAAa,EAAE;YACb,IAAI,EAAE,QAAQ;SACf;KACF;IACD,QAAQ,EAAE,CAAC,eAAe,CAAC;CAC5B,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare class TakaroConnector {
2
+ private client;
3
+ constructor();
4
+ requestFromServer(id: string, operation: string, data: string): Promise<any>;
5
+ resetConnection(id: string): Promise<any>;
6
+ }
7
+ //# sourceMappingURL=connectorClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectorClient.d.ts","sourceRoot":"","sources":["../../../src/gameservers/generic/connectorClient.ts"],"names":[],"mappings":"AA6BA,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAgB;;IAKxB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAsB5E,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAehD"}
@@ -0,0 +1,60 @@
1
+ import { isAxiosError } from 'axios';
2
+ import { config } from '../../config.js';
3
+ import { errors, logger, createAxios } from '@takaro/util';
4
+ function getConnectorClient() {
5
+ const log = logger('client:connector');
6
+ const connectorClient = createAxios({
7
+ baseURL: config.get('connector.host'),
8
+ headers: {
9
+ 'Content-Type': 'application/json',
10
+ 'User-Agent': 'Takaro',
11
+ },
12
+ }, { logger: log });
13
+ // Add custom interceptor for operation logging
14
+ connectorClient.interceptors.request.use((request) => {
15
+ if (request.data?.operation) {
16
+ log.debug(`Operation: ${request.data.operation}`);
17
+ }
18
+ return request;
19
+ });
20
+ return connectorClient;
21
+ }
22
+ export class TakaroConnector {
23
+ constructor() {
24
+ this.client = getConnectorClient();
25
+ }
26
+ async requestFromServer(id, operation, data) {
27
+ try {
28
+ const res = await this.client.post(`/gameserver/${id}/request`, { operation, data });
29
+ return res.data.data;
30
+ }
31
+ catch (error) {
32
+ if (isAxiosError(error)) {
33
+ if (error.response?.data.meta.error.code === 'ValidationError') {
34
+ throw new errors.BadRequestError('The gameserver responded with bad data, please verify that the mod is up to date.');
35
+ }
36
+ if (error.response?.status) {
37
+ if (error.response?.status >= 400 && error.response?.status < 500) {
38
+ throw new errors.BadRequestError(error.response?.data.meta.error.message);
39
+ }
40
+ }
41
+ }
42
+ throw error;
43
+ }
44
+ }
45
+ async resetConnection(id) {
46
+ try {
47
+ await this.client.post(`/gameserver/${id}/reset`);
48
+ return;
49
+ }
50
+ catch (error) {
51
+ if (isAxiosError(error)) {
52
+ if (error.response?.data.meta.error.code === 'ValidationError') {
53
+ throw new errors.BadRequestError('The gameserver responded with bad data, please verify that the mod is up to date.');
54
+ }
55
+ }
56
+ throw error;
57
+ }
58
+ }
59
+ }
60
+ //# sourceMappingURL=connectorClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectorClient.js","sourceRoot":"","sources":["../../../src/gameservers/generic/connectorClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3D,SAAS,kBAAkB;IACzB,MAAM,GAAG,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAEvC,MAAM,eAAe,GAAG,WAAW,CACjC;QACE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACrC,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,YAAY,EAAE,QAAQ;SACvB;KACF,EACD,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;IAEF,+CAA+C;IAC/C,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACnD,IAAI,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;YAC5B,GAAG,CAAC,KAAK,CAAC,cAAc,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,OAAO,eAAe;IAE1B;QACE,IAAI,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,EAAU,EAAE,SAAiB,EAAE,IAAY;QACjE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACrF,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,IAAI,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;oBAC/D,MAAM,IAAI,MAAM,CAAC,eAAe,CAC9B,mFAAmF,CACpF,CAAC;gBACJ,CAAC;gBAED,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;oBAC3B,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC;wBAClE,MAAM,IAAI,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAC5E,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,EAAU;QAC9B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,IAAI,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;oBAC/D,MAAM,IAAI,MAAM,CAAC,eAAe,CAC9B,mFAAmF,CACpF,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import { GenericConnectionInfo } from './connectionInfo.js';
2
+ import { TakaroEmitter } from '../../TakaroEmitter.js';
3
+ import { GameEventTypes } from '@takaro/modules';
4
+ export declare class GenericEmitter extends TakaroEmitter {
5
+ private config;
6
+ private scopedListener;
7
+ constructor(config: GenericConnectionInfo);
8
+ start(): Promise<void>;
9
+ stop(): Promise<void>;
10
+ get listener(): (event: GameEventTypes, args: any) => Promise<void>;
11
+ private privateListener;
12
+ }
13
+ //# sourceMappingURL=emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../../src/gameservers/generic/emitter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAgB,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAG/D,qBAAa,cAAe,SAAQ,aAAa;IAGnC,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,cAAc,CAAmC;gBAErC,MAAM,EAAE,qBAAqB;IAI3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,IAAI,QAAQ,YAIyB,cAAc,QAAQ,GAAG,mBAF7D;YAEa,eAAe;CAU9B"}
@@ -0,0 +1,31 @@
1
+ import { logger } from '@takaro/util';
2
+ import { TakaroEmitter } from '../../TakaroEmitter.js';
3
+ import { EventMapping } from '@takaro/modules';
4
+ const log = logger('Generic');
5
+ export class GenericEmitter extends TakaroEmitter {
6
+ constructor(config) {
7
+ super();
8
+ this.config = config;
9
+ this.scopedListener = this.privateListener.bind(this);
10
+ }
11
+ async start() {
12
+ // No-op, generic connectors initiate the connection
13
+ }
14
+ async stop() {
15
+ // No-op, generic connectors initiate the connection
16
+ }
17
+ get listener() {
18
+ return this.scopedListener;
19
+ }
20
+ async privateListener(event, args) {
21
+ log.debug(`Transmitting event ${event}`);
22
+ const dto = EventMapping[event];
23
+ if (dto) {
24
+ this.emit(event, new dto(args));
25
+ }
26
+ else {
27
+ this.emit(event, args);
28
+ }
29
+ }
30
+ }
31
+ //# sourceMappingURL=emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../../src/gameservers/generic/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAkB,MAAM,iBAAiB,CAAC;AAE/D,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAC9B,MAAM,OAAO,cAAe,SAAQ,aAAa;IAG/C,YAAoB,MAA6B;QAC/C,KAAK,EAAE,CAAC;QADU,WAAM,GAAN,MAAM,CAAuB;QAFzC,mBAAc,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAIzD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,oDAAoD;IACtD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,oDAAoD;IACtD,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,KAAqB,EAAE,IAAS;QAC5D,GAAG,CAAC,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAEhC,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,36 @@
1
+ import { IGamePlayer, IPosition } from '@takaro/modules';
2
+ import { BanDTO, CommandOutput, IEntityDTO, IGameServer, IItemDTO, ILocationDTO, IMessageOptsDTO, IPlayerReferenceDTO, MapInfoDTO, TestReachabilityOutputDTO } from '../../interfaces/GameServer.js';
3
+ import { Settings } from '@takaro/apiclient';
4
+ import { GenericConnectionInfo } from './connectionInfo.js';
5
+ import { GenericEmitter } from './emitter.js';
6
+ export declare class Generic implements IGameServer {
7
+ private settings;
8
+ private gameServerId;
9
+ private logger;
10
+ connectionInfo: GenericConnectionInfo;
11
+ emitter: GenericEmitter;
12
+ private takaroConnector;
13
+ constructor(config: GenericConnectionInfo, settings: Partial<Settings>, gameServerId: string);
14
+ getEventEmitter(): GenericEmitter;
15
+ private requestFromServer;
16
+ getPlayer(rawPlayer: IPlayerReferenceDTO): Promise<IGamePlayer | null>;
17
+ getPlayers(): Promise<IGamePlayer[]>;
18
+ getPlayerLocation(rawPlayer: IPlayerReferenceDTO): Promise<IPosition | null>;
19
+ testReachability(): Promise<TestReachabilityOutputDTO>;
20
+ executeConsoleCommand(rawCommand: string): Promise<CommandOutput>;
21
+ sendMessage(message: string, opts?: IMessageOptsDTO): Promise<void>;
22
+ teleportPlayer(player: IGamePlayer, x: number, y: number, z: number, dimension?: string): Promise<void>;
23
+ kickPlayer(player: IGamePlayer, reason: string): Promise<void>;
24
+ banPlayer(options: BanDTO): Promise<void>;
25
+ unbanPlayer(player: IGamePlayer): Promise<void>;
26
+ listBans(): Promise<BanDTO[]>;
27
+ giveItem(rawPlayer: IPlayerReferenceDTO, item: string, amount: number, quality: string): Promise<void>;
28
+ listItems(): Promise<IItemDTO[]>;
29
+ getPlayerInventory(rawPlayer: IPlayerReferenceDTO): Promise<IItemDTO[]>;
30
+ shutdown(): Promise<void>;
31
+ getMapInfo(): Promise<MapInfoDTO>;
32
+ getMapTile(_x: number, _y: number, _z: number): Promise<string>;
33
+ listEntities(): Promise<IEntityDTO[]>;
34
+ listLocations(): Promise<ILocationDTO[]>;
35
+ }
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/gameservers/generic/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EACL,MAAM,EACN,aAAa,EACb,UAAU,EACV,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,UAAU,EACV,yBAAyB,EAC1B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,qBACa,OAAQ,YAAW,WAAW;IAQvC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,YAAY;IARtB,OAAO,CAAC,MAAM,CAAqB;IACnC,cAAc,EAAE,qBAAqB,CAAC;IACtC,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,CAAC,eAAe,CAAyB;gBAG9C,MAAM,EAAE,qBAAqB,EACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAM,EAChC,YAAY,EAAE,MAAM;IAM9B,eAAe;YAID,iBAAiB;IAWzB,SAAS,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAStE,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IASpC,iBAAiB,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAS5E,gBAAgB,IAAI,OAAO,CAAC,yBAAyB,CAAC;IActD,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IASjE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe;IAQnD,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAIvF,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM;IAI9C,SAAS,CAAC,OAAO,EAAE,MAAM;IAIzB,WAAW,CAAC,MAAM,EAAE,WAAW;IAI/B,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAS7B,QAAQ,CAAC,SAAS,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAStG,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAShC,kBAAkB,CAAC,SAAS,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAUvE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzB,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC;IASjC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/D,YAAY,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IASrC,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;CAG/C"}
@@ -0,0 +1,170 @@
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 { errors, logger, traceableClass } from '@takaro/util';
11
+ import { IGamePlayer, IPosition } from '@takaro/modules';
12
+ import { BanDTO, CommandOutput, IEntityDTO, IItemDTO, IMessageOptsDTO, IPlayerReferenceDTO, MapInfoDTO, TestReachabilityOutputDTO, } from '../../interfaces/GameServer.js';
13
+ import { TakaroConnector } from './connectorClient.js';
14
+ import { GenericConnectionInfo } from './connectionInfo.js';
15
+ import { GenericEmitter } from './emitter.js';
16
+ let Generic = class Generic {
17
+ constructor(config, settings = {}, gameServerId) {
18
+ this.settings = settings;
19
+ this.gameServerId = gameServerId;
20
+ this.logger = logger('Generic');
21
+ this.takaroConnector = new TakaroConnector();
22
+ this.connectionInfo = config;
23
+ this.emitter = new GenericEmitter(config);
24
+ }
25
+ getEventEmitter() {
26
+ return this.emitter;
27
+ }
28
+ async requestFromServer(operation, data) {
29
+ if (!data)
30
+ data = {};
31
+ const resp = await this.takaroConnector.requestFromServer(this.gameServerId, operation, JSON.stringify(data));
32
+ if (resp && resp.error) {
33
+ throw new errors.BadRequestError(`Error from server: ${resp.error}`);
34
+ }
35
+ return resp;
36
+ }
37
+ async getPlayer(rawPlayer) {
38
+ const player = new IPlayerReferenceDTO({ gameId: rawPlayer.gameId });
39
+ const res = await this.requestFromServer('getPlayer', player.toJSON());
40
+ if (!res)
41
+ return null;
42
+ const dto = new IGamePlayer(res);
43
+ await dto.validate();
44
+ return dto;
45
+ }
46
+ async getPlayers() {
47
+ const res = await this.requestFromServer('getPlayers');
48
+ if (!res)
49
+ throw new errors.ValidationError('Nothing returned from server, is the server responding the right data?');
50
+ const dto = res.map((p) => new IGamePlayer(p));
51
+ await Promise.all(dto.map((p) => p.validate()));
52
+ return dto;
53
+ }
54
+ async getPlayerLocation(rawPlayer) {
55
+ const player = new IPlayerReferenceDTO({ gameId: rawPlayer.gameId });
56
+ const res = await this.requestFromServer('getPlayerLocation', player.toJSON());
57
+ if (!res)
58
+ return null;
59
+ const dto = new IPosition(res);
60
+ await dto.validate();
61
+ return dto;
62
+ }
63
+ async testReachability() {
64
+ try {
65
+ const response = await this.takaroConnector.requestFromServer(this.gameServerId, 'testReachability', '{}');
66
+ const dto = new TestReachabilityOutputDTO(response);
67
+ await dto.validate();
68
+ return dto;
69
+ }
70
+ catch (error) {
71
+ return new TestReachabilityOutputDTO({
72
+ connectable: false,
73
+ reason: error instanceof Error ? error.message : 'Unknown error occurred',
74
+ });
75
+ }
76
+ }
77
+ async executeConsoleCommand(rawCommand) {
78
+ const res = await this.requestFromServer('executeConsoleCommand', { command: rawCommand });
79
+ if (!res)
80
+ throw new errors.ValidationError('Nothing returned from server, is the server responding the right data?');
81
+ const dto = new CommandOutput(res);
82
+ await dto.validate();
83
+ return dto;
84
+ }
85
+ async sendMessage(message, opts) {
86
+ if (!opts)
87
+ opts = new IMessageOptsDTO();
88
+ await this.requestFromServer('sendMessage', {
89
+ message,
90
+ opts: opts.toJSON(),
91
+ });
92
+ }
93
+ async teleportPlayer(player, x, y, z, dimension) {
94
+ await this.requestFromServer('teleportPlayer', { player: player.toJSON(), x, y, z, dimension });
95
+ }
96
+ async kickPlayer(player, reason) {
97
+ await this.requestFromServer('kickPlayer', { player: player.toJSON(), reason });
98
+ }
99
+ async banPlayer(options) {
100
+ await this.requestFromServer('banPlayer', options.toJSON());
101
+ }
102
+ async unbanPlayer(player) {
103
+ await this.requestFromServer('unbanPlayer', player.toJSON());
104
+ }
105
+ async listBans() {
106
+ const res = await this.requestFromServer('listBans');
107
+ if (!res)
108
+ throw new errors.ValidationError('Nothing returned from server, is the server responding the right data?');
109
+ const dto = res.map((p) => new BanDTO(p));
110
+ await Promise.all(dto.map((p) => p.validate()));
111
+ return dto;
112
+ }
113
+ async giveItem(rawPlayer, item, amount, quality) {
114
+ await this.requestFromServer('giveItem', {
115
+ player: { gameId: rawPlayer.gameId },
116
+ item,
117
+ amount,
118
+ quality,
119
+ });
120
+ }
121
+ async listItems() {
122
+ const res = await this.requestFromServer('listItems');
123
+ if (!res)
124
+ throw new errors.ValidationError('Nothing returned from server, is the server responding the right data?');
125
+ const dto = res.map((p) => new IItemDTO(p));
126
+ await Promise.all(dto.map((p) => p.validate()));
127
+ return dto;
128
+ }
129
+ async getPlayerInventory(rawPlayer) {
130
+ const player = new IPlayerReferenceDTO({ gameId: rawPlayer.gameId });
131
+ const res = await this.requestFromServer('getPlayerInventory', player.toJSON());
132
+ if (!res)
133
+ throw new errors.ValidationError('Nothing returned from server, is the server responding the right data?');
134
+ const dto = res.map((p) => new IItemDTO(p));
135
+ await Promise.all(dto.map((p) => p.validate()));
136
+ return dto;
137
+ }
138
+ async shutdown() {
139
+ await this.requestFromServer('shutdown');
140
+ }
141
+ async getMapInfo() {
142
+ const res = await this.requestFromServer('getMapInfo');
143
+ if (!res)
144
+ throw new errors.ValidationError('Nothing returned from server, is the server responding the right data?');
145
+ const dto = new MapInfoDTO(res);
146
+ await dto.validate();
147
+ return dto;
148
+ }
149
+ async getMapTile(_x, _y, _z) {
150
+ const res = await this.requestFromServer('getMapTile', { x: _x, y: _y, z: _z });
151
+ return res;
152
+ }
153
+ async listEntities() {
154
+ const res = await this.requestFromServer('listEntities');
155
+ if (!res)
156
+ throw new errors.ValidationError('Nothing returned from server, is the server responding the right data?');
157
+ const dto = res.map((p) => new IEntityDTO(p));
158
+ await Promise.all(dto.map((p) => p.validate()));
159
+ return dto;
160
+ }
161
+ async listLocations() {
162
+ throw new errors.NotImplementedError();
163
+ }
164
+ };
165
+ Generic = __decorate([
166
+ traceableClass('game:generic'),
167
+ __metadata("design:paramtypes", [GenericConnectionInfo, Object, String])
168
+ ], Generic);
169
+ export { Generic };
170
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/gameservers/generic/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { TakaroDTO } from '@takaro/util';
2
+ export declare class RustConnectionInfo extends TakaroDTO<RustConnectionInfo> {
3
+ readonly host: string;
4
+ readonly rconPort: string;
5
+ readonly rconPassword: string;
6
+ readonly useTls: boolean;
7
+ }
8
+ export declare const rustJsonSchema: {
9
+ $schema: string;
10
+ title: string;
11
+ type: string;
12
+ properties: {
13
+ host: {
14
+ type: string;
15
+ };
16
+ rconPort: {
17
+ type: string;
18
+ };
19
+ rconPassword: {
20
+ type: string;
21
+ };
22
+ useTls: {
23
+ type: string;
24
+ default: boolean;
25
+ };
26
+ };
27
+ required: string[];
28
+ };
29
+ //# sourceMappingURL=connectionInfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectionInfo.d.ts","sourceRoot":"","sources":["../../../src/gameservers/rust/connectionInfo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,qBAAa,kBAAmB,SAAQ,SAAS,CAAC,kBAAkB,CAAC;IACnE,SACgB,IAAI,EAAG,MAAM,CAAC;IAC9B,SACgB,QAAQ,EAAG,MAAM,CAAC;IAClC,SACgB,YAAY,EAAG,MAAM,CAAC;IACtC,SACgB,MAAM,EAAG,OAAO,CAAC;CAClC;AAED,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;CAoB1B,CAAC"}
@@ -0,0 +1,51 @@
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, IsNumber, IsBoolean } from 'class-validator';
11
+ import { TakaroDTO } from '@takaro/util';
12
+ export class RustConnectionInfo extends TakaroDTO {
13
+ }
14
+ __decorate([
15
+ IsString(),
16
+ __metadata("design:type", String)
17
+ ], RustConnectionInfo.prototype, "host", void 0);
18
+ __decorate([
19
+ IsNumber(),
20
+ __metadata("design:type", String)
21
+ ], RustConnectionInfo.prototype, "rconPort", void 0);
22
+ __decorate([
23
+ IsString(),
24
+ __metadata("design:type", String)
25
+ ], RustConnectionInfo.prototype, "rconPassword", void 0);
26
+ __decorate([
27
+ IsBoolean(),
28
+ __metadata("design:type", Boolean)
29
+ ], RustConnectionInfo.prototype, "useTls", void 0);
30
+ export const rustJsonSchema = {
31
+ $schema: 'http://json-schema.org/draft-07/schema#',
32
+ title: 'RustConnectionInfo',
33
+ type: 'object',
34
+ properties: {
35
+ host: {
36
+ type: 'string',
37
+ },
38
+ rconPort: {
39
+ type: 'number',
40
+ },
41
+ rconPassword: {
42
+ type: 'string',
43
+ },
44
+ useTls: {
45
+ type: 'boolean',
46
+ default: false,
47
+ },
48
+ },
49
+ required: ['host', 'rconPort', 'rconPassword', 'useTls'],
50
+ };
51
+ //# sourceMappingURL=connectionInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectionInfo.js","sourceRoot":"","sources":["../../../src/gameservers/rust/connectionInfo.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,OAAO,kBAAmB,SAAQ,SAA6B;CASpE;AAPiB;IADf,QAAQ,EAAE;;gDACmB;AAEd;IADf,QAAQ,EAAE;;oDACuB;AAElB;IADf,QAAQ,EAAE;;wDAC2B;AAEtB;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,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;SACf;QACD,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;SACf;QACD,MAAM,EAAE;YACN,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,KAAK;SACf;KACF;IACD,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,CAAC;CACzD,CAAC"}
@@ -0,0 +1,32 @@
1
+ import WebSocket from 'ws';
2
+ import { RustConnectionInfo } from './connectionInfo.js';
3
+ import { TakaroEmitter } from '../../TakaroEmitter.js';
4
+ export declare enum RustEventType {
5
+ DEFAULT = "Generic",
6
+ WARNING = "Warning",
7
+ CHAT = "Chat"
8
+ }
9
+ export interface RustEvent {
10
+ Message: string;
11
+ Identifier: number;
12
+ Type: RustEventType;
13
+ Stacktrace: string;
14
+ }
15
+ export declare class RustEmitter extends TakaroEmitter {
16
+ private config;
17
+ private ws;
18
+ private log;
19
+ private boundListener;
20
+ constructor(config: RustConnectionInfo);
21
+ static getClient(config: RustConnectionInfo): Promise<WebSocket>;
22
+ start(): Promise<void>;
23
+ stop(): Promise<void>;
24
+ parseMessage(e: RustEvent): Promise<void>;
25
+ private handlePlayerConnected;
26
+ private handlePlayerDisconnected;
27
+ private handleChatMessage;
28
+ private handlePlayerDeath;
29
+ private handleEntityKilled;
30
+ listener(data: string): Promise<void>;
31
+ }
32
+ //# sourceMappingURL=emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../../src/gameservers/rust/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAE3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAavD,oBAAY,aAAa;IACvB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,IAAI,SAAS;CACd;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAUD,qBAAa,WAAY,SAAQ,aAAa;IAKhC,OAAO,CAAC,MAAM;IAJ1B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,aAAa,CAA8C;gBAE/C,MAAM,EAAE,kBAAkB;WAIjC,SAAS,CAAC,MAAM,EAAE,kBAAkB;IAsC3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB,YAAY,CAAC,CAAC,EAAE,SAAS;YA4CjB,qBAAqB;YAQrB,wBAAwB;YAQxB,iBAAiB;YAYjB,iBAAiB;YAWjB,kBAAkB;IAQ1B,QAAQ,CAAC,IAAI,EAAE,MAAM;CAS5B"}