moons-ta-client 1.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/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "moons-ta-client",
3
+ "version": "1.0.1",
4
+ "type": "module",
5
+ "main": "./dist/index.esm.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "node": "./dist/index.js",
10
+ "default": "./dist/index.esm.js"
11
+ }
12
+ },
13
+ "scripts": {
14
+ "fix-imports": "node ./scripts/fixImports.mjs",
15
+ "build:tsc": "tsc",
16
+ "build:bundle": "node ./scripts/esbuild.mjs",
17
+ "build:bundle-dts": "rollup -c rollup.config.mjs",
18
+ "build": "npm run fix-imports && npm run build:tsc && npm run build:bundle && npm run build:bundle-dts"
19
+ },
20
+ "devDependencies": {
21
+ "@types/events": "^3.0.0",
22
+ "@types/uuid": "^8.3.4",
23
+ "@types/ws": "^8.5.10",
24
+ "esbuild": "^0.19.12",
25
+ "esbuild-plugin-polyfill-node": "^0.3.0",
26
+ "esbuild-plugin-globals": "^0.2.0",
27
+ "rollup": "^4.17.2",
28
+ "rollup-plugin-dts": "^6.1.1",
29
+ "tslib": "^2.3.1",
30
+ "typescript": "^4.5.4"
31
+ },
32
+ "dependencies": {
33
+ "@protobuf-ts/plugin": "^2.6.0",
34
+ "events": "^3.3.0",
35
+ "install": "^0.13.0",
36
+ "npm": "^10.8.0",
37
+ "uuid": "^9.0.0",
38
+ "ws": "^8.17.0"
39
+ }
40
+ }
@@ -0,0 +1,16 @@
1
+ import dts from 'rollup-plugin-dts';
2
+ import path from 'path';
3
+ import { join } from 'path';
4
+ import { fileURLToPath } from 'url';
5
+
6
+ const __filename = fileURLToPath(import.meta.url); // get the resolved path to the file
7
+ const __dirname = path.dirname(__filename); // get the name of the directory
8
+
9
+ export default {
10
+ input: join(__dirname, './dist/index.d.ts'), // Entry point of your type definitions
11
+ output: {
12
+ file: join(__dirname, './dist/index.d.ts'), // Output file
13
+ format: 'es'
14
+ },
15
+ plugins: [dts()]
16
+ };
@@ -0,0 +1,24 @@
1
+ /* eslint-disable @typescript-eslint/no-var-requires */
2
+ import pkg from '../package.json' assert { type: 'json' };
3
+ import esbuild from 'esbuild';
4
+ import GlobalsPlugin from 'esbuild-plugin-globals';
5
+ import { polyfillNode } from "esbuild-plugin-polyfill-node";
6
+
7
+ esbuild.build({
8
+ entryPoints: ['src/index.ts'],
9
+ bundle: true,
10
+ outfile: pkg.exports['.'].default,
11
+ globalName: 'TournamentAssistantClient',
12
+ platform: 'browser',
13
+ define: {
14
+ global: 'window',
15
+ },
16
+ target: ['chrome80'],
17
+ format: 'esm',
18
+ plugins: [
19
+ GlobalsPlugin({
20
+ ws: 'WebSocket',
21
+ }),
22
+ polyfillNode(),
23
+ ],
24
+ });
@@ -0,0 +1,44 @@
1
+ import fs from 'fs';
2
+ import path from 'path'
3
+ import { fileURLToPath } from 'url';
4
+
5
+ const __filename = fileURLToPath(import.meta.url); // get the resolved path to the file
6
+ const __dirname = path.dirname(__filename); // get the name of the directory
7
+ const directoryPath = path.join(__dirname, '../src/models');
8
+
9
+ fs.readdir(directoryPath, (err, files) => {
10
+ if (err) {
11
+ return console.error('Unable to scan directory: ' + err);
12
+ }
13
+
14
+ files.forEach((file) => {
15
+ const filePath = path.join(directoryPath, file);
16
+
17
+ fs.readFile(filePath, 'utf8', (err, data) => {
18
+ if (err) {
19
+ return console.error('Unable to read file: ' + err);
20
+ }
21
+
22
+ const updatedData = data
23
+ .replace(/import\s+(.*?)\s+from\s+['"](\.\/.+?)['"]/g, (match, p1, p2) => {
24
+ if (!p2.endsWith('.js')) {
25
+ return `import ${p1} from '${p2}.js'`;
26
+ }
27
+ return match;
28
+ })
29
+ .replace(/export\s+.*?from\s+['"](\.\/.+?)['"]/g, (match, p1) => {
30
+ if (!p1.endsWith('.js')) {
31
+ return match.replace(p1, `${p1}.js`);
32
+ }
33
+ return match;
34
+ });
35
+
36
+ fs.writeFile(filePath, updatedData, 'utf8', (err) => {
37
+ if (err) {
38
+ return console.error('Unable to write file: ' + err);
39
+ }
40
+ console.log(`Updated file: ${filePath}`);
41
+ });
42
+ });
43
+ });
44
+ });
package/src/client.ts ADDED
@@ -0,0 +1,101 @@
1
+ import { CustomEventEmitter } from "./custom-event-emitter.js";
2
+ import { Packet, ForwardingPacket } from "./models/packets.js";
3
+ import WebSocket from "ws";
4
+
5
+ // Created by Moon on 6/11/2022
6
+
7
+ export type ClientEvents = {
8
+ packetReceived: Packet;
9
+ connectedToServer: {};
10
+ failedToConnectToServer: {};
11
+ disconnectedFromServer: {};
12
+ };
13
+
14
+ export class Client extends CustomEventEmitter<ClientEvents> {
15
+ private address: string;
16
+ private port: string;
17
+ private token: string;
18
+ private websocket: WebSocket | undefined;
19
+ private websocketWasConnected = false;
20
+
21
+ constructor(address: string, port: string, token?: string) {
22
+ super();
23
+ this.address = address;
24
+ this.port = port;
25
+ this.token = token ?? "";
26
+ }
27
+
28
+ public get isConnected() {
29
+ return this.websocket?.readyState === WebSocket.OPEN;
30
+ }
31
+
32
+ public get readyState() {
33
+ return this.websocket?.readyState;
34
+ }
35
+
36
+ public connect() {
37
+ this.websocket = new WebSocket(`wss://${this.address}:${this.port}`);
38
+ this.websocket.binaryType = "arraybuffer";
39
+
40
+ if (!this.websocket) {
41
+ this.emit("failedToConnectToServer", {});
42
+ return;
43
+ }
44
+
45
+ this.websocket.onopen = () => {
46
+ this.websocketWasConnected = true;
47
+ this.emit("connectedToServer", {});
48
+ };
49
+
50
+ this.websocket.onmessage = (event) => {
51
+ if (event.data instanceof ArrayBuffer) {
52
+ const packet = Packet.fromBinary(new Uint8Array(event.data));
53
+ this.emit("packetReceived", packet);
54
+ }
55
+ };
56
+
57
+ this.websocket.onclose = () => {
58
+ if (this.websocketWasConnected) {
59
+ this.emit("disconnectedFromServer", {});
60
+ } else {
61
+ this.emit("failedToConnectToServer", {});
62
+ }
63
+ };
64
+
65
+ this.websocket.onerror = (error) => {
66
+ console.error(error);
67
+ };
68
+ }
69
+
70
+ public disconnect() {
71
+ this.websocket?.close();
72
+ }
73
+
74
+ public setToken(token: string) {
75
+ this.token = token;
76
+ }
77
+
78
+ public send(packet: Packet, ids?: string[]): void {
79
+ let toSend = packet;
80
+ toSend.token = this.token;
81
+
82
+ if (ids) {
83
+ const toForward: ForwardingPacket = {
84
+ packet,
85
+ forwardTo: ids,
86
+ };
87
+
88
+ toSend = {
89
+ token: this.token,
90
+ from: packet.from,
91
+ id: packet.id,
92
+ packet: {
93
+ oneofKind: "forwardingPacket",
94
+ forwardingPacket: toForward,
95
+ },
96
+ };
97
+ }
98
+
99
+ this.websocket?.send(Packet.toBinary(toSend));
100
+ }
101
+ }
@@ -0,0 +1,4 @@
1
+ export const masterAddress = "server.tournamentassistant.net";
2
+ export const masterPort = "8676";
3
+ export const version = "1.0.7";
4
+ export const versionCode = 107;
@@ -0,0 +1,21 @@
1
+ import { EventEmitter } from 'events';
2
+
3
+ export class CustomEventEmitter<T extends Record<string, any>> {
4
+ private emitter = new EventEmitter();
5
+
6
+ public get on(): <K extends Extract<keyof T, string | symbol>>(eventName: K, fn: (params: T[K]) => void) => void {
7
+ return this.emitter.on.bind(this.emitter);
8
+ }
9
+
10
+ public get once(): <K extends Extract<keyof T, string | symbol>>(eventName: K, fn: (params: T[K]) => void) => void {
11
+ return this.emitter.once.bind(this.emitter);
12
+ }
13
+
14
+ public get emit(): <K extends Extract<keyof T, string | symbol>>(eventName: K, params: T[K]) => void {
15
+ return this.emitter.emit.bind(this.emitter);
16
+ }
17
+
18
+ public get removeListener(): <K extends Extract<keyof T, string | symbol>>(eventName: K, fn: (params: T[K]) => void) => void {
19
+ return this.emitter.removeListener.bind(this.emitter);
20
+ }
21
+ }
package/src/index.ts ADDED
@@ -0,0 +1,4 @@
1
+ export * from "./tournament-assistant-client.js";
2
+ export * from "./custom-event-emitter.js";
3
+ export * from "./models/index.js";
4
+ export * from "./constants.js";
@@ -0,0 +1,303 @@
1
+ // @generated by protobuf-ts 2.8.2
2
+ // @generated from protobuf file "commands.proto" (package "proto.packets", syntax proto3)
3
+ // tslint:disable
4
+ import type { BinaryWriteOptions } from "@protobuf-ts/runtime";
5
+ import type { IBinaryWriter } from "@protobuf-ts/runtime";
6
+ import { WireType } from "@protobuf-ts/runtime";
7
+ import type { BinaryReadOptions } from "@protobuf-ts/runtime";
8
+ import type { IBinaryReader } from "@protobuf-ts/runtime";
9
+ import { UnknownFieldHandler } from "@protobuf-ts/runtime";
10
+ import type { PartialMessage } from "@protobuf-ts/runtime";
11
+ import { reflectionMergePartial } from "@protobuf-ts/runtime";
12
+ import { MESSAGE_TYPE } from "@protobuf-ts/runtime";
13
+ import { MessageType } from "@protobuf-ts/runtime";
14
+ import { Channel } from './discord.js';
15
+ import { GameplayParameters } from './models.js';
16
+ /**
17
+ * ---- Commands (DO something!) ---- //
18
+ *
19
+ * @generated from protobuf message proto.packets.Command
20
+ */
21
+ export interface Command {
22
+ /**
23
+ * @generated from protobuf oneof: type
24
+ */
25
+ type: {
26
+ oneofKind: "heartbeat";
27
+ /**
28
+ * @generated from protobuf field: bool heartbeat = 1;
29
+ */
30
+ heartbeat: boolean; // Is this really a command?
31
+ } | {
32
+ oneofKind: "returnToMenu";
33
+ /**
34
+ * @generated from protobuf field: bool return_to_menu = 2;
35
+ */
36
+ returnToMenu: boolean;
37
+ } | {
38
+ oneofKind: "delayTestFinish";
39
+ /**
40
+ * @generated from protobuf field: bool delay_test_finish = 3;
41
+ */
42
+ delayTestFinish: boolean;
43
+ } | {
44
+ oneofKind: "streamSyncShowImage";
45
+ /**
46
+ * @generated from protobuf field: bool stream_sync_show_image = 4;
47
+ */
48
+ streamSyncShowImage: boolean;
49
+ } | {
50
+ oneofKind: "playSong";
51
+ /**
52
+ * @generated from protobuf field: proto.packets.Command.PlaySong play_song = 6;
53
+ */
54
+ playSong: Command_PlaySong;
55
+ } | {
56
+ oneofKind: "sendBotMessage";
57
+ /**
58
+ * @generated from protobuf field: proto.packets.Command.SendBotMessage send_bot_message = 7;
59
+ */
60
+ sendBotMessage: Command_SendBotMessage;
61
+ } | {
62
+ oneofKind: "discordAuthorize";
63
+ /**
64
+ * @generated from protobuf field: string discord_authorize = 9;
65
+ */
66
+ discordAuthorize: string;
67
+ } | {
68
+ oneofKind: undefined;
69
+ };
70
+ }
71
+ /**
72
+ * @generated from protobuf message proto.packets.Command.PlaySong
73
+ */
74
+ export interface Command_PlaySong {
75
+ /**
76
+ * @generated from protobuf field: proto.models.GameplayParameters gameplay_parameters = 1;
77
+ */
78
+ gameplayParameters?: GameplayParameters;
79
+ }
80
+ /**
81
+ * @generated from protobuf message proto.packets.Command.SendBotMessage
82
+ */
83
+ export interface Command_SendBotMessage {
84
+ /**
85
+ * @generated from protobuf field: proto.discord.Channel channel = 1;
86
+ */
87
+ channel?: Channel;
88
+ /**
89
+ * @generated from protobuf field: string message = 2;
90
+ */
91
+ message: string;
92
+ }
93
+ // @generated message type with reflection information, may provide speed optimized methods
94
+ class Command$Type extends MessageType<Command> {
95
+ constructor() {
96
+ super("proto.packets.Command", [
97
+ { no: 1, name: "heartbeat", kind: "scalar", oneof: "type", T: 8 /*ScalarType.BOOL*/ },
98
+ { no: 2, name: "return_to_menu", kind: "scalar", oneof: "type", T: 8 /*ScalarType.BOOL*/ },
99
+ { no: 3, name: "delay_test_finish", kind: "scalar", oneof: "type", T: 8 /*ScalarType.BOOL*/ },
100
+ { no: 4, name: "stream_sync_show_image", kind: "scalar", oneof: "type", T: 8 /*ScalarType.BOOL*/ },
101
+ { no: 6, name: "play_song", kind: "message", oneof: "type", T: () => Command_PlaySong },
102
+ { no: 7, name: "send_bot_message", kind: "message", oneof: "type", T: () => Command_SendBotMessage },
103
+ { no: 9, name: "discord_authorize", kind: "scalar", oneof: "type", T: 9 /*ScalarType.STRING*/ }
104
+ ]);
105
+ }
106
+ create(value?: PartialMessage<Command>): Command {
107
+ const message = { type: { oneofKind: undefined } };
108
+ globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this });
109
+ if (value !== undefined)
110
+ reflectionMergePartial<Command>(this, message, value);
111
+ return message;
112
+ }
113
+ internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Command): Command {
114
+ let message = target ?? this.create(), end = reader.pos + length;
115
+ while (reader.pos < end) {
116
+ let [fieldNo, wireType] = reader.tag();
117
+ switch (fieldNo) {
118
+ case /* bool heartbeat */ 1:
119
+ message.type = {
120
+ oneofKind: "heartbeat",
121
+ heartbeat: reader.bool()
122
+ };
123
+ break;
124
+ case /* bool return_to_menu */ 2:
125
+ message.type = {
126
+ oneofKind: "returnToMenu",
127
+ returnToMenu: reader.bool()
128
+ };
129
+ break;
130
+ case /* bool delay_test_finish */ 3:
131
+ message.type = {
132
+ oneofKind: "delayTestFinish",
133
+ delayTestFinish: reader.bool()
134
+ };
135
+ break;
136
+ case /* bool stream_sync_show_image */ 4:
137
+ message.type = {
138
+ oneofKind: "streamSyncShowImage",
139
+ streamSyncShowImage: reader.bool()
140
+ };
141
+ break;
142
+ case /* proto.packets.Command.PlaySong play_song */ 6:
143
+ message.type = {
144
+ oneofKind: "playSong",
145
+ playSong: Command_PlaySong.internalBinaryRead(reader, reader.uint32(), options, (message.type as any).playSong)
146
+ };
147
+ break;
148
+ case /* proto.packets.Command.SendBotMessage send_bot_message */ 7:
149
+ message.type = {
150
+ oneofKind: "sendBotMessage",
151
+ sendBotMessage: Command_SendBotMessage.internalBinaryRead(reader, reader.uint32(), options, (message.type as any).sendBotMessage)
152
+ };
153
+ break;
154
+ case /* string discord_authorize */ 9:
155
+ message.type = {
156
+ oneofKind: "discordAuthorize",
157
+ discordAuthorize: reader.string()
158
+ };
159
+ break;
160
+ default:
161
+ let u = options.readUnknownField;
162
+ if (u === "throw")
163
+ throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
164
+ let d = reader.skip(wireType);
165
+ if (u !== false)
166
+ (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
167
+ }
168
+ }
169
+ return message;
170
+ }
171
+ internalBinaryWrite(message: Command, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
172
+ /* bool heartbeat = 1; */
173
+ if (message.type.oneofKind === "heartbeat")
174
+ writer.tag(1, WireType.Varint).bool(message.type.heartbeat);
175
+ /* bool return_to_menu = 2; */
176
+ if (message.type.oneofKind === "returnToMenu")
177
+ writer.tag(2, WireType.Varint).bool(message.type.returnToMenu);
178
+ /* bool delay_test_finish = 3; */
179
+ if (message.type.oneofKind === "delayTestFinish")
180
+ writer.tag(3, WireType.Varint).bool(message.type.delayTestFinish);
181
+ /* bool stream_sync_show_image = 4; */
182
+ if (message.type.oneofKind === "streamSyncShowImage")
183
+ writer.tag(4, WireType.Varint).bool(message.type.streamSyncShowImage);
184
+ /* proto.packets.Command.PlaySong play_song = 6; */
185
+ if (message.type.oneofKind === "playSong")
186
+ Command_PlaySong.internalBinaryWrite(message.type.playSong, writer.tag(6, WireType.LengthDelimited).fork(), options).join();
187
+ /* proto.packets.Command.SendBotMessage send_bot_message = 7; */
188
+ if (message.type.oneofKind === "sendBotMessage")
189
+ Command_SendBotMessage.internalBinaryWrite(message.type.sendBotMessage, writer.tag(7, WireType.LengthDelimited).fork(), options).join();
190
+ /* string discord_authorize = 9; */
191
+ if (message.type.oneofKind === "discordAuthorize")
192
+ writer.tag(9, WireType.LengthDelimited).string(message.type.discordAuthorize);
193
+ let u = options.writeUnknownFields;
194
+ if (u !== false)
195
+ (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
196
+ return writer;
197
+ }
198
+ }
199
+ /**
200
+ * @generated MessageType for protobuf message proto.packets.Command
201
+ */
202
+ export const Command = new Command$Type();
203
+ // @generated message type with reflection information, may provide speed optimized methods
204
+ class Command_PlaySong$Type extends MessageType<Command_PlaySong> {
205
+ constructor() {
206
+ super("proto.packets.Command.PlaySong", [
207
+ { no: 1, name: "gameplay_parameters", kind: "message", T: () => GameplayParameters }
208
+ ]);
209
+ }
210
+ create(value?: PartialMessage<Command_PlaySong>): Command_PlaySong {
211
+ const message = {};
212
+ globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this });
213
+ if (value !== undefined)
214
+ reflectionMergePartial<Command_PlaySong>(this, message, value);
215
+ return message;
216
+ }
217
+ internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Command_PlaySong): Command_PlaySong {
218
+ let message = target ?? this.create(), end = reader.pos + length;
219
+ while (reader.pos < end) {
220
+ let [fieldNo, wireType] = reader.tag();
221
+ switch (fieldNo) {
222
+ case /* proto.models.GameplayParameters gameplay_parameters */ 1:
223
+ message.gameplayParameters = GameplayParameters.internalBinaryRead(reader, reader.uint32(), options, message.gameplayParameters);
224
+ break;
225
+ default:
226
+ let u = options.readUnknownField;
227
+ if (u === "throw")
228
+ throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
229
+ let d = reader.skip(wireType);
230
+ if (u !== false)
231
+ (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
232
+ }
233
+ }
234
+ return message;
235
+ }
236
+ internalBinaryWrite(message: Command_PlaySong, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
237
+ /* proto.models.GameplayParameters gameplay_parameters = 1; */
238
+ if (message.gameplayParameters)
239
+ GameplayParameters.internalBinaryWrite(message.gameplayParameters, writer.tag(1, WireType.LengthDelimited).fork(), options).join();
240
+ let u = options.writeUnknownFields;
241
+ if (u !== false)
242
+ (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
243
+ return writer;
244
+ }
245
+ }
246
+ /**
247
+ * @generated MessageType for protobuf message proto.packets.Command.PlaySong
248
+ */
249
+ export const Command_PlaySong = new Command_PlaySong$Type();
250
+ // @generated message type with reflection information, may provide speed optimized methods
251
+ class Command_SendBotMessage$Type extends MessageType<Command_SendBotMessage> {
252
+ constructor() {
253
+ super("proto.packets.Command.SendBotMessage", [
254
+ { no: 1, name: "channel", kind: "message", T: () => Channel },
255
+ { no: 2, name: "message", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
256
+ ]);
257
+ }
258
+ create(value?: PartialMessage<Command_SendBotMessage>): Command_SendBotMessage {
259
+ const message = { message: "" };
260
+ globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this });
261
+ if (value !== undefined)
262
+ reflectionMergePartial<Command_SendBotMessage>(this, message, value);
263
+ return message;
264
+ }
265
+ internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: Command_SendBotMessage): Command_SendBotMessage {
266
+ let message = target ?? this.create(), end = reader.pos + length;
267
+ while (reader.pos < end) {
268
+ let [fieldNo, wireType] = reader.tag();
269
+ switch (fieldNo) {
270
+ case /* proto.discord.Channel channel */ 1:
271
+ message.channel = Channel.internalBinaryRead(reader, reader.uint32(), options, message.channel);
272
+ break;
273
+ case /* string message */ 2:
274
+ message.message = reader.string();
275
+ break;
276
+ default:
277
+ let u = options.readUnknownField;
278
+ if (u === "throw")
279
+ throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
280
+ let d = reader.skip(wireType);
281
+ if (u !== false)
282
+ (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
283
+ }
284
+ }
285
+ return message;
286
+ }
287
+ internalBinaryWrite(message: Command_SendBotMessage, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
288
+ /* proto.discord.Channel channel = 1; */
289
+ if (message.channel)
290
+ Channel.internalBinaryWrite(message.channel, writer.tag(1, WireType.LengthDelimited).fork(), options).join();
291
+ /* string message = 2; */
292
+ if (message.message !== "")
293
+ writer.tag(2, WireType.LengthDelimited).string(message.message);
294
+ let u = options.writeUnknownFields;
295
+ if (u !== false)
296
+ (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
297
+ return writer;
298
+ }
299
+ }
300
+ /**
301
+ * @generated MessageType for protobuf message proto.packets.Command.SendBotMessage
302
+ */
303
+ export const Command_SendBotMessage = new Command_SendBotMessage$Type();