moons-ta-client 1.1.1 → 1.1.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.
@@ -1,4 +1,4 @@
1
1
  export declare const masterAddress = "server.tournamentassistant.net";
2
2
  export declare const masterPort = "8676";
3
- export declare const version = "1.1.1";
4
- export declare const versionCode = 111;
3
+ export declare const version = "1.1.3";
4
+ export declare const versionCode = 113;
package/dist/constants.js CHANGED
@@ -1,4 +1,4 @@
1
1
  export const masterAddress = "server.tournamentassistant.net";
2
2
  export const masterPort = "8676";
3
- export const version = "1.1.1";
4
- export const versionCode = 111;
3
+ export const version = "1.1.3";
4
+ export const versionCode = 113;
package/dist/index.d.ts CHANGED
@@ -3875,6 +3875,10 @@ interface Request_Connect {
3875
3875
  * @generated from protobuf field: int32 client_version = 1;
3876
3876
  */
3877
3877
  clientVersion: number;
3878
+ /**
3879
+ * @generated from protobuf field: int32 ui_version = 2;
3880
+ */
3881
+ uiVersion: number;
3878
3882
  }
3879
3883
  /**
3880
3884
  * @generated MessageType for protobuf message proto.packets.Request.Connect
@@ -4509,11 +4513,12 @@ type TAClientEvents = {
4509
4513
  };
4510
4514
  declare class TAClient extends CustomEventEmitter<TAClientEvents> {
4511
4515
  stateManager: StateManager;
4516
+ private uiVersion;
4512
4517
  private client?;
4513
4518
  private token;
4514
4519
  private shouldHeartbeat;
4515
4520
  private heartbeatInterval;
4516
- constructor();
4521
+ constructor(uiVersion?: number | undefined);
4517
4522
  get isConnected(): boolean;
4518
4523
  get isConnecting(): boolean;
4519
4524
  connect(serverAddress: string, port: string): Promise<Response>;
@@ -4529,7 +4534,7 @@ declare class TAClient extends CustomEventEmitter<TAClientEvents> {
4529
4534
  delayTestFinished: (userIds: string[]) => void;
4530
4535
  joinTournament: (tournamentId: string) => Promise<Response>;
4531
4536
  getLeaderboard: (tournamentId: string, qualifierId: string, mapId: string) => Promise<Response>;
4532
- loadSong: (levelId: string, userIds: string[]) => Promise<ResponseFromUser[]>;
4537
+ loadSong: (levelId: string, userIds: string[], timeout?: number) => Promise<ResponseFromUser[]>;
4533
4538
  loadImage: (bitmap: Uint8Array, userIds: string[]) => Promise<ResponseFromUser[]>;
4534
4539
  private handlePacket;
4535
4540
  updateUser: (tournamentId: string, user: User) => Promise<Response>;
@@ -4579,7 +4584,7 @@ declare class TAClient extends CustomEventEmitter<TAClientEvents> {
4579
4584
 
4580
4585
  declare const masterAddress = "server.tournamentassistant.net";
4581
4586
  declare const masterPort = "8676";
4582
- declare const version = "1.1.1";
4583
- declare const versionCode = 111;
4587
+ declare const version = "1.1.3";
4588
+ declare const versionCode = 113;
4584
4589
 
4585
4590
  export { Acknowledgement, Acknowledgement_AcknowledgementType, Beatmap, Channel, Characteristic, Command, Command_PlaySong, Command_SendBotMessage, CoreServer, CustomEventEmitter, DiscordUser, Event, Event_MatchCreated, Event_MatchDeleted, Event_MatchUpdated, Event_QualifierCreated, Event_QualifierDeleted, Event_QualifierUpdated, Event_ServerAdded, Event_ServerDeleted, Event_TournamentCreated, Event_TournamentDeleted, Event_TournamentUpdated, Event_UserAdded, Event_UserLeft, Event_UserUpdated, ForwardingPacket, GameplayModifiers, GameplayModifiers_GameOptions, GameplayParameters, Guild, LeaderboardEntry, Map, Match, ModalOption, Packet, Permissions, PlayerSpecificSettings, PlayerSpecificSettings_ArcVisibilityType, PlayerSpecificSettings_NoteJumpDurationTypeSettings, PlayerSpecificSettings_PlayerOptions, Push, Push_SongFinished, Push_SongFinished_CompletionType, QualifierEvent, QualifierEvent_EventSettings, QualifierEvent_LeaderboardSort, RealtimeScore, Request, Request_AddAuthorizedUser, Request_AddAuthorizedUserPermission, Request_AddQualifierMaps, Request_AddServer, Request_AddTournamentPool, Request_AddTournamentPoolMaps, Request_AddTournamentTeam, Request_AddUserToMatch, Request_Connect, Request_CreateMatch, Request_CreateQualifierEvent, Request_CreateTournament, Request_DeleteMatch, Request_DeleteQualifierEvent, Request_DeleteTournament, Request_GetAuthorizedUsers, Request_GetDiscordInfo, Request_Join, Request_LoadSong, Request_PreloadImageForStreamSync, Request_QualifierScores, Request_RemainingAttempts, Request_RemoveAuthorizedUser, Request_RemoveAuthorizedUserPermission, Request_RemoveQualifierMap, Request_RemoveTournamentPool, Request_RemoveTournamentPoolMap, Request_RemoveTournamentTeam, Request_RemoveUserFromMatch, Request_SetMatchLeader, Request_SetMatchMap, Request_SetQualifierFlags, Request_SetQualifierImage, Request_SetQualifierInfoChannel, Request_SetQualifierLeaderboardSort, Request_SetQualifierName, Request_SetTournamentAllowUnauthorizedView, Request_SetTournamentBannedMods, Request_SetTournamentEnablePools, Request_SetTournamentEnableTeams, Request_SetTournamentImage, Request_SetTournamentName, Request_SetTournamentPoolName, Request_SetTournamentScoreUpdateFrequency, Request_SetTournamentShowQualifierButton, Request_SetTournamentShowTournamentButton, Request_SetTournamentTeamImage, Request_SetTournamentTeamName, Request_ShowModal, Request_SubmitQualifierScore, Request_UpdateQualifierMap, Request_UpdateTournamentPoolMap, Request_UpdateUser, Response, type ResponseFromUser, Response_AddAuthorizedUser, Response_AddServer, Response_Connect, Response_Connect_ConnectFailReason, Response_CreateMatch, Response_CreateQualifierEvent, Response_CreateTournament, Response_DeleteMatch, Response_DeleteQualifierEvent, Response_DeleteTournament, Response_GetAuthorizedUsers, Response_GetAuthorizedUsers_AuthroizedUser, Response_GetDiscordInfo, Response_Join, Response_Join_JoinFailReason, Response_LeaderboardEntries, Response_LoadSong, Response_PreloadImageForStreamSync, Response_RemainingAttempts, Response_RemoveAuthorizedUser, Response_ResponseType, Response_ShowModal, Response_UpdateAuthorizedUser, Response_UpdateMatch, Response_UpdateQualifierEvent, Response_UpdateTournament, Response_UpdateUser, ScoreTrackerHand, State, TAClient, Tournament, Tournament_TournamentSettings, Tournament_TournamentSettings_Pool, Tournament_TournamentSettings_Team, User, User_ClientTypes, User_DiscordInfo, User_DownloadStates, User_PlayStates, User_Point, getTournaments, masterAddress, masterPort, version, versionCode };
package/dist/index.esm.js CHANGED
@@ -13433,11 +13433,18 @@ var Request_Connect$Type = class extends MessageType {
13433
13433
  kind: "scalar",
13434
13434
  T: 5
13435
13435
  /*ScalarType.INT32*/
13436
+ },
13437
+ {
13438
+ no: 2,
13439
+ name: "ui_version",
13440
+ kind: "scalar",
13441
+ T: 5
13442
+ /*ScalarType.INT32*/
13436
13443
  }
13437
13444
  ]);
13438
13445
  }
13439
13446
  create(value) {
13440
- const message = { clientVersion: 0 };
13447
+ const message = { clientVersion: 0, uiVersion: 0 };
13441
13448
  globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this });
13442
13449
  if (value !== void 0)
13443
13450
  reflectionMergePartial(this, message, value);
@@ -13452,6 +13459,10 @@ var Request_Connect$Type = class extends MessageType {
13452
13459
  1:
13453
13460
  message.clientVersion = reader.int32();
13454
13461
  break;
13462
+ case /* int32 ui_version */
13463
+ 2:
13464
+ message.uiVersion = reader.int32();
13465
+ break;
13455
13466
  default:
13456
13467
  let u2 = options.readUnknownField;
13457
13468
  if (u2 === "throw")
@@ -13466,6 +13477,8 @@ var Request_Connect$Type = class extends MessageType {
13466
13477
  internalBinaryWrite(message, writer, options) {
13467
13478
  if (message.clientVersion !== 0)
13468
13479
  writer.tag(1, WireType.Varint).int32(message.clientVersion);
13480
+ if (message.uiVersion !== 0)
13481
+ writer.tag(2, WireType.Varint).int32(message.uiVersion);
13469
13482
  let u2 = options.writeUnknownFields;
13470
13483
  if (u2 !== false)
13471
13484
  (u2 == true ? UnknownFieldHandler.onWrite : u2)(this.typeName, message, writer);
@@ -15112,8 +15125,8 @@ init_buffer2();
15112
15125
  init_process2();
15113
15126
  var masterAddress = "server.tournamentassistant.net";
15114
15127
  var masterPort = "8676";
15115
- var version = "1.1.1";
15116
- var versionCode = 111;
15128
+ var version = "1.1.3";
15129
+ var versionCode = 113;
15117
15130
 
15118
15131
  // src/tournament-assistant-client.ts
15119
15132
  var import_ws2 = __toESM(require_ws(), 1);
@@ -15209,13 +15222,15 @@ var Scraper = class extends CustomEventEmitter {
15209
15222
  // src/tournament-assistant-client.ts
15210
15223
  var TAClient = class extends CustomEventEmitter {
15211
15224
  stateManager;
15225
+ uiVersion;
15212
15226
  client;
15213
15227
  token = "";
15214
15228
  shouldHeartbeat = false;
15215
15229
  heartbeatInterval;
15216
- constructor() {
15230
+ constructor(uiVersion = void 0) {
15217
15231
  super();
15218
15232
  this.stateManager = new StateManager();
15233
+ this.uiVersion = uiVersion;
15219
15234
  }
15220
15235
  // --- State helpers --- //
15221
15236
  get isConnected() {
@@ -15249,7 +15264,8 @@ var TAClient = class extends CustomEventEmitter {
15249
15264
  type: {
15250
15265
  oneofKind: "connect",
15251
15266
  connect: {
15252
- clientVersion: versionCode
15267
+ clientVersion: versionCode,
15268
+ uiVersion: this.uiVersion ?? 0
15253
15269
  }
15254
15270
  }
15255
15271
  });
@@ -15332,7 +15348,7 @@ var TAClient = class extends CustomEventEmitter {
15332
15348
  };
15333
15349
  this.forwardToUsers(packet, to);
15334
15350
  }
15335
- async sendRequest(request, to) {
15351
+ async sendRequest(request, to, timeout = 3e4) {
15336
15352
  const packet = {
15337
15353
  token: "",
15338
15354
  // Overridden in this.send()
@@ -15356,22 +15372,29 @@ var TAClient = class extends CustomEventEmitter {
15356
15372
  onAuthorizationRequested
15357
15373
  );
15358
15374
  };
15359
- const checkResponses = () => {
15375
+ const getUnrespondedUsers = () => {
15360
15376
  const responseUsers = responseDictionary.map((x) => x.userId);
15361
15377
  const expectedUsers = to ?? ["00000000-0000-0000-0000-000000000000"];
15362
- if (responseUsers.length !== expectedUsers.length) {
15363
- return;
15378
+ if (responseUsers.length === expectedUsers.length) {
15379
+ return [];
15364
15380
  }
15365
15381
  const sortedArr1 = responseUsers.slice().sort();
15366
15382
  const sortedArr2 = expectedUsers.slice().sort();
15367
- for (let i2 = 0; i2 < sortedArr1.length; i2++) {
15368
- if (sortedArr1[i2] !== sortedArr2[i2]) {
15369
- return;
15383
+ let waitingForUsers = [];
15384
+ for (let i2 = 0; i2 < sortedArr2.length; i2++) {
15385
+ if (i2 > sortedArr1.length || sortedArr2[i2] !== sortedArr1[i2]) {
15386
+ waitingForUsers.push(sortedArr2[i2]);
15370
15387
  }
15371
15388
  }
15372
- removeListeners();
15373
- clearTimeout(timeout);
15374
- resolve(responseDictionary);
15389
+ return waitingForUsers;
15390
+ };
15391
+ const checkResponses = () => {
15392
+ const waitingForUsers = getUnrespondedUsers();
15393
+ if (waitingForUsers.length === 0) {
15394
+ removeListeners();
15395
+ clearTimeout(timeoutTimer);
15396
+ resolve(responseDictionary);
15397
+ }
15375
15398
  };
15376
15399
  const onResponseReceived = (response) => {
15377
15400
  const expectedUsers = to ?? ["00000000-0000-0000-0000-000000000000"];
@@ -15385,13 +15408,26 @@ var TAClient = class extends CustomEventEmitter {
15385
15408
  };
15386
15409
  const createTimeout = (time) => {
15387
15410
  return setTimeout(() => {
15411
+ const unrespondedUsers = getUnrespondedUsers();
15412
+ for (let user of unrespondedUsers) {
15413
+ responseDictionary.push({
15414
+ userId: user,
15415
+ response: {
15416
+ type: 0 /* Fail */,
15417
+ respondingToPacketId: packet.id,
15418
+ details: {
15419
+ oneofKind: void 0
15420
+ }
15421
+ }
15422
+ });
15423
+ }
15388
15424
  removeListeners();
15389
15425
  resolve(responseDictionary);
15390
15426
  }, time);
15391
15427
  };
15392
- const timeout = createTimeout(3e4);
15428
+ const timeoutTimer = createTimeout(timeout);
15393
15429
  const onAuthorizationRequested = () => {
15394
- clearTimeout(timeout);
15430
+ clearTimeout(timeoutTimer);
15395
15431
  throw "Authorization token invalid or not provided";
15396
15432
  };
15397
15433
  addListeners();
@@ -15491,7 +15527,7 @@ var TAClient = class extends CustomEventEmitter {
15491
15527
  }
15492
15528
  return response[0].response;
15493
15529
  };
15494
- loadSong = async (levelId, userIds) => {
15530
+ loadSong = async (levelId, userIds, timeout) => {
15495
15531
  const response = await this.sendRequest({
15496
15532
  type: {
15497
15533
  oneofKind: "loadSong",
@@ -15500,7 +15536,7 @@ var TAClient = class extends CustomEventEmitter {
15500
15536
  customHostUrl: ""
15501
15537
  }
15502
15538
  }
15503
- }, userIds);
15539
+ }, userIds, timeout);
15504
15540
  if (response.length <= 0) {
15505
15541
  throw new Error("Server timed out, or no users responded");
15506
15542
  }
@@ -1027,6 +1027,10 @@ export interface Request_Connect {
1027
1027
  * @generated from protobuf field: int32 client_version = 1;
1028
1028
  */
1029
1029
  clientVersion: number;
1030
+ /**
1031
+ * @generated from protobuf field: int32 ui_version = 2;
1032
+ */
1033
+ uiVersion: number;
1030
1034
  }
1031
1035
  /**
1032
1036
  * @generated from protobuf message proto.packets.Request.Join
@@ -3148,11 +3148,12 @@ export const Request_AddServer = new Request_AddServer$Type();
3148
3148
  class Request_Connect$Type extends MessageType {
3149
3149
  constructor() {
3150
3150
  super("proto.packets.Request.Connect", [
3151
- { no: 1, name: "client_version", kind: "scalar", T: 5 /*ScalarType.INT32*/ }
3151
+ { no: 1, name: "client_version", kind: "scalar", T: 5 /*ScalarType.INT32*/ },
3152
+ { no: 2, name: "ui_version", kind: "scalar", T: 5 /*ScalarType.INT32*/ }
3152
3153
  ]);
3153
3154
  }
3154
3155
  create(value) {
3155
- const message = { clientVersion: 0 };
3156
+ const message = { clientVersion: 0, uiVersion: 0 };
3156
3157
  globalThis.Object.defineProperty(message, MESSAGE_TYPE, { enumerable: false, value: this });
3157
3158
  if (value !== undefined)
3158
3159
  reflectionMergePartial(this, message, value);
@@ -3166,6 +3167,9 @@ class Request_Connect$Type extends MessageType {
3166
3167
  case /* int32 client_version */ 1:
3167
3168
  message.clientVersion = reader.int32();
3168
3169
  break;
3170
+ case /* int32 ui_version */ 2:
3171
+ message.uiVersion = reader.int32();
3172
+ break;
3169
3173
  default:
3170
3174
  let u = options.readUnknownField;
3171
3175
  if (u === "throw")
@@ -3181,6 +3185,9 @@ class Request_Connect$Type extends MessageType {
3181
3185
  /* int32 client_version = 1; */
3182
3186
  if (message.clientVersion !== 0)
3183
3187
  writer.tag(1, WireType.Varint).int32(message.clientVersion);
3188
+ /* int32 ui_version = 2; */
3189
+ if (message.uiVersion !== 0)
3190
+ writer.tag(2, WireType.Varint).int32(message.uiVersion);
3184
3191
  let u = options.writeUnknownFields;
3185
3192
  if (u !== false)
3186
3193
  (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
@@ -43,11 +43,12 @@ type TAClientEvents = {
43
43
  };
44
44
  export declare class TAClient extends CustomEventEmitter<TAClientEvents> {
45
45
  stateManager: StateManager;
46
+ private uiVersion;
46
47
  private client?;
47
48
  private token;
48
49
  private shouldHeartbeat;
49
50
  private heartbeatInterval;
50
- constructor();
51
+ constructor(uiVersion?: number | undefined);
51
52
  get isConnected(): boolean;
52
53
  get isConnecting(): boolean;
53
54
  connect(serverAddress: string, port: string): Promise<Response>;
@@ -63,7 +64,7 @@ export declare class TAClient extends CustomEventEmitter<TAClientEvents> {
63
64
  delayTestFinished: (userIds: string[]) => void;
64
65
  joinTournament: (tournamentId: string) => Promise<Response>;
65
66
  getLeaderboard: (tournamentId: string, qualifierId: string, mapId: string) => Promise<Response>;
66
- loadSong: (levelId: string, userIds: string[]) => Promise<ResponseFromUser[]>;
67
+ loadSong: (levelId: string, userIds: string[], timeout?: number) => Promise<ResponseFromUser[]>;
67
68
  loadImage: (bitmap: Uint8Array, userIds: string[]) => Promise<ResponseFromUser[]>;
68
69
  private handlePacket;
69
70
  updateUser: (tournamentId: string, user: User) => Promise<Response>;
@@ -10,13 +10,15 @@ export * from "./scraper.js";
10
10
  export * from "./models/models.js";
11
11
  export class TAClient extends CustomEventEmitter {
12
12
  stateManager;
13
+ uiVersion;
13
14
  client;
14
15
  token = "";
15
16
  shouldHeartbeat = false;
16
17
  heartbeatInterval;
17
- constructor() {
18
+ constructor(uiVersion = undefined) {
18
19
  super();
19
20
  this.stateManager = new StateManager();
21
+ this.uiVersion = uiVersion;
20
22
  }
21
23
  // --- State helpers --- //
22
24
  get isConnected() {
@@ -48,6 +50,7 @@ export class TAClient extends CustomEventEmitter {
48
50
  oneofKind: "connect",
49
51
  connect: {
50
52
  clientVersion: versionCode,
53
+ uiVersion: this.uiVersion ?? 0
51
54
  },
52
55
  },
53
56
  });
@@ -126,7 +129,7 @@ export class TAClient extends CustomEventEmitter {
126
129
  };
127
130
  this.forwardToUsers(packet, to);
128
131
  }
129
- async sendRequest(request, to) {
132
+ async sendRequest(request, to, timeout = 30000) {
130
133
  const packet = {
131
134
  token: "",
132
135
  from: this.stateManager.getSelfGuid(),
@@ -147,24 +150,31 @@ export class TAClient extends CustomEventEmitter {
147
150
  this.removeListener("responseReceived", onResponseReceived);
148
151
  this.removeListener("authorizationRequestedFromServer", onAuthorizationRequested);
149
152
  };
150
- // Check that we got responses from all expected users
151
- const checkResponses = () => {
153
+ const getUnrespondedUsers = () => {
152
154
  const responseUsers = responseDictionary.map((x) => x.userId);
153
155
  const expectedUsers = to ?? ["00000000-0000-0000-0000-000000000000"]; // If we didn't forward this to any users, we should expect a response from the server
154
- if (responseUsers.length !== expectedUsers.length) {
155
- return;
156
+ if (responseUsers.length === expectedUsers.length) {
157
+ return [];
156
158
  }
157
159
  const sortedArr1 = responseUsers.slice().sort();
158
160
  const sortedArr2 = expectedUsers.slice().sort();
159
- for (let i = 0; i < sortedArr1.length; i++) {
160
- if (sortedArr1[i] !== sortedArr2[i]) {
161
- return;
161
+ let waitingForUsers = [];
162
+ for (let i = 0; i < sortedArr2.length; i++) {
163
+ if (i > sortedArr1.length || sortedArr2[i] !== sortedArr1[i]) {
164
+ waitingForUsers.push(sortedArr2[i]);
162
165
  }
163
166
  }
164
- // All responses are received, clean up and resolve
165
- removeListeners();
166
- clearTimeout(timeout);
167
- resolve(responseDictionary);
167
+ return waitingForUsers;
168
+ };
169
+ // Check that we got responses from all expected users
170
+ const checkResponses = () => {
171
+ const waitingForUsers = getUnrespondedUsers();
172
+ if (waitingForUsers.length === 0) {
173
+ // All responses are received, clean up and resolve
174
+ removeListeners();
175
+ clearTimeout(timeoutTimer);
176
+ resolve(responseDictionary);
177
+ }
168
178
  };
169
179
  // Add to the dictionary when the response is to this packet, and from an expected user
170
180
  const onResponseReceived = (response) => {
@@ -178,18 +188,31 @@ export class TAClient extends CustomEventEmitter {
178
188
  checkResponses();
179
189
  }
180
190
  };
181
- // Return what we have after 5 seconds
191
+ // Return what we have after 30 seconds, inject errors for users that haven't responded yet
182
192
  const createTimeout = (time) => {
183
193
  return setTimeout(() => {
194
+ const unrespondedUsers = getUnrespondedUsers();
195
+ for (let user of unrespondedUsers) {
196
+ responseDictionary.push({
197
+ userId: user,
198
+ response: {
199
+ type: Response_ResponseType.Fail,
200
+ respondingToPacketId: packet.id,
201
+ details: {
202
+ oneofKind: undefined
203
+ }
204
+ },
205
+ });
206
+ }
184
207
  removeListeners();
185
208
  resolve(responseDictionary);
186
209
  }, time);
187
210
  };
188
- const timeout = createTimeout(30000);
211
+ const timeoutTimer = createTimeout(timeout);
189
212
  // If authorization is requested, we're assuming an external application failed
190
213
  // to provide a valid token, so we will combust
191
214
  const onAuthorizationRequested = () => {
192
- clearTimeout(timeout);
215
+ clearTimeout(timeoutTimer);
193
216
  throw "Authorization token invalid or not provided";
194
217
  };
195
218
  addListeners();
@@ -290,7 +313,7 @@ export class TAClient extends CustomEventEmitter {
290
313
  }
291
314
  return response[0].response;
292
315
  };
293
- loadSong = async (levelId, userIds) => {
316
+ loadSong = async (levelId, userIds, timeout) => {
294
317
  const response = await this.sendRequest({
295
318
  type: {
296
319
  oneofKind: "loadSong",
@@ -299,7 +322,7 @@ export class TAClient extends CustomEventEmitter {
299
322
  customHostUrl: ""
300
323
  },
301
324
  },
302
- }, userIds);
325
+ }, userIds, timeout);
303
326
  if (response.length <= 0) {
304
327
  throw new Error("Server timed out, or no users responded");
305
328
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "moons-ta-client",
3
- "version": "1.1.1",
3
+ "version": "1.1.3",
4
4
  "type": "module",
5
5
  "main": "./dist/index.esm.js",
6
6
  "types": "./dist/index.d.ts",