maidraw 0.8.7 → 0.9.0

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.
@@ -3,15 +3,21 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.KamaiTachi = void 0;
6
+ exports.KamaiTachiBuilder = exports.KamaiTachi = void 0;
7
7
  const type_1 = require("../../type");
8
8
  const __1 = __importDefault(require(".."));
9
9
  const best50_1 = require("../../best50");
10
+ const chart_1 = require("../../chart");
10
11
  class KamaiTachi extends __1.default {
11
- CURRENT_VERSION;
12
- constructor({ baseURL = "https://kamai.tachi.ac/", currentVersion = KamaiTachi.EGameVersions.PRISM, } = {}) {
12
+ currentVersion;
13
+ currentRegion;
14
+ constructor({ baseURL = "https://kamai.tachi.ac/", version = KamaiTachi.GameVersions.PRISM, region = "DX", } = {}) {
13
15
  super({ baseURL });
14
- this.CURRENT_VERSION = currentVersion;
16
+ this.currentVersion = version;
17
+ this.currentRegion = region;
18
+ }
19
+ versions() {
20
+ return new KamaiTachiBuilder();
15
21
  }
16
22
  async getPlayerPB(userId) {
17
23
  return this.get(`/api/v1/users/${userId}/games/maimaidx/Single/pbs/all`, undefined, 60 * 1000);
@@ -110,26 +116,64 @@ class KamaiTachi extends __1.default {
110
116
  })(),
111
117
  };
112
118
  }
113
- async getPlayerBest50(userId, { currentVersion = this.CURRENT_VERSION, omnimix = true, use = "ALL", } = {}) {
114
- function APFilter(score) {
119
+ async getPlayerBest50(userId, { omnimix = true, use = "ALL", } = {}) {
120
+ function filterAP(score) {
115
121
  return (score.pb.scoreData.lamp == "ALL PERFECT" ||
116
122
  score.pb.scoreData.lamp == "ALL PERFECT+");
117
123
  }
118
- function FCFilter(score) {
124
+ function filterFC(score) {
119
125
  return (score.pb.scoreData.lamp == "FULL COMBO" ||
120
126
  score.pb.scoreData.lamp == "FULL COMBO+");
121
127
  }
122
- function useFilter(score) {
128
+ function filterUseAchievementFilter(score) {
123
129
  switch (use) {
124
130
  case "AP":
125
- return APFilter(score);
131
+ return filterFC(score);
126
132
  case "FC":
127
- return APFilter(score) || FCFilter(score);
133
+ return filterAP(score) || filterFC(score);
128
134
  case "ALL":
129
135
  default:
130
136
  return true;
131
137
  }
132
138
  }
139
+ const filterIsLocalChartNewVersion = (score) => {
140
+ return (chart_1.Chart.Database.getLocalChart(score.chart.data.inGameID, (() => {
141
+ switch (true) {
142
+ case score.chart.difficulty.includes("RE:MASTER"):
143
+ return type_1.EDifficulty.REMASTER;
144
+ case score.chart.difficulty.includes("MASTER"):
145
+ return type_1.EDifficulty.MASTER;
146
+ case score.chart.difficulty.includes("EXPERT"):
147
+ return type_1.EDifficulty.EXPERT;
148
+ case score.chart.difficulty.includes("ADVANCED"):
149
+ return type_1.EDifficulty.ADVANCED;
150
+ case score.chart.difficulty.includes("BASIC"):
151
+ default:
152
+ return type_1.EDifficulty.BASIC;
153
+ }
154
+ })())?.addVersion[this.currentRegion]?.name ==
155
+ this.currentVersion[this.currentRegion]);
156
+ };
157
+ const filterIsLocalChartOldVersion = (score) => {
158
+ const addVersion = chart_1.Chart.Database.getLocalChart(score.chart.data.inGameID, (() => {
159
+ switch (true) {
160
+ case score.chart.difficulty.includes("RE:MASTER"):
161
+ return type_1.EDifficulty.REMASTER;
162
+ case score.chart.difficulty.includes("MASTER"):
163
+ return type_1.EDifficulty.MASTER;
164
+ case score.chart.difficulty.includes("EXPERT"):
165
+ return type_1.EDifficulty.EXPERT;
166
+ case score.chart.difficulty.includes("ADVANCED"):
167
+ return type_1.EDifficulty.ADVANCED;
168
+ case score.chart.difficulty.includes("BASIC"):
169
+ default:
170
+ return type_1.EDifficulty.BASIC;
171
+ }
172
+ })())?.addVersion[this.currentRegion]?.name;
173
+ if (!addVersion)
174
+ return false;
175
+ return (KamaiTachi.compareGameVersions(this.currentVersion, KamaiTachi.getGameVersion(addVersion)) > 0);
176
+ };
133
177
  const rawPBs = await this.getPlayerPB(userId);
134
178
  if (!rawPBs?.body)
135
179
  return null;
@@ -141,22 +185,27 @@ class KamaiTachi extends __1.default {
141
185
  pbs.push({ pb, chart, song });
142
186
  }
143
187
  }
144
- const newScores = pbs
145
- .filter((v) => v.chart.data.displayVersion == currentVersion // Assume new scores does not have omnimix charts.
146
- )
147
- .filter(useFilter);
148
- const oldScores = pbs
149
- .filter((v) =>
150
- // Chart exists
151
- v.chart &&
152
- // Chart version is older than current Version
153
- KamaiTachi.compareGameVersions(currentVersion, v.chart.data.displayVersion) > 0 &&
154
- (omnimix || // Omnimix is enabled, all charts are included.
155
- !((v.chart.versions[0].includes("-omni") && // Alternatively, if omnimix is disabled, check if the chart is included in omnimix folder of the latest version, (which should always happen).
156
- v.chart.versions[1].includes("-omni")) // Then check if the second last version is a omnimix folder. If two omnimix folders occur in a row, it is a omnimix chart.
157
- )) // Reject that case.
158
- )
159
- .filter(useFilter);
188
+ let newScores = [], oldScores = [];
189
+ if (chart_1.Chart.Database.hasLocalDatabase()) {
190
+ newScores = pbs.filter(filterIsLocalChartNewVersion);
191
+ oldScores = pbs.filter(filterIsLocalChartOldVersion);
192
+ }
193
+ else {
194
+ newScores = pbs.filter((v) => v.chart.data.displayVersion == this.currentVersion.kamai // Assume new scores does not have omnimix charts.
195
+ );
196
+ oldScores = pbs.filter((v) =>
197
+ // Chart exists
198
+ v.chart &&
199
+ // Chart version is older than current Version
200
+ KamaiTachi.compareGameVersions(this.currentVersion, KamaiTachi.getGameVersion(v.chart.data.displayVersion)) > 0 &&
201
+ (omnimix || // Omnimix is enabled, all charts are included.
202
+ !((v.chart.versions[0].includes("-omni") && // Alternatively, if omnimix is disabled, check if the chart is included in omnimix folder of the latest version, (which should always happen).
203
+ v.chart.versions[1].includes("-omni")) // Then check if the second last version is a omnimix folder. If two omnimix folders occur in a row, it is a omnimix chart.
204
+ )) // Reject that case.
205
+ );
206
+ }
207
+ newScores = newScores.filter(filterUseAchievementFilter);
208
+ oldScores = oldScores.filter(filterUseAchievementFilter);
160
209
  return {
161
210
  new: newScores
162
211
  .sort((a, b) => b.pb.calculatedData.rate - a.pb.calculatedData.rate
@@ -173,7 +222,6 @@ class KamaiTachi extends __1.default {
173
222
  };
174
223
  }
175
224
  async getPlayerInfo(userId, options = {
176
- currentVersion: this.CURRENT_VERSION,
177
225
  omnimix: true,
178
226
  use: "ALL",
179
227
  }) {
@@ -250,224 +298,428 @@ class KamaiTachi extends __1.default {
250
298
  : null,
251
299
  };
252
300
  }
253
- maimai() {
301
+ async getPlayerLevel50(username, level, page, options = { percise: false }) {
302
+ if (page < 1)
303
+ page = 1;
304
+ const rawPBs = await this.getPlayerPB(username);
305
+ if (!rawPBs?.body)
306
+ return null;
307
+ const pbs = [];
308
+ for (const pb of rawPBs.body.pbs) {
309
+ let chart = rawPBs.body.charts.find((v) => v.chartID == pb.chartID);
310
+ let song = rawPBs.body.songs.find((v) => v.id == pb.songID);
311
+ if (chart && song) {
312
+ pbs.push({ pb, chart, song });
313
+ }
314
+ }
315
+ return pbs
316
+ .map((v) => this.toMaiDrawScore(v.pb, v.chart, v.song))
317
+ .sort((a, b) => b.achievement - a.achievement ||
318
+ b.chart.level - a.chart.level)
319
+ .filter((v) => options.percise
320
+ ? v.chart.level == level
321
+ : this.levelBoundChecker(v.chart.level, level, 6))
322
+ .slice((page - 1) * 50, (page - 1) * 50 + 50);
323
+ }
324
+ levelBoundChecker(payload, target, border) {
325
+ let lb = 0, hb = 0;
326
+ if ((target * 10) % 10 < border) {
327
+ lb = Math.trunc(target);
328
+ hb = Math.trunc(target) + (border - 1) * 0.1;
329
+ }
330
+ else {
331
+ lb = Math.trunc(target) + border * 0.1;
332
+ hb = Math.ceil(target) - 0.1;
333
+ }
334
+ return lb <= payload && payload <= hb;
335
+ }
336
+ }
337
+ exports.KamaiTachi = KamaiTachi;
338
+ class KamaiTachiBuilder {
339
+ maimai(region) {
254
340
  return new KamaiTachi({
255
- currentVersion: KamaiTachi.EGameVersions.MAIMAI,
341
+ version: KamaiTachi.GameVersions.MAIMAI,
342
+ region,
256
343
  });
257
344
  }
258
- maimaiPlus() {
345
+ maimaiPlus(region) {
259
346
  return new KamaiTachi({
260
- currentVersion: KamaiTachi.EGameVersions.MAIMAI_PLUS,
347
+ version: KamaiTachi.GameVersions.MAIMAI_PLUS,
348
+ region,
261
349
  });
262
350
  }
263
- green() {
351
+ green(region) {
264
352
  return new KamaiTachi({
265
- currentVersion: KamaiTachi.EGameVersions.GREEN,
353
+ version: KamaiTachi.GameVersions.GREEN,
354
+ region,
266
355
  });
267
356
  }
268
- greenPlus() {
357
+ greenPlus(region) {
269
358
  return new KamaiTachi({
270
- currentVersion: KamaiTachi.EGameVersions.GREEN_PLUS,
359
+ version: KamaiTachi.GameVersions.GREEN_PLUS,
360
+ region,
271
361
  });
272
362
  }
273
- orange() {
363
+ orange(region) {
274
364
  return new KamaiTachi({
275
- currentVersion: KamaiTachi.EGameVersions.ORANGE,
365
+ version: KamaiTachi.GameVersions.ORANGE,
366
+ region,
276
367
  });
277
368
  }
278
- orangePlus() {
369
+ orangePlus(region) {
279
370
  return new KamaiTachi({
280
- currentVersion: KamaiTachi.EGameVersions.ORANGE_PLUS,
371
+ version: KamaiTachi.GameVersions.ORANGE_PLUS,
372
+ region,
281
373
  });
282
374
  }
283
- pink() {
375
+ pink(region) {
284
376
  return new KamaiTachi({
285
- currentVersion: KamaiTachi.EGameVersions.PINK,
377
+ version: KamaiTachi.GameVersions.PINK,
378
+ region,
286
379
  });
287
380
  }
288
- pinkPlus() {
381
+ pinkPlus(region) {
289
382
  return new KamaiTachi({
290
- currentVersion: KamaiTachi.EGameVersions.PINK_PLUS,
383
+ version: KamaiTachi.GameVersions.PINK_PLUS,
384
+ region,
291
385
  });
292
386
  }
293
- murasaki() {
387
+ murasaki(region) {
294
388
  return new KamaiTachi({
295
- currentVersion: KamaiTachi.EGameVersions.MURASAKI,
389
+ version: KamaiTachi.GameVersions.MURASAKI,
390
+ region,
296
391
  });
297
392
  }
298
- murasakiPlus() {
393
+ murasakiPlus(region) {
299
394
  return new KamaiTachi({
300
- currentVersion: KamaiTachi.EGameVersions.MURASAKI_PLUS,
395
+ version: KamaiTachi.GameVersions.MURASAKI_PLUS,
396
+ region,
301
397
  });
302
398
  }
303
- milk() {
399
+ milk(region) {
304
400
  return new KamaiTachi({
305
- currentVersion: KamaiTachi.EGameVersions.MILK,
401
+ version: KamaiTachi.GameVersions.MILK,
402
+ region,
306
403
  });
307
404
  }
308
- milkPlus() {
405
+ milkPlus(region) {
309
406
  return new KamaiTachi({
310
- currentVersion: KamaiTachi.EGameVersions.MILK_PLUS,
407
+ version: KamaiTachi.GameVersions.MILK_PLUS,
408
+ region,
311
409
  });
312
410
  }
313
- finale() {
411
+ finale(region) {
314
412
  return new KamaiTachi({
315
- currentVersion: KamaiTachi.EGameVersions.FINALE,
413
+ version: KamaiTachi.GameVersions.FINALE,
414
+ region,
316
415
  });
317
416
  }
318
- dx() {
417
+ dx(region) {
319
418
  return new KamaiTachi({
320
- currentVersion: KamaiTachi.EGameVersions.DX,
419
+ version: KamaiTachi.GameVersions.DX,
420
+ region,
321
421
  });
322
422
  }
323
- dxPlus() {
423
+ dxPlus(region) {
324
424
  return new KamaiTachi({
325
- currentVersion: KamaiTachi.EGameVersions.DX_PLUS,
425
+ version: KamaiTachi.GameVersions.DX_PLUS,
426
+ region,
326
427
  });
327
428
  }
328
- splash() {
429
+ splash(region) {
329
430
  return new KamaiTachi({
330
- currentVersion: KamaiTachi.EGameVersions.SPLASH,
431
+ version: KamaiTachi.GameVersions.SPLASH,
432
+ region,
331
433
  });
332
434
  }
333
- splashPlus() {
435
+ splashPlus(region) {
334
436
  return new KamaiTachi({
335
- currentVersion: KamaiTachi.EGameVersions.SPLASH_PLUS,
437
+ version: KamaiTachi.GameVersions.SPLASH_PLUS,
438
+ region,
336
439
  });
337
440
  }
338
- universe() {
441
+ universe(region) {
339
442
  return new KamaiTachi({
340
- currentVersion: KamaiTachi.EGameVersions.UNIVERSE,
443
+ version: KamaiTachi.GameVersions.UNIVERSE,
444
+ region,
341
445
  });
342
446
  }
343
- universePlus() {
447
+ universePlus(region) {
344
448
  return new KamaiTachi({
345
- currentVersion: KamaiTachi.EGameVersions.UNIVERSE_PLUS,
449
+ version: KamaiTachi.GameVersions.UNIVERSE_PLUS,
450
+ region,
346
451
  });
347
452
  }
348
- festival() {
453
+ festival(region) {
349
454
  return new KamaiTachi({
350
- currentVersion: KamaiTachi.EGameVersions.FESTIVAL,
455
+ version: KamaiTachi.GameVersions.FESTIVAL,
456
+ region,
351
457
  });
352
458
  }
353
- festivalPlus() {
459
+ festivalPlus(region) {
354
460
  return new KamaiTachi({
355
- currentVersion: KamaiTachi.EGameVersions.FESTIVAL_PLUS,
461
+ version: KamaiTachi.GameVersions.FESTIVAL_PLUS,
462
+ region,
356
463
  });
357
464
  }
358
- buddies() {
465
+ buddies(region) {
359
466
  return new KamaiTachi({
360
- currentVersion: KamaiTachi.EGameVersions.BUDDIES,
467
+ version: KamaiTachi.GameVersions.BUDDIES,
468
+ region,
361
469
  });
362
470
  }
363
- buddiesPlus() {
471
+ buddiesPlus(region) {
364
472
  return new KamaiTachi({
365
- currentVersion: KamaiTachi.EGameVersions.BUDDIES_PLUS,
473
+ version: KamaiTachi.GameVersions.BUDDIES_PLUS,
474
+ region,
366
475
  });
367
476
  }
368
- prism() {
477
+ prism(region) {
369
478
  return new KamaiTachi({
370
- currentVersion: KamaiTachi.EGameVersions.PRISM,
479
+ version: KamaiTachi.GameVersions.PRISM,
480
+ region,
371
481
  });
372
482
  }
373
- prismPlus() {
483
+ prismPlus(region) {
374
484
  return new KamaiTachi({
375
- currentVersion: KamaiTachi.EGameVersions.PRISM_PLUS,
485
+ version: KamaiTachi.GameVersions.PRISM_PLUS,
486
+ region,
376
487
  });
377
488
  }
378
- async getPlayerLevel50(username, level, page, options = { percise: false }) {
379
- if (page < 1)
380
- page = 1;
381
- const rawPBs = await this.getPlayerPB(username);
382
- if (!rawPBs?.body)
383
- return null;
384
- const pbs = [];
385
- for (const pb of rawPBs.body.pbs) {
386
- let chart = rawPBs.body.charts.find((v) => v.chartID == pb.chartID);
387
- let song = rawPBs.body.songs.find((v) => v.id == pb.songID);
388
- if (chart && song) {
389
- pbs.push({ pb, chart, song });
390
- }
391
- }
392
- return pbs
393
- .map((v) => this.toMaiDrawScore(v.pb, v.chart, v.song))
394
- .sort((a, b) => b.achievement - a.achievement ||
395
- b.chart.level - a.chart.level)
396
- .filter((v) => options.percise
397
- ? v.chart.level == level
398
- : this.levelBoundChecker(v.chart.level, level, 6))
399
- .slice((page - 1) * 50, (page - 1) * 50 + 50);
400
- }
401
- levelBoundChecker(payload, target, border) {
402
- let lb = 0, hb = 0;
403
- if ((target * 10) % 10 < border) {
404
- lb = Math.floor(target);
405
- hb = Math.floor(target) + (border - 1) * 0.1;
406
- }
407
- else {
408
- lb = Math.floor(target) + border * 0.1;
409
- hb = Math.ceil(target) - 0.1;
410
- }
411
- return lb <= payload && payload <= hb;
489
+ CN() {
490
+ return {
491
+ DX() {
492
+ return new KamaiTachi({
493
+ version: KamaiTachi.GameVersions.DX,
494
+ region: "CN",
495
+ });
496
+ },
497
+ DX2021() {
498
+ return new KamaiTachi({
499
+ version: KamaiTachi.GameVersions.SPLASH,
500
+ region: "CN",
501
+ });
502
+ },
503
+ DX2022() {
504
+ return new KamaiTachi({
505
+ version: KamaiTachi.GameVersions.UNIVERSE,
506
+ region: "CN",
507
+ });
508
+ },
509
+ DX2023() {
510
+ return new KamaiTachi({
511
+ version: KamaiTachi.GameVersions.FESTIVAL,
512
+ region: "CN",
513
+ });
514
+ },
515
+ DX2024() {
516
+ return new KamaiTachi({
517
+ version: KamaiTachi.GameVersions.BUDDIES,
518
+ region: "CN",
519
+ });
520
+ },
521
+ DX2025() {
522
+ return new KamaiTachi({
523
+ version: KamaiTachi.GameVersions.PRISM,
524
+ region: "CN",
525
+ });
526
+ },
527
+ };
412
528
  }
413
529
  }
414
- exports.KamaiTachi = KamaiTachi;
530
+ exports.KamaiTachiBuilder = KamaiTachiBuilder;
415
531
  (function (KamaiTachi) {
416
- let EGameVersions;
417
- (function (EGameVersions) {
418
- EGameVersions["PRISM_PLUS"] = "maimai\u3067\u3089\u3063\u304F\u3059 PRiSM PLUS";
419
- EGameVersions["PRISM"] = "maimai\u3067\u3089\u3063\u304F\u3059 PRiSM";
420
- EGameVersions["BUDDIES_PLUS"] = "maimai\u3067\u3089\u3063\u304F\u3059 BUDDiES PLUS";
421
- EGameVersions["BUDDIES"] = "maimai\u3067\u3089\u3063\u304F\u3059 BUDDiES";
422
- EGameVersions["FESTIVAL_PLUS"] = "maimai\u3067\u3089\u3063\u304F\u3059 FESTiVAL PLUS";
423
- EGameVersions["FESTIVAL"] = "maimai\u3067\u3089\u3063\u304F\u3059 FESTiVAL";
424
- EGameVersions["UNIVERSE_PLUS"] = "maimai\u3067\u3089\u3063\u304F\u3059 UNiVERSE PLUS";
425
- EGameVersions["UNIVERSE"] = "maimai\u3067\u3089\u3063\u304F\u3059 UNiVERSE";
426
- EGameVersions["SPLASH_PLUS"] = "maimai\u3067\u3089\u3063\u304F\u3059 Splash PLUS";
427
- EGameVersions["SPLASH"] = "maimai\u3067\u3089\u3063\u304F\u3059 Splash";
428
- EGameVersions["DX_PLUS"] = "maimai\u3067\u3089\u3063\u304F\u3059 PLUS";
429
- EGameVersions["DX"] = "maimai\u3067\u3089\u3063\u304F\u3059";
430
- EGameVersions["FINALE"] = "maimai FiNALE";
431
- EGameVersions["MILK_PLUS"] = "maimai MiLK PLUS";
432
- EGameVersions["MILK"] = "maimai MiLK";
433
- EGameVersions["MURASAKI_PLUS"] = "maimai MURASAKi PLUS";
434
- EGameVersions["MURASAKI"] = "maimai MURASAKi";
435
- EGameVersions["PINK_PLUS"] = "maimai PiNK PLUS";
436
- EGameVersions["PINK"] = "maimai PiNK";
437
- EGameVersions["ORANGE_PLUS"] = "maimai ORANGE PLUS";
438
- EGameVersions["ORANGE"] = "maimai ORANGE";
439
- EGameVersions["GREEN_PLUS"] = "maimai GreeN PLUS";
440
- EGameVersions["GREEN"] = "maimai GreeN";
441
- EGameVersions["MAIMAI_PLUS"] = "maimai PLUS";
442
- EGameVersions["MAIMAI"] = "maimai";
443
- })(EGameVersions = KamaiTachi.EGameVersions || (KamaiTachi.EGameVersions = {}));
444
- const GameVersions = [
445
- EGameVersions.MAIMAI,
446
- EGameVersions.MAIMAI_PLUS,
447
- EGameVersions.GREEN,
448
- EGameVersions.GREEN_PLUS,
449
- EGameVersions.ORANGE,
450
- EGameVersions.ORANGE_PLUS,
451
- EGameVersions.PINK,
452
- EGameVersions.PINK_PLUS,
453
- EGameVersions.MURASAKI,
454
- EGameVersions.MURASAKI_PLUS,
455
- EGameVersions.MILK,
456
- EGameVersions.MILK_PLUS,
457
- EGameVersions.FINALE,
458
- EGameVersions.DX,
459
- EGameVersions.DX_PLUS,
460
- EGameVersions.SPLASH,
461
- EGameVersions.SPLASH_PLUS,
462
- EGameVersions.UNIVERSE,
463
- EGameVersions.UNIVERSE_PLUS,
464
- EGameVersions.FESTIVAL,
465
- EGameVersions.FESTIVAL_PLUS,
466
- EGameVersions.BUDDIES,
467
- EGameVersions.BUDDIES_PLUS,
468
- EGameVersions.PRISM,
469
- EGameVersions.PRISM_PLUS,
532
+ KamaiTachi.GameVersions = {
533
+ PRISM_PLUS: {
534
+ kamai: "maimaiでらっくす PRiSM PLUS",
535
+ DX: "maimai でらっくす PRiSM PLUS",
536
+ EX: "maimai DX PRiSM PLUS",
537
+ CN: "",
538
+ },
539
+ PRISM: {
540
+ kamai: "maimaiでらっくす PRiSM",
541
+ DX: "maimai でらっくす PRiSM",
542
+ EX: "maimai DX PRiSM",
543
+ CN: "舞萌DX 2025",
544
+ },
545
+ BUDDIES_PLUS: {
546
+ kamai: "maimaiでらっくす BUDDiES PLUS",
547
+ DX: "maimai でらっくす BUDDiES PLUS",
548
+ EX: "maimai DX BUDDiES PLUS",
549
+ CN: "",
550
+ },
551
+ BUDDIES: {
552
+ kamai: "maimaiでらっくす BUDDiES",
553
+ DX: "maimai でらっくす BUDDiES",
554
+ EX: "maimai DX BUDDiES",
555
+ CN: "舞萌DX 2024",
556
+ },
557
+ FESTIVAL_PLUS: {
558
+ kamai: "maimaiでらっくす FESTiVAL PLUS",
559
+ DX: "maimai でらっくす FESTiVAL PLUS",
560
+ EX: "maimai DX FESTiVAL PLUS",
561
+ CN: "",
562
+ },
563
+ FESTIVAL: {
564
+ kamai: "maimaiでらっくす FESTiVAL",
565
+ DX: "maimai でらっくす FESTiVAL",
566
+ EX: "maimai DX FESTiVAL",
567
+ CN: "舞萌DX 2023",
568
+ },
569
+ UNIVERSE_PLUS: {
570
+ kamai: "maimaiでらっくす UNiVERSE PLUS",
571
+ DX: "maimai でらっくす UNiVERSE PLUS",
572
+ EX: "maimai DX UNiVERSE PLUS",
573
+ CN: "",
574
+ },
575
+ UNIVERSE: {
576
+ kamai: "maimaiでらっくす UNiVERSE",
577
+ DX: "maimai でらっくす UNiVERSE",
578
+ EX: "maimai DX UNiVERSE",
579
+ CN: "舞萌DX 2022",
580
+ },
581
+ SPLASH_PLUS: {
582
+ kamai: "maimaiでらっくす Splash PLUS",
583
+ DX: "maimai でらっくす Splash PLUS",
584
+ EX: "maimai DX Splash PLUS",
585
+ CN: "",
586
+ },
587
+ SPLASH: {
588
+ kamai: "maimaiでらっくす Splash",
589
+ DX: "maimai でらっくす Splash",
590
+ EX: "maimai DX Splash",
591
+ CN: "舞萌DX 2021",
592
+ },
593
+ DX_PLUS: {
594
+ kamai: "maimaiでらっくす PLUS",
595
+ DX: "maimai でらっくす PLUS",
596
+ EX: "maimai DX PLUS",
597
+ CN: "",
598
+ },
599
+ DX: {
600
+ kamai: "maimaiでらっくす",
601
+ DX: "maimai でらっくす",
602
+ EX: "maimai DX",
603
+ CN: "舞萌DX",
604
+ },
605
+ FINALE: {
606
+ kamai: "maimai FiNALE",
607
+ DX: "maimai FiNALE",
608
+ EX: "maimai FiNALE",
609
+ CN: "maimai FiNALE",
610
+ },
611
+ MILK_PLUS: {
612
+ kamai: "maimai MiLK PLUS",
613
+ DX: "maimai MiLK PLUS",
614
+ EX: "maimai MiLK PLUS",
615
+ CN: "maimai MiLK PLUS",
616
+ },
617
+ MILK: {
618
+ kamai: "maimai MiLK",
619
+ DX: "maimai MiLK",
620
+ EX: "maimai MiLK",
621
+ CN: "maimai MiLK",
622
+ },
623
+ MURASAKI_PLUS: {
624
+ kamai: "maimai MURASAKi PLUS",
625
+ DX: "maimai MURASAKi PLUS",
626
+ EX: "maimai MURASAKi PLUS",
627
+ CN: "maimai MURASAKi PLUS",
628
+ },
629
+ MURASAKI: {
630
+ kamai: "maimai MURASAKi",
631
+ DX: "maimai MURASAKi",
632
+ EX: "maimai MURASAKi",
633
+ CN: "maimai MURASAKi",
634
+ },
635
+ PINK_PLUS: {
636
+ kamai: "maimai PiNK PLUS",
637
+ DX: "maimai PiNK PLUS",
638
+ EX: "maimai PiNK PLUS",
639
+ CN: "maimai PiNK PLUS",
640
+ },
641
+ PINK: {
642
+ kamai: "maimai PiNK",
643
+ DX: "maimai PiNK",
644
+ EX: "maimai PiNK",
645
+ CN: "maimai PiNK",
646
+ },
647
+ ORANGE_PLUS: {
648
+ kamai: "maimai ORANGE PLUS",
649
+ DX: "maimai ORANGE PLUS",
650
+ EX: "maimai ORANGE PLUS",
651
+ CN: "maimai ORANGE PLUS",
652
+ },
653
+ ORANGE: {
654
+ kamai: "maimai ORANGE",
655
+ DX: "maimai ORANGE",
656
+ EX: "maimai ORANGE",
657
+ CN: "maimai ORANGE",
658
+ },
659
+ GREEN_PLUS: {
660
+ kamai: "maimai GreeN PLUS",
661
+ DX: "maimai GreeN PLUS",
662
+ EX: "maimai GreeN PLUS",
663
+ CN: "maimai GreeN PLUS",
664
+ },
665
+ GREEN: {
666
+ kamai: "maimai GreeN",
667
+ DX: "maimai GreeN",
668
+ EX: "maimai GreeN",
669
+ CN: "maimai GreeN",
670
+ },
671
+ MAIMAI_PLUS: {
672
+ kamai: "maimai PLUS",
673
+ DX: "maimai PLUS",
674
+ EX: "maimai PLUS",
675
+ CN: "maimai PLUS",
676
+ },
677
+ MAIMAI: {
678
+ kamai: "maimai",
679
+ DX: "maimai",
680
+ EX: "maimai",
681
+ CN: "maimai",
682
+ },
683
+ };
684
+ const GameVersionOrder = [
685
+ KamaiTachi.GameVersions.MAIMAI,
686
+ KamaiTachi.GameVersions.MAIMAI_PLUS,
687
+ KamaiTachi.GameVersions.GREEN,
688
+ KamaiTachi.GameVersions.GREEN_PLUS,
689
+ KamaiTachi.GameVersions.ORANGE,
690
+ KamaiTachi.GameVersions.ORANGE_PLUS,
691
+ KamaiTachi.GameVersions.PINK,
692
+ KamaiTachi.GameVersions.PINK_PLUS,
693
+ KamaiTachi.GameVersions.MURASAKI,
694
+ KamaiTachi.GameVersions.MURASAKI_PLUS,
695
+ KamaiTachi.GameVersions.MILK,
696
+ KamaiTachi.GameVersions.MILK_PLUS,
697
+ KamaiTachi.GameVersions.FINALE,
698
+ KamaiTachi.GameVersions.DX,
699
+ KamaiTachi.GameVersions.DX_PLUS,
700
+ KamaiTachi.GameVersions.SPLASH,
701
+ KamaiTachi.GameVersions.SPLASH_PLUS,
702
+ KamaiTachi.GameVersions.UNIVERSE,
703
+ KamaiTachi.GameVersions.UNIVERSE_PLUS,
704
+ KamaiTachi.GameVersions.FESTIVAL,
705
+ KamaiTachi.GameVersions.FESTIVAL_PLUS,
706
+ KamaiTachi.GameVersions.BUDDIES,
707
+ KamaiTachi.GameVersions.BUDDIES_PLUS,
708
+ KamaiTachi.GameVersions.PRISM,
709
+ KamaiTachi.GameVersions.PRISM_PLUS,
470
710
  ];
711
+ function getGameVersion(payload) {
712
+ for (const version of Object.values(KamaiTachi.GameVersions)) {
713
+ if (version.kamai.toLowerCase() === payload.toLowerCase() ||
714
+ version.DX.toLowerCase() === payload.toLowerCase() ||
715
+ version.EX.toLowerCase() === payload.toLowerCase() ||
716
+ version.CN.toLowerCase() === payload.toLowerCase()) {
717
+ return version;
718
+ }
719
+ }
720
+ return null;
721
+ }
722
+ KamaiTachi.getGameVersion = getGameVersion;
471
723
  /**
472
724
  * Compare two game versions and calculate which is newer.
473
725
  *
@@ -476,7 +728,13 @@ exports.KamaiTachi = KamaiTachi;
476
728
  * @returns positive if a is newer, negative if b is newer, 0 if they are the same.
477
729
  */
478
730
  function compareGameVersions(a, b) {
479
- return GameVersions.indexOf(a) - GameVersions.indexOf(b);
731
+ if (!a && !b)
732
+ return 0;
733
+ if (!a)
734
+ return -1; // b is newer
735
+ if (!b)
736
+ return 1; // a is newer
737
+ return GameVersionOrder.indexOf(a) - GameVersionOrder.indexOf(b);
480
738
  }
481
739
  KamaiTachi.compareGameVersions = compareGameVersions;
482
740
  })(KamaiTachi || (exports.KamaiTachi = KamaiTachi = {}));