moons-ta-client 1.0.1 → 1.0.3
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/dist/client.d.ts +22 -0
- package/dist/client.js +77 -0
- package/dist/constants.d.ts +4 -0
- package/{src/constants.ts → dist/constants.js} +1 -1
- package/dist/custom-event-emitter.d.ts +7 -0
- package/dist/custom-event-emitter.js +16 -0
- package/dist/index.d.ts +4591 -0
- package/dist/index.esm.js +16500 -0
- package/{src/index.ts → dist/index.js} +1 -1
- package/dist/models/commands.d.ts +116 -0
- package/{src/models/commands.ts → dist/models/commands.js} +17 -102
- package/dist/models/discord.d.ts +76 -0
- package/{src/models/discord.ts → dist/models/discord.js} +15 -62
- package/dist/models/events.d.ts +419 -0
- package/{src/models/events.ts → dist/models/events.js} +89 -354
- package/dist/models/index.js +8 -0
- package/dist/models/models.d.ts +1137 -0
- package/{src/models/models.ts → dist/models/models.js} +200 -799
- package/dist/models/packets.d.ts +144 -0
- package/{src/models/packets.ts → dist/models/packets.js} +26 -126
- package/dist/models/pushes.d.ts +122 -0
- package/{src/models/pushes.ts → dist/models/pushes.js} +24 -96
- package/dist/models/requests.d.ts +1694 -0
- package/{src/models/requests.ts → dist/models/requests.js} +323 -1469
- package/dist/models/responses.d.ts +799 -0
- package/{src/models/responses.ts → dist/models/responses.js} +161 -669
- package/dist/scraper.d.ts +2 -0
- package/dist/scraper.js +87 -0
- package/dist/state-manager.d.ts +50 -0
- package/dist/state-manager.js +196 -0
- package/dist/tournament-assistant-client.d.ts +113 -0
- package/dist/tournament-assistant-client.js +1167 -0
- package/package.json +8 -2
- package/rollup.config.mjs +0 -16
- package/scripts/esbuild.mjs +0 -24
- package/scripts/fixImports.mjs +0 -44
- package/src/client.ts +0 -101
- package/src/custom-event-emitter.ts +0 -21
- package/src/scraper.ts +0 -137
- package/src/state-manager.ts +0 -308
- package/src/tournament-assistant-client.ts +0 -1553
- package/tsconfig.json +0 -27
- /package/{src/models/index.ts → dist/models/index.d.ts} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "moons-ta-client",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.esm.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -36,5 +36,11 @@
|
|
|
36
36
|
"npm": "^10.8.0",
|
|
37
37
|
"uuid": "^9.0.0",
|
|
38
38
|
"ws": "^8.17.0"
|
|
39
|
-
}
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
"LICENSE",
|
|
42
|
+
"README.md",
|
|
43
|
+
"dist",
|
|
44
|
+
"package.json"
|
|
45
|
+
]
|
|
40
46
|
}
|
package/rollup.config.mjs
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
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
|
-
};
|
package/scripts/esbuild.mjs
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
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
|
-
});
|
package/scripts/fixImports.mjs
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
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
DELETED
|
@@ -1,101 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
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/scraper.ts
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { CustomEventEmitter } from "./custom-event-emitter.js";
|
|
2
|
-
import { CoreServer, Tournament } from "./models/models.js";
|
|
3
|
-
import { TAClient } from "./tournament-assistant-client.js";
|
|
4
|
-
|
|
5
|
-
const MASTER_ADDRESS = "server.tournamentassistant.net";
|
|
6
|
-
const MASTER_PORT = "8676";
|
|
7
|
-
|
|
8
|
-
type OnProgress = {
|
|
9
|
-
totalServers: number;
|
|
10
|
-
succeededServers: number;
|
|
11
|
-
failedServers: number;
|
|
12
|
-
tournaments: Tournament[];
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
type ScraperEvents = {
|
|
16
|
-
onProgress: OnProgress;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
export function getTournaments(
|
|
20
|
-
token: string,
|
|
21
|
-
onProgress: (
|
|
22
|
-
totalServers: number,
|
|
23
|
-
succeededServers: number,
|
|
24
|
-
failedServers: number
|
|
25
|
-
) => void,
|
|
26
|
-
onComplete: (tournaments: Tournament[]) => void
|
|
27
|
-
) {
|
|
28
|
-
const scraper = new Scraper(token);
|
|
29
|
-
scraper.on("onProgress", (progress) => {
|
|
30
|
-
onProgress(
|
|
31
|
-
progress.totalServers,
|
|
32
|
-
progress.succeededServers,
|
|
33
|
-
progress.failedServers
|
|
34
|
-
);
|
|
35
|
-
|
|
36
|
-
if (
|
|
37
|
-
progress.failedServers + progress.succeededServers ===
|
|
38
|
-
progress.totalServers
|
|
39
|
-
) {
|
|
40
|
-
onComplete(progress.tournaments);
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
scraper.getTournaments();
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
class Scraper extends CustomEventEmitter<ScraperEvents> {
|
|
47
|
-
private servers: CoreServer[] = [];
|
|
48
|
-
private tournaments: Tournament[] = [];
|
|
49
|
-
private token: string;
|
|
50
|
-
|
|
51
|
-
private succeededServers = 0;
|
|
52
|
-
private failedServers = 0;
|
|
53
|
-
|
|
54
|
-
constructor(token: string) {
|
|
55
|
-
super();
|
|
56
|
-
this.token = token;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
public getTournaments() {
|
|
60
|
-
const masterClient = new TAClient();
|
|
61
|
-
masterClient.setAuthToken(this.token);
|
|
62
|
-
|
|
63
|
-
masterClient.on("connectedToServer", async (response) => {
|
|
64
|
-
this.servers = response.state!.knownServers;
|
|
65
|
-
this.tournaments = response.state!.tournaments;
|
|
66
|
-
|
|
67
|
-
masterClient.disconnect();
|
|
68
|
-
|
|
69
|
-
//We successfully got tournaments from the master server
|
|
70
|
-
this.succeededServers++;
|
|
71
|
-
this.emit("onProgress", {
|
|
72
|
-
totalServers: this.servers.length,
|
|
73
|
-
succeededServers: this.succeededServers,
|
|
74
|
-
failedServers: this.failedServers,
|
|
75
|
-
tournaments: this.tournaments,
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
//Just running this map kicks off all the Promises, so no need to await them.
|
|
79
|
-
//This is probably a sin. If anyone knows the proper way to do this, hit me up on discord
|
|
80
|
-
this.servers
|
|
81
|
-
.filter(
|
|
82
|
-
(x) =>
|
|
83
|
-
`${x.address}:${x.websocketPort}` !==
|
|
84
|
-
`${MASTER_ADDRESS}:${MASTER_PORT}`
|
|
85
|
-
)
|
|
86
|
-
.map((x) =>
|
|
87
|
-
this.getTournamentsFromServer(x.address, `${x.websocketPort}`)
|
|
88
|
-
);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
masterClient.on("failedToConnectToServer", () => {
|
|
92
|
-
//We failed to get tournaments from the master server
|
|
93
|
-
this.failedServers++;
|
|
94
|
-
this.emit("onProgress", {
|
|
95
|
-
totalServers: this.servers.length,
|
|
96
|
-
succeededServers: this.succeededServers,
|
|
97
|
-
failedServers: this.failedServers,
|
|
98
|
-
tournaments: this.tournaments,
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
masterClient.connect(MASTER_ADDRESS, MASTER_PORT);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
private async getTournamentsFromServer(address: string, port: string) {
|
|
106
|
-
const client = new TAClient();
|
|
107
|
-
client.setAuthToken(this.token);
|
|
108
|
-
|
|
109
|
-
client.on("connectedToServer", (response) => {
|
|
110
|
-
this.tournaments = [...this.tournaments, ...response.state!.tournaments];
|
|
111
|
-
|
|
112
|
-
client.disconnect();
|
|
113
|
-
|
|
114
|
-
//We successfully got tournaments from the server
|
|
115
|
-
this.succeededServers++;
|
|
116
|
-
this.emit("onProgress", {
|
|
117
|
-
totalServers: this.servers.length,
|
|
118
|
-
succeededServers: this.succeededServers,
|
|
119
|
-
failedServers: this.failedServers,
|
|
120
|
-
tournaments: this.tournaments,
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
client.on("failedToConnectToServer", () => {
|
|
125
|
-
//We failed to get tournaments from the server
|
|
126
|
-
this.failedServers++;
|
|
127
|
-
this.emit("onProgress", {
|
|
128
|
-
totalServers: this.servers.length,
|
|
129
|
-
succeededServers: this.succeededServers,
|
|
130
|
-
failedServers: this.failedServers,
|
|
131
|
-
tournaments: this.tournaments,
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
client.connect(address, port);
|
|
136
|
-
}
|
|
137
|
-
}
|
package/src/state-manager.ts
DELETED
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
import { CustomEventEmitter } from "./custom-event-emitter.js";
|
|
2
|
-
import {
|
|
3
|
-
User,
|
|
4
|
-
Tournament,
|
|
5
|
-
Match,
|
|
6
|
-
QualifierEvent,
|
|
7
|
-
CoreServer,
|
|
8
|
-
State,
|
|
9
|
-
} from "./models/models.js";
|
|
10
|
-
import { Packet } from "./models/packets.js";
|
|
11
|
-
import { v4 as uuidv4 } from "uuid";
|
|
12
|
-
import { Response_ResponseType } from "./models/responses.js";
|
|
13
|
-
|
|
14
|
-
type StateManagerEvents = {
|
|
15
|
-
userConnected: [User, Tournament];
|
|
16
|
-
userUpdated: [User, Tournament];
|
|
17
|
-
userDisconnected: [User, Tournament];
|
|
18
|
-
|
|
19
|
-
matchCreated: [Match, Tournament];
|
|
20
|
-
matchUpdated: [Match, Tournament];
|
|
21
|
-
matchDeleted: [Match, Tournament];
|
|
22
|
-
|
|
23
|
-
qualifierCreated: [QualifierEvent, Tournament];
|
|
24
|
-
qualifierUpdated: [QualifierEvent, Tournament];
|
|
25
|
-
qualifierDeleted: [QualifierEvent, Tournament];
|
|
26
|
-
|
|
27
|
-
tournamentCreated: Tournament;
|
|
28
|
-
tournamentUpdated: Tournament;
|
|
29
|
-
tournamentDeleted: Tournament;
|
|
30
|
-
|
|
31
|
-
serverAdded: CoreServer;
|
|
32
|
-
serverDeleted: CoreServer;
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
export class StateManager extends CustomEventEmitter<StateManagerEvents> {
|
|
36
|
-
private state: State;
|
|
37
|
-
private self: string;
|
|
38
|
-
|
|
39
|
-
constructor() {
|
|
40
|
-
super();
|
|
41
|
-
this.self = uuidv4();
|
|
42
|
-
this.state = {
|
|
43
|
-
tournaments: [],
|
|
44
|
-
knownServers: [],
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// --- Packet handler --- //
|
|
49
|
-
public handlePacket(packet: Packet) {
|
|
50
|
-
if (packet.packet.oneofKind === "event") {
|
|
51
|
-
const event = packet.packet.event;
|
|
52
|
-
switch (event.changedObject.oneofKind) {
|
|
53
|
-
case "userAdded": {
|
|
54
|
-
this.userConnected(
|
|
55
|
-
event.changedObject.userAdded.tournamentId,
|
|
56
|
-
event.changedObject.userAdded.user!
|
|
57
|
-
);
|
|
58
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
case "userUpdated": {
|
|
61
|
-
this.userUpdated(
|
|
62
|
-
event.changedObject.userUpdated.tournamentId,
|
|
63
|
-
event.changedObject.userUpdated.user!
|
|
64
|
-
);
|
|
65
|
-
break;
|
|
66
|
-
}
|
|
67
|
-
case "userLeft": {
|
|
68
|
-
this.userDisconnected(
|
|
69
|
-
event.changedObject.userLeft.tournamentId,
|
|
70
|
-
event.changedObject.userLeft.user!
|
|
71
|
-
);
|
|
72
|
-
break;
|
|
73
|
-
}
|
|
74
|
-
case "matchCreated": {
|
|
75
|
-
this.matchCreated(
|
|
76
|
-
event.changedObject.matchCreated.tournamentId,
|
|
77
|
-
event.changedObject.matchCreated.match!
|
|
78
|
-
);
|
|
79
|
-
break;
|
|
80
|
-
}
|
|
81
|
-
case "matchUpdated": {
|
|
82
|
-
this.matchUpdated(
|
|
83
|
-
event.changedObject.matchUpdated.tournamentId,
|
|
84
|
-
event.changedObject.matchUpdated.match!
|
|
85
|
-
);
|
|
86
|
-
break;
|
|
87
|
-
}
|
|
88
|
-
case "matchDeleted": {
|
|
89
|
-
this.matchDeleted(
|
|
90
|
-
event.changedObject.matchDeleted.tournamentId,
|
|
91
|
-
event.changedObject.matchDeleted.match!
|
|
92
|
-
);
|
|
93
|
-
break;
|
|
94
|
-
}
|
|
95
|
-
case "qualifierCreated": {
|
|
96
|
-
this.qualifierEventCreated(
|
|
97
|
-
event.changedObject.qualifierCreated.tournamentId,
|
|
98
|
-
event.changedObject.qualifierCreated.event!
|
|
99
|
-
);
|
|
100
|
-
break;
|
|
101
|
-
}
|
|
102
|
-
case "qualifierUpdated": {
|
|
103
|
-
this.qualifierEventUpdated(
|
|
104
|
-
event.changedObject.qualifierUpdated.tournamentId,
|
|
105
|
-
event.changedObject.qualifierUpdated.event!
|
|
106
|
-
);
|
|
107
|
-
break;
|
|
108
|
-
}
|
|
109
|
-
case "qualifierDeleted": {
|
|
110
|
-
this.qualifierEventDeleted(
|
|
111
|
-
event.changedObject.qualifierDeleted.tournamentId,
|
|
112
|
-
event.changedObject.qualifierDeleted.event!
|
|
113
|
-
);
|
|
114
|
-
break;
|
|
115
|
-
}
|
|
116
|
-
case "tournamentCreated": {
|
|
117
|
-
this.tournamentCreated(
|
|
118
|
-
event.changedObject.tournamentCreated.tournament!
|
|
119
|
-
);
|
|
120
|
-
break;
|
|
121
|
-
}
|
|
122
|
-
case "tournamentUpdated": {
|
|
123
|
-
this.tournamentUpdated(
|
|
124
|
-
event.changedObject.tournamentUpdated.tournament!
|
|
125
|
-
);
|
|
126
|
-
break;
|
|
127
|
-
}
|
|
128
|
-
case "tournamentDeleted": {
|
|
129
|
-
this.tournamentDeleted(
|
|
130
|
-
event.changedObject.tournamentDeleted.tournament!
|
|
131
|
-
);
|
|
132
|
-
break;
|
|
133
|
-
}
|
|
134
|
-
case "serverAdded": {
|
|
135
|
-
this.serverAdded(event.changedObject.serverAdded.server!);
|
|
136
|
-
break;
|
|
137
|
-
}
|
|
138
|
-
case "serverDeleted": {
|
|
139
|
-
this.serverDeleted(event.changedObject.serverDeleted.server!);
|
|
140
|
-
break;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
} else if (packet.packet.oneofKind === "response") {
|
|
144
|
-
const response = packet.packet.response;
|
|
145
|
-
|
|
146
|
-
if (response.details.oneofKind === "connect") {
|
|
147
|
-
const connect = response.details.connect;
|
|
148
|
-
|
|
149
|
-
if (response.type === Response_ResponseType.Success) {
|
|
150
|
-
this.state = connect.state!;
|
|
151
|
-
}
|
|
152
|
-
} else if (response.details.oneofKind === "join") {
|
|
153
|
-
const join = response.details.join;
|
|
154
|
-
|
|
155
|
-
if (response.type === Response_ResponseType.Success) {
|
|
156
|
-
this.state = join.state!;
|
|
157
|
-
this.self = join.selfGuid;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// --- Helpers --- //
|
|
164
|
-
public getSelfGuid() {
|
|
165
|
-
return this.self;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
public getTournaments() {
|
|
169
|
-
return this.state.tournaments;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
public getTournament(id: string) {
|
|
173
|
-
return this.state.tournaments.find((x) => x.guid === id);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
public getUsers(tournamentId: string) {
|
|
177
|
-
return this.getTournament(tournamentId)?.users;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
public getUser(tournamentId: string, userId: string) {
|
|
181
|
-
return this.getUsers(tournamentId)?.find((x) => x.guid === userId);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
public getMatches(tournamentId: string) {
|
|
185
|
-
return this.getTournament(tournamentId)?.matches;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
public getMatch(tournamentId: string, matchId: string) {
|
|
189
|
-
return this.getMatches(tournamentId)?.find((x) => x.guid === matchId);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
public getQualifiers(tournamentId: string) {
|
|
193
|
-
return this.getTournament(tournamentId)?.qualifiers;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
public getQualifier(tournamentId: string, qualifierId: string) {
|
|
197
|
-
return this.getQualifiers(tournamentId)?.find((x) => x.guid === qualifierId);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
public getKnownServers() {
|
|
201
|
-
return this.state.knownServers;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// --- Event handlers --- //
|
|
205
|
-
private userConnected = (tournamentId: string, user: User) => {
|
|
206
|
-
const tournament = this.getTournament(tournamentId);
|
|
207
|
-
tournament!.users = [...tournament!.users, user];
|
|
208
|
-
this.emit("userConnected", [user, tournament!]);
|
|
209
|
-
};
|
|
210
|
-
|
|
211
|
-
private userUpdated = (tournamentId: string, user: User) => {
|
|
212
|
-
const tournament = this.getTournament(tournamentId);
|
|
213
|
-
const index = tournament!.users.findIndex((x) => x.guid === user.guid);
|
|
214
|
-
tournament!.users[index] = user;
|
|
215
|
-
this.emit("userUpdated", [user, tournament!]);
|
|
216
|
-
};
|
|
217
|
-
|
|
218
|
-
private userDisconnected = (tournamentId: string, user: User) => {
|
|
219
|
-
const tournament = this.getTournament(tournamentId);
|
|
220
|
-
tournament!.users = tournament!.users.filter((x) => x.guid !== user.guid);
|
|
221
|
-
this.emit("userDisconnected", [user, tournament!]);
|
|
222
|
-
};
|
|
223
|
-
|
|
224
|
-
private matchCreated = (tournamentId: string, match: Match) => {
|
|
225
|
-
const tournament = this.getTournament(tournamentId);
|
|
226
|
-
tournament!.matches = [...tournament!.matches, match];
|
|
227
|
-
this.emit("matchCreated", [match, tournament!]);
|
|
228
|
-
};
|
|
229
|
-
|
|
230
|
-
private matchUpdated = (tournamentId: string, match: Match) => {
|
|
231
|
-
const tournament = this.getTournament(tournamentId);
|
|
232
|
-
const index = tournament!.matches.findIndex((x) => x.guid === match.guid);
|
|
233
|
-
tournament!.matches[index] = match;
|
|
234
|
-
this.emit("matchUpdated", [match, tournament!]);
|
|
235
|
-
};
|
|
236
|
-
|
|
237
|
-
private matchDeleted = (tournamentId: string, match: Match) => {
|
|
238
|
-
const tournament = this.getTournament(tournamentId);
|
|
239
|
-
tournament!.matches = tournament!.matches.filter(
|
|
240
|
-
(x) => x.guid !== match.guid
|
|
241
|
-
);
|
|
242
|
-
this.emit("matchDeleted", [match, tournament!]);
|
|
243
|
-
};
|
|
244
|
-
|
|
245
|
-
private qualifierEventCreated = (
|
|
246
|
-
tournamentId: string,
|
|
247
|
-
event: QualifierEvent
|
|
248
|
-
) => {
|
|
249
|
-
const tournament = this.getTournament(tournamentId);
|
|
250
|
-
tournament!.qualifiers = [...tournament!.qualifiers, event];
|
|
251
|
-
this.emit("qualifierCreated", [event, tournament!]);
|
|
252
|
-
};
|
|
253
|
-
|
|
254
|
-
private qualifierEventUpdated = (
|
|
255
|
-
tournamentId: string,
|
|
256
|
-
event: QualifierEvent
|
|
257
|
-
) => {
|
|
258
|
-
const tournament = this.getTournament(tournamentId);
|
|
259
|
-
const index = tournament!.qualifiers.findIndex(
|
|
260
|
-
(x) => x.guid === event.guid
|
|
261
|
-
);
|
|
262
|
-
tournament!.qualifiers[index] = event;
|
|
263
|
-
this.emit("qualifierUpdated", [event, tournament!]);
|
|
264
|
-
};
|
|
265
|
-
|
|
266
|
-
private qualifierEventDeleted = (
|
|
267
|
-
tournamentId: string,
|
|
268
|
-
event: QualifierEvent
|
|
269
|
-
) => {
|
|
270
|
-
const tournament = this.getTournament(tournamentId);
|
|
271
|
-
tournament!.qualifiers = tournament!.qualifiers.filter(
|
|
272
|
-
(x) => x.guid !== event.guid
|
|
273
|
-
);
|
|
274
|
-
this.emit("qualifierDeleted", [event, tournament!]);
|
|
275
|
-
};
|
|
276
|
-
|
|
277
|
-
private tournamentCreated = (tournament: Tournament) => {
|
|
278
|
-
this.state.tournaments = [...this.state.tournaments, tournament];
|
|
279
|
-
this.emit("tournamentCreated", tournament);
|
|
280
|
-
};
|
|
281
|
-
|
|
282
|
-
private tournamentUpdated = (tournament: Tournament) => {
|
|
283
|
-
const index = this.state.tournaments.findIndex(
|
|
284
|
-
(x) => x.guid === tournament.guid
|
|
285
|
-
);
|
|
286
|
-
this.state.tournaments[index] = tournament;
|
|
287
|
-
this.emit("tournamentUpdated", tournament);
|
|
288
|
-
};
|
|
289
|
-
|
|
290
|
-
private tournamentDeleted = (tournament: Tournament) => {
|
|
291
|
-
this.state.tournaments = this.state.tournaments.filter(
|
|
292
|
-
(x) => x.guid !== tournament.guid
|
|
293
|
-
);
|
|
294
|
-
this.emit("tournamentDeleted", tournament);
|
|
295
|
-
};
|
|
296
|
-
|
|
297
|
-
private serverAdded = (server: CoreServer) => {
|
|
298
|
-
this.state.knownServers = [...this.state.knownServers, server];
|
|
299
|
-
this.emit("serverAdded", server);
|
|
300
|
-
};
|
|
301
|
-
|
|
302
|
-
private serverDeleted = (server: CoreServer) => {
|
|
303
|
-
this.state.knownServers = this.state.knownServers.filter(
|
|
304
|
-
(x) => `${server.address}:${server.port}` !== `${x.address}:${x.port}`
|
|
305
|
-
);
|
|
306
|
-
this.emit("serverDeleted", server);
|
|
307
|
-
};
|
|
308
|
-
}
|