hypixel-api-reborn 11.0.1 → 11.2.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.
Files changed (96) hide show
  1. package/.prettierrc +13 -13
  2. package/LICENSE +20 -20
  3. package/README.md +67 -65
  4. package/package.json +20 -18
  5. package/src/API/getAPIStatus.js +1 -1
  6. package/src/API/getAchievements.js +6 -0
  7. package/src/API/getChallenges.js +6 -0
  8. package/src/API/getGuild.js +1 -1
  9. package/src/API/getGuildAchievements.js +6 -0
  10. package/src/API/getLeaderboards.js +3 -1
  11. package/src/API/getPlayer.js +1 -1
  12. package/src/API/getQuests.js +6 -0
  13. package/src/API/getRecentGames.js +1 -1
  14. package/src/API/getServerInfo.js +3 -1
  15. package/src/API/getStatus.js +1 -1
  16. package/src/API/index.js +28 -17
  17. package/src/API/skyblock/getAuction.js +19 -0
  18. package/src/API/skyblock/{getSkyblockAuctions.js → getAuctions.js} +6 -2
  19. package/src/API/skyblock/{getSkyblockAuctionsByPlayer.js → getAuctionsByPlayer.js} +1 -1
  20. package/src/API/skyblock/getBingo.js +8 -0
  21. package/src/API/skyblock/getBingoByPlayer.js +14 -0
  22. package/src/API/skyblock/getFireSales.js +7 -0
  23. package/src/API/skyblock/getGovernment.js +8 -0
  24. package/src/API/skyblock/{getSkyblockMember.js → getMember.js} +10 -6
  25. package/src/API/skyblock/getMuseum.js +14 -0
  26. package/src/API/skyblock/{getSkyblockProfiles.js → getProfiles.js} +14 -12
  27. package/src/Client.js +91 -17
  28. package/src/Errors.js +39 -17
  29. package/src/Private/rateLimit.js +10 -2
  30. package/src/Private/requests.js +20 -8
  31. package/src/Private/updater.js +10 -20
  32. package/src/Private/uuidCache.js +23 -29
  33. package/src/Private/validate.js +20 -9
  34. package/src/index.js +9 -0
  35. package/src/structures/APIIncident.js +3 -9
  36. package/src/structures/Boosters/Booster.js +5 -5
  37. package/src/structures/Color.js +93 -48
  38. package/src/structures/Game.js +3 -1
  39. package/src/structures/Guild/Guild.js +21 -17
  40. package/src/structures/Guild/GuildMember.js +6 -6
  41. package/src/structures/Guild/GuildRank.js +2 -2
  42. package/src/structures/MiniGames/Arcade.js +22 -17
  43. package/src/structures/MiniGames/BedWars.js +152 -24
  44. package/src/structures/MiniGames/Duels.js +84 -23
  45. package/src/structures/MiniGames/MegaWalls.js +3 -1
  46. package/src/structures/MiniGames/MurderMystery.js +2 -2
  47. package/src/structures/MiniGames/Pit.js +231 -2
  48. package/src/structures/MiniGames/PitInventoryItem.js +43 -0
  49. package/src/structures/MiniGames/SkyWars.js +19 -14
  50. package/src/structures/MiniGames/SmashHeroes.js +1 -1
  51. package/src/structures/MiniGames/TNTGames.js +1 -1
  52. package/src/structures/MiniGames/UHC.js +21 -3
  53. package/src/structures/MiniGames/WoolWars.js +1 -1
  54. package/src/structures/Player.js +16 -20
  55. package/src/structures/PlayerCosmetics.js +64 -10
  56. package/src/structures/ServerInfo.js +1 -1
  57. package/src/structures/SkyBlock/Auctions/Auction.js +3 -1
  58. package/src/structures/SkyBlock/Auctions/AuctionInfo.js +1 -0
  59. package/src/structures/SkyBlock/Auctions/BaseAuction.js +1 -0
  60. package/src/structures/SkyBlock/Auctions/Bid.js +1 -0
  61. package/src/structures/SkyBlock/Auctions/PartialAuction.js +1 -0
  62. package/src/structures/SkyBlock/PlayerBingo.js +56 -0
  63. package/src/structures/SkyBlock/SkyblockInventoryItem.js +86 -18
  64. package/src/structures/SkyBlock/SkyblockMember.js +252 -144
  65. package/src/structures/SkyBlock/SkyblockMuseum.js +60 -0
  66. package/src/structures/SkyBlock/SkyblockMuseumItem.js +54 -0
  67. package/src/structures/SkyBlock/SkyblockPet.js +1 -0
  68. package/src/structures/SkyBlock/SkyblockProfile.js +37 -23
  69. package/src/structures/SkyBlock/Static/Bingo.js +102 -0
  70. package/src/structures/SkyBlock/Static/BingoData.js +45 -0
  71. package/src/structures/SkyBlock/Static/Candidate.js +40 -0
  72. package/src/structures/SkyBlock/Static/FireSale.js +55 -0
  73. package/src/structures/SkyBlock/Static/Government.js +74 -0
  74. package/src/structures/SkyBlock/Static/Perk.js +24 -0
  75. package/src/structures/Static/Achievement.js +86 -0
  76. package/src/structures/Static/AchievementTier.js +33 -0
  77. package/src/structures/Static/Achievements.js +30 -0
  78. package/src/structures/Static/Challenges.js +29 -0
  79. package/src/structures/Static/GameAchievements.js +36 -0
  80. package/src/structures/Static/GameChallenges.js +40 -0
  81. package/src/structures/Static/GameQuests.js +24 -0
  82. package/src/structures/Static/GuildAchievements.js +34 -0
  83. package/src/structures/Static/Quest.js +66 -0
  84. package/src/structures/Static/Quests.js +31 -0
  85. package/src/structures/Status.js +2 -2
  86. package/src/utils/Constants.js +385 -42
  87. package/src/utils/SkyblockUtils.js +12 -7
  88. package/src/utils/guildExp.js +4 -1
  89. package/src/utils/removeSnakeCase.js +9 -2
  90. package/src/utils/romanize.js +32 -1
  91. package/src/utils/toIGN.js +6 -2
  92. package/src/utils/toUuid.js +10 -5
  93. package/typings/index.d.ts +989 -297
  94. /package/src/API/skyblock/{getSkyblockBazaar.js → getBazaar.js} +0 -0
  95. /package/src/API/skyblock/{getEndedSkyblockAuctions.js → getEndedAuctions.js} +0 -0
  96. /package/src/API/skyblock/{getSkyblockNews.js → getNews.js} +0 -0
@@ -6,6 +6,7 @@ const { duels_divisions } = require('../../utils/Constants');
6
6
 
7
7
  // eslint-disable-next-line require-jsdoc
8
8
  function getDivision(data, mode = null) {
9
+ // eslint-disable-next-line camelcase
9
10
  for (const div of duels_divisions.slice().reverse()) {
10
11
  const prestige = data[`${mode ? mode : 'all_modes'}_${div.key}_title_prestige`];
11
12
  if (prestige) {
@@ -39,10 +40,10 @@ class Duels {
39
40
  */
40
41
  constructor(data) {
41
42
  /**
42
- * Coins
43
+ * Tokens
43
44
  * @type {number}
44
45
  */
45
- this.coins = data.coins || 0;
46
+ this.tokens = data.coins || 0;
46
47
  /**
47
48
  * All modes division
48
49
  * @type {string|null}
@@ -102,19 +103,51 @@ class Duels {
102
103
  division: getDivision(data, 'uhc'),
103
104
  winstreak: data.current_uhc_winstreak || 0,
104
105
  bestWinstreak: data.best_uhc_winstreak || 0,
105
- kills: (data.uhc_duel_kills || 0) + (data.uhc_doubles_kills || 0) + (data.uhc_four_kills || 0) + (data.uhc_meetup_kills || 0),
106
- deaths: (data.uhc_duel_deaths || 0) + (data.uhc_doubles_deaths || 0) + (data.uhc_four_deaths || 0) + (data.uhc_meetup_deaths || 0),
106
+ kills:
107
+ (data.uhc_duel_kills || 0) +
108
+ (data.uhc_doubles_kills || 0) +
109
+ (data.uhc_four_kills || 0) +
110
+ (data.uhc_meetup_kills || 0),
111
+ deaths:
112
+ (data.uhc_duel_deaths || 0) +
113
+ (data.uhc_doubles_deaths || 0) +
114
+ (data.uhc_four_deaths || 0) +
115
+ (data.uhc_meetup_deaths || 0),
107
116
  KDRatio: divide(
108
- (data.uhc_duel_kills || 0) + (data.uhc_doubles_kills || 0) + (data.uhc_four_kills || 0) + (data.uhc_meetup_kills || 0),
109
- (data.uhc_duel_deaths || 0) + (data.uhc_doubles_deaths || 0) + (data.uhc_four_deaths || 0) + (data.uhc_meetup_deaths || 0)
117
+ (data.uhc_duel_kills || 0) +
118
+ (data.uhc_doubles_kills || 0) +
119
+ (data.uhc_four_kills || 0) +
120
+ (data.uhc_meetup_kills || 0),
121
+ (data.uhc_duel_deaths || 0) +
122
+ (data.uhc_doubles_deaths || 0) +
123
+ (data.uhc_four_deaths || 0) +
124
+ (data.uhc_meetup_deaths || 0)
110
125
  ),
111
- wins: (data.uhc_duel_wins || 0) + (data.uhc_doubles_wins || 0) + (data.uhc_four_wins || 0) + (data.uhc_meetup_wins || 0),
112
- losses: (data.uhc_duel_losses || 0) + (data.uhc_doubles_losses || 0) + (data.uhc_four_losses || 0) + (data.uhc_meetup_losses || 0),
126
+ wins:
127
+ (data.uhc_duel_wins || 0) +
128
+ (data.uhc_doubles_wins || 0) +
129
+ (data.uhc_four_wins || 0) +
130
+ (data.uhc_meetup_wins || 0),
131
+ losses:
132
+ (data.uhc_duel_losses || 0) +
133
+ (data.uhc_doubles_losses || 0) +
134
+ (data.uhc_four_losses || 0) +
135
+ (data.uhc_meetup_losses || 0),
113
136
  WLRatio: divide(
114
- (data.uhc_duel_wins || 0) + (data.uhc_doubles_wins || 0) + (data.uhc_four_wins || 0) + (data.uhc_meetup_wins || 0),
115
- (data.uhc_duel_losses || 0) + (data.uhc_doubles_losses || 0) + (data.uhc_four_losses || 0) + (data.uhc_meetup_losses || 0)
137
+ (data.uhc_duel_wins || 0) +
138
+ (data.uhc_doubles_wins || 0) +
139
+ (data.uhc_four_wins || 0) +
140
+ (data.uhc_meetup_wins || 0),
141
+ (data.uhc_duel_losses || 0) +
142
+ (data.uhc_doubles_losses || 0) +
143
+ (data.uhc_four_losses || 0) +
144
+ (data.uhc_meetup_losses || 0)
116
145
  ),
117
- playedGames: (data.uhc_duel_rounds_played || 0) + (data.uhc_doubles_rounds_played || 0) + (data.uhc_four_rounds_played || 0) + (data.uhc_meetup_rounds_played || 0)
146
+ playedGames:
147
+ (data.uhc_duel_rounds_played || 0) +
148
+ (data.uhc_doubles_rounds_played || 0) +
149
+ (data.uhc_four_rounds_played || 0) +
150
+ (data.uhc_meetup_rounds_played || 0)
118
151
  },
119
152
  '1v1': {
120
153
  division: getDivision(data, 'uhc'),
@@ -242,10 +275,16 @@ class Duels {
242
275
  bestWinstreak: data.best_op_winstreak || 0,
243
276
  kills: (data.op_duel_kills || 0) + (data.op_doubles_kills || 0),
244
277
  deaths: (data.op_duel_deaths || 0) + (data.op_doubles_deaths || 0),
245
- KDRatio: divide((data.op_duel_kills || 0) + (data.op_doubles_kills || 0), (data.op_duel_deaths || 0) + (data.op_doubles_deaths || 0)),
278
+ KDRatio: divide(
279
+ (data.op_duel_kills || 0) + (data.op_doubles_kills || 0),
280
+ (data.op_duel_deaths || 0) + (data.op_doubles_deaths || 0)
281
+ ),
246
282
  wins: (data.op_duel_wins || 0) + (data.op_doubles_wins || 0),
247
283
  losses: (data.op_duel_losses || 0) + (data.op_doubles_losses || 0),
248
- WLRatio: divide((data.op_duel_wins || 0) + (data.op_doubles_wins || 0), (data.op_duel_losses || 0) + (data.op_doubles_losses || 0)),
284
+ WLRatio: divide(
285
+ (data.op_duel_wins || 0) + (data.op_doubles_wins || 0),
286
+ (data.op_duel_losses || 0) + (data.op_doubles_losses || 0)
287
+ ),
249
288
  playedGames: (data.op_duel_rounds_played || 0) + (data.op_doubles_rounds_played || 0)
250
289
  },
251
290
  '1v1': {
@@ -284,10 +323,16 @@ class Duels {
284
323
  bestWinstreak: data.best_skywars_winstreak || 0,
285
324
  kills: (data.sw_duel_kills || 0) + (data.sw_doubles_kills || 0),
286
325
  deaths: (data.sw_duel_deaths || 0) + (data.sw_doubles_deaths || 0),
287
- KDRatio: divide((data.sw_duel_kills || 0) + (data.sw_doubles_kills || 0), (data.sw_duel_deaths || 0) + (data.sw_doubles_deaths || 0)),
326
+ KDRatio: divide(
327
+ (data.sw_duel_kills || 0) + (data.sw_doubles_kills || 0),
328
+ (data.sw_duel_deaths || 0) + (data.sw_doubles_deaths || 0)
329
+ ),
288
330
  wins: (data.sw_duel_wins || 0) + (data.sw_doubles_wins || 0),
289
331
  losses: (data.sw_duel_losses || 0) + (data.sw_doubles_losses || 0),
290
- WLRatio: divide((data.sw_duel_wins || 0) + (data.sw_doubles_wins || 0), (data.sw_duel_losses || 0) + (data.sw_doubles_losses || 0)),
332
+ WLRatio: divide(
333
+ (data.sw_duel_wins || 0) + (data.sw_doubles_wins || 0),
334
+ (data.sw_duel_losses || 0) + (data.sw_doubles_losses || 0)
335
+ ),
291
336
  playedGames: (data.sw_duel_rounds_played || 0) + (data.sw_doubles_rounds_played || 0)
292
337
  },
293
338
  '1v1': {
@@ -443,7 +488,15 @@ class Duels {
443
488
  (data.bridge_3v3v3v3_rounds_played || 0) +
444
489
  (data.bridge_four_rounds_played || 0) +
445
490
  (data.bridge_threes_bridge_rounds_played || 0) +
446
- (data.capture_threes_rounds_played || 0)
491
+ (data.capture_threes_rounds_played || 0),
492
+ goals:
493
+ (data.bridge_duel_goals || 0) +
494
+ (data.bridge_doubles_goals || 0) +
495
+ (data.bridge_2v2v2v2_goals || 0) +
496
+ (data.bridge_3v3v3v3_goals || 0) +
497
+ (data.bridge_four_goals || 0) +
498
+ (data.bridge_threes_bridge_goals || 0) +
499
+ (data.capture_threes_goals || 0)
447
500
  },
448
501
  '1v1': {
449
502
  division: getDivision(data, 'bridge'),
@@ -455,7 +508,8 @@ class Duels {
455
508
  wins: data.bridge_duel_wins || 0,
456
509
  losses: data.bridge_duel_losses || 0,
457
510
  WLRatio: divide(data.bridge_duel_wins, data.bridge_duel_losses),
458
- playedGames: data.bridge_duel_rounds_played || 0
511
+ playedGames: data.bridge_duel_rounds_played || 0,
512
+ goals: data.bridge_duel_goals || 0
459
513
  },
460
514
  '2v2': {
461
515
  division: getDivision(data, 'bridge'),
@@ -467,7 +521,8 @@ class Duels {
467
521
  wins: data.bridge_doubles_wins || 0,
468
522
  losses: data.bridge_doubles_losses || 0,
469
523
  WLRatio: divide(data.bridge_doubles_wins, data.bridge_doubles_losses),
470
- playedGames: data.bridge_doubles_rounds_played || 0
524
+ playedGames: data.bridge_doubles_rounds_played || 0,
525
+ goals: data.bridge_doubles_goals || 0
471
526
  },
472
527
  '3v3': {
473
528
  division: getDivision(data, 'bridge'),
@@ -479,7 +534,8 @@ class Duels {
479
534
  wins: data.bridge_threes_wins || 0,
480
535
  losses: data.bridge_threes_losses || 0,
481
536
  WLRatio: divide(data.bridge_threes_wins, data.bridge_threes_losses),
482
- playedGames: data.bridge_threes_rounds_played || 0
537
+ playedGames: data.bridge_threes_rounds_played || 0,
538
+ goals: data.bridge_threes_goals || 0
483
539
  },
484
540
  '2v2v2v2': {
485
541
  division: getDivision(data, 'bridge'),
@@ -491,7 +547,8 @@ class Duels {
491
547
  wins: data.bridge_2v2v2v2_wins || 0,
492
548
  losses: data.bridge_2v2v2v2_losses || 0,
493
549
  WLRatio: divide(data.bridge_2v2v2v2_wins, data.bridge_2v2v2v2_losses),
494
- playedGames: data.bridge_2v2v2v2_rounds_played || 0
550
+ playedGames: data.bridge_2v2v2v2_rounds_played || 0,
551
+ goals: data.bridge_2v2v2v2_goals || 0
495
552
  },
496
553
  '3v3v3v3': {
497
554
  division: getDivision(data, 'bridge'),
@@ -503,7 +560,8 @@ class Duels {
503
560
  wins: data.bridge_3v3v3v3_wins || 0,
504
561
  losses: data.bridge_3v3v3v3_losses || 0,
505
562
  WLRatio: divide(data.bridge_3v3v3v3_wins, data.bridge_3v3v3v3_losses),
506
- playedGames: data.bridge_3v3v3v3_rounds_played || 0
563
+ playedGames: data.bridge_3v3v3v3_rounds_played || 0,
564
+ goals: data.bridge_3v3v3v3_goals || 0
507
565
  },
508
566
  '4v4': {
509
567
  division: getDivision(data, 'bridge'),
@@ -515,7 +573,8 @@ class Duels {
515
573
  wins: data.bridge_four_wins || 0,
516
574
  losses: data.bridge_four_losses || 0,
517
575
  WLRatio: divide(data.bridge_four_wins, data.bridge_four_losses),
518
- playedGames: data.bridge_four_rounds_played || 0
576
+ playedGames: data.bridge_four_rounds_played || 0,
577
+ goals: data.bridge_four_goals || 0
519
578
  },
520
579
  // eslint-disable-next-line quote-props
521
580
  ctf: {
@@ -527,7 +586,8 @@ class Duels {
527
586
  losses: data.capture_threes_losses || 0,
528
587
  WLRatio: divide(data.capture_threes_wins, data.capture_threes_losses),
529
588
  captures: data.capture_threes_captures || 0,
530
- playedGames: data.capture_threes_rounds_played || 0
589
+ playedGames: data.capture_threes_rounds_played || 0,
590
+ goals: data.capture_threes_goals || 0
531
591
  }
532
592
  };
533
593
  /**
@@ -605,6 +665,7 @@ class Duels {
605
665
  * @property {number} KDRatio Kill/Death ratio
606
666
  * @property {number} WLRatio Win/Loss ratio
607
667
  * @property {number} playedGames Played games
668
+ * @property {number} goals Goals
608
669
  */
609
670
  /**
610
671
  * @typedef {object} DuelsBowspleef
@@ -66,7 +66,9 @@ class MegaWalls {
66
66
  * Final deaths
67
67
  * @type {number}
68
68
  */
69
- this.finalDeaths = isNaN((data.final_deaths || 0) + (data.finalDeaths || 0)) ? 0 : Math.floor((data.final_deaths || 0) + (data.finalDeaths || 0));
69
+ this.finalDeaths = isNaN((data.final_deaths || 0) + (data.finalDeaths || 0))
70
+ ? 0
71
+ : Math.floor((data.final_deaths || 0) + (data.finalDeaths || 0));
70
72
  /**
71
73
  * Final Kill Death ratio
72
74
  * @type {number}
@@ -8,10 +8,10 @@ class MurderMystery {
8
8
  */
9
9
  constructor(data) {
10
10
  /**
11
- * Coins
11
+ * Tokens
12
12
  * @type {number}
13
13
  */
14
- this.coins = data.coins || 0;
14
+ this.tokens = data.coins || 0;
15
15
  /**
16
16
  * Played games
17
17
  * @type {number}
@@ -1,4 +1,10 @@
1
- /* eslint-disable max-len */
1
+ const { decode } = require('../../utils/SkyblockUtils');
2
+ const PitInventoryItem = require('./PitInventoryItem');
3
+ const { divide } = require('../../utils');
4
+ const {
5
+ pit: { Levels, Prestiges }
6
+ } = require('../../utils/Constants');
7
+
2
8
  /**
3
9
  * Pit Class
4
10
  */
@@ -8,12 +14,235 @@ class Pit {
8
14
  * @param {Record<string,unknown>} data Data from API
9
15
  */
10
16
  constructor(data) {
17
+ const stats = data.pit_stats_ptl || {};
18
+ /**
19
+ * Prestige
20
+ * @type {number}
21
+ */
22
+ this.prestige = data.profile?.prestiges?.[data.profile?.prestiges?.length - 1].index || 0;
23
+ /**
24
+ * Xp
25
+ * @type {number}
26
+ */
27
+ this.xp = data.profile?.xp || 0;
28
+ /**
29
+ * Level
30
+ * @type {number}
31
+ */
32
+ this.level =
33
+ Pit.calcLevel(this.prestige, this.prestige > 0 ? this.xp - Prestiges[this.prestige - 1].SumXp : this.xp).level ??
34
+ 0;
11
35
  /**
12
36
  * Kills
13
37
  * @type {number}
14
38
  */
15
- this.kills = data.pit_stats_ptl.kills || 0;
39
+ this.kills = stats.kills || 0;
40
+ /**
41
+ * Deaths
42
+ * @type {number}
43
+ */
44
+ this.deaths = stats.deaths || 0;
45
+ /**
46
+ * KDR
47
+ * @type {number}
48
+ */
49
+ this.KDRatio = divide(this.kills, this.deaths);
50
+ /**
51
+ * Assists
52
+ * @type {number}
53
+ */
54
+ this.assists = stats.assists || 0;
55
+ /**
56
+ * Max kill streak
57
+ * @type {number}
58
+ */
59
+ this.maxKillStreak = stats.max_streak || 0;
60
+ /**
61
+ * Playtime in SECONDS
62
+ * @type {number}
63
+ */
64
+ this.playtime = (stats.playtime_minutes || 0) * 60;
65
+ /**
66
+ * Times the played joined Pit
67
+ * @type {number}
68
+ */
69
+ this.joins = stats.joins || 0;
70
+
71
+ // Damage section (overall)
72
+ /**
73
+ * Damage received overall
74
+ * @type {number}
75
+ */
76
+ this.damageReceived = stats.damage_received || 0;
77
+ /**
78
+ * Damage dealt overall
79
+ * @type {number}
80
+ */
81
+ this.damageDealt = stats.damage_dealt || 0;
82
+ /**
83
+ * Damage dealt to damage received ratio
84
+ * @type {number}
85
+ */
86
+ this.damageRatio = divide(this.damageDealt, this.damageReceived);
87
+ // Melee damage
88
+ /**
89
+ * Damage received in melee
90
+ * @type {number}
91
+ */
92
+ this.meleeDamageReceived = stats.melee_damage_received || 0;
93
+ /**
94
+ * Damage dealt in melee
95
+ * @type {number}
96
+ */
97
+ this.meleeDamageDealt = stats.melee_damage_dealt || 0;
98
+ /**
99
+ * Sword hits
100
+ * @type {number}
101
+ */
102
+ this.swordHits = stats.sword_hits || 0;
103
+ /**
104
+ * Left Clicks (sword clicks, hit or miss)
105
+ * @type {number}
106
+ */
107
+ this.leftClicks = stats.left_clicks || 0;
108
+ /**
109
+ * Hits divided by left clicks
110
+ * @type {number}
111
+ */
112
+ this.meleeAccuracy = divide(this.swordHits, this.leftClicks);
113
+ /**
114
+ * Damage dealt to damage received ratio in melee
115
+ * @type {number}
116
+ */
117
+ this.meleeDamageRatio = divide(this.meleeDamageDealt, this.meleeDamageReceived);
118
+ // Arrow damage
119
+ /**
120
+ * Damage received by arrow
121
+ * @type {number}
122
+ */
123
+ this.bowDamageReceived = stats.bow_damage_received || 0;
124
+ /**
125
+ * Damage dealt with bow
126
+ * @type {number}
127
+ */
128
+ this.bowDamageDealt = stats.bow_damage_dealt || 0;
129
+ /**
130
+ * Arrows hit
131
+ * @type {number}
132
+ */
133
+ this.arrowsHit = stats.arrow_hits || 0;
134
+ /**
135
+ * Arrows fired (hit + missed)
136
+ * @type {number}
137
+ */
138
+ this.arrowsFired = stats.arrows_fired || 0;
139
+ /**
140
+ * Hit divided by Fired
141
+ * @type {number}
142
+ */
143
+ this.bowAccuracy = divide(this.arrowsHit, this.arrowsFired);
144
+ /**
145
+ * Damage dealt to damage received ratio in ranged (bow/arrow)
146
+ * @type {number}
147
+ */
148
+ this.bowDamageRatio = divide(this.bowDamageDealt, this.bowDamageReceived);
149
+ /**
150
+ * Golden Heads eaten
151
+ * @type {number}
152
+ */
153
+ this.goldenHeadsEaten = stats.ghead_eaten || 0;
154
+ /**
155
+ * Pit Player Inv
156
+ * @return {Promise<PitInventoryItem[]>}
157
+ */
158
+ this.getInventory = async () => {
159
+ let inventory = data.profile.inv_contents;
160
+ if (!inventory) return [];
161
+
162
+ try {
163
+ inventory = await decode(inventory.data);
164
+ const edited = [];
165
+ for (let i = 1; i < inventory.length; i++) {
166
+ if (!inventory[i].id) {
167
+ continue;
168
+ }
169
+ edited.push(new PitInventoryItem(inventory[i]));
170
+ }
171
+ return edited;
172
+ } catch (e) {
173
+ return [];
174
+ }
175
+ };
176
+ /**
177
+ * Pit Player Ender Chest
178
+ * @return {Promise<PitInventoryItem[]>}
179
+ */
180
+ this.getEnterChest = async () => {
181
+ let chest = data.profile.inv_enderchest;
182
+ if (!chest) return [];
183
+
184
+ try {
185
+ chest = await decode(chest.data);
186
+ const edited = [];
187
+ for (let i = 1; i < chest.length; i++) {
188
+ if (!chest[i].id) {
189
+ continue;
190
+ }
191
+ edited.push(new PitInventoryItem(chest[i]));
192
+ }
193
+ return edited;
194
+ } catch (e) {
195
+ return [];
196
+ }
197
+ };
198
+ /**
199
+ * Pit Player Armor
200
+ * @return {Promise<PitArmor>}
201
+ */
202
+ this.getArmor = async () => {
203
+ const base64 = data.profile.inv_armor;
204
+ const decoded = await decode(base64.data);
205
+ const armor = {
206
+ helmet: decoded[3].id ? new PitInventoryItem(decoded[3]) : null,
207
+ chestplate: decoded[2].id ? new PitInventoryItem(decoded[2]) : null,
208
+ leggings: decoded[1].id ? new PitInventoryItem(decoded[1]) : null,
209
+ boots: decoded[0].id ? new PitInventoryItem(decoded[0]) : null
210
+ };
211
+ return armor;
212
+ };
213
+ }
214
+ // Credit https://github.com/PitPanda/PitPandaProduction/blob/b1971f56ea1aa8c829b722cbb33247c96591c0cb/structures/Pit.js
215
+ /**
216
+ * Converts XP to Level
217
+ * @param {number} prestige Prestige Level
218
+ * @param {number} xp Current xp into the prestige
219
+ * @return {number}
220
+ */
221
+ static calcLevel(prestige, xp) {
222
+ const multiplier = Prestiges[prestige].Multiplier;
223
+ let level = 0;
224
+ while (xp > 0 && level < 120) {
225
+ const levelXp = Levels[Math.floor(level / 10)].Xp * multiplier;
226
+ if (xp >= levelXp * 10) {
227
+ xp -= levelXp * 10;
228
+ level += 10;
229
+ } else {
230
+ const gain = Math.floor(xp / levelXp);
231
+ level += gain;
232
+ xp -= gain * levelXp;
233
+ xp = 0;
234
+ }
235
+ }
236
+ return level;
16
237
  }
17
238
  }
18
239
 
240
+ /**
241
+ * @typedef {object} PitArmor Equipped armor
242
+ * @property {PitInventoryItem|null} helmet Helmet
243
+ * @property {PitInventoryItem|null} chestplate Chestplate
244
+ * @property {PitInventoryItem|null} leggings Leggings
245
+ * @property {PitInventoryItem|null} boots Boots
246
+ */
247
+
19
248
  module.exports = Pit;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Item class
3
+ */
4
+ class PitInventoryItem {
5
+ /**
6
+ * @param {object} data Item data
7
+ */
8
+ constructor(data) {
9
+ /**
10
+ * Item ID
11
+ * @type {number}
12
+ */
13
+ this.itemId = data.id || 0;
14
+ /**
15
+ * Item count
16
+ * @type {number}
17
+ */
18
+ this.count = data.Count || 0;
19
+ /**
20
+ * Item name
21
+ * @type {string|null}
22
+ */
23
+ this.name = data?.tag?.display?.Name ? data.tag.display.Name.toString().replace(/§([1-9]|[a-f])|§/gm, '') : null;
24
+ /**
25
+ * Item lore
26
+ * @type {string|null}
27
+ */
28
+ this.lore = data?.tag?.display?.Lore ? data.tag.display.Lore.join('\n') : null;
29
+ /**
30
+ * Item lore
31
+ * @type {string[]}
32
+ */
33
+ this.loreArray = data?.tag?.display?.Lore ?? [];
34
+ /**
35
+ * Item Extra Attributes
36
+ * @type {object|null}
37
+ */
38
+
39
+ this.extraAttributes = data?.tag?.ExtraAttributes ?? null;
40
+ }
41
+ }
42
+
43
+ module.exports = PitInventoryItem;
@@ -59,16 +59,6 @@ class SkyWars {
59
59
  * @type {number}
60
60
  */
61
61
  this.wins = data.wins || 0;
62
- /**
63
- * Loot Chests
64
- * @type {number}
65
- */
66
- this.lootChests = data.skywars_chests || 0;
67
- /**
68
- * Opened Loot Chests
69
- * @type {number}
70
- */
71
- this.openedLootChests = data.SkyWars_openedChests || 0;
72
62
  /**
73
63
  * Heads
74
64
  * @type {number}
@@ -113,7 +103,12 @@ class SkyWars {
113
103
  * Games Played ( Total )
114
104
  * @type {number}
115
105
  */
116
- this.playedGames = (data.games_solo || 0) + (data.games_team || 0) + (data.games_mega || 0) + (data.games_mega_doubles || 0) + (data.games_lab || 0);
106
+ this.playedGames =
107
+ (data.games_solo || 0) +
108
+ (data.games_team || 0) +
109
+ (data.games_mega || 0) +
110
+ (data.games_mega_doubles || 0) +
111
+ (data.games_lab || 0);
117
112
  /**
118
113
  * Global Kill Death Ratio
119
114
  * @type {number}
@@ -207,8 +202,14 @@ class SkyWars {
207
202
  wins: (data.wins_mega || 0) + (data.wins_mega_doubles || 0),
208
203
  losses: (data.losses_mega || 0) + (data.losses_mega_doubles || 0),
209
204
  deaths: (data.deaths_mega || 0) + (data.deaths_mega_doubles || 0),
210
- KDRatio: divide((data.kills_mega || 0) + (data.kills_mega_doubles || 0), (data.deaths_mega || 0) + (data.deaths_mega_doubles || 0)),
211
- WLRatio: divide((data.wins_mega || 0) + (data.wins_mega_doubles || 0), (data.losses_mega || 0) + (data.losses_mega_doubles || 0))
205
+ KDRatio: divide(
206
+ (data.kills_mega || 0) + (data.kills_mega_doubles || 0),
207
+ (data.deaths_mega || 0) + (data.deaths_mega_doubles || 0)
208
+ ),
209
+ WLRatio: divide(
210
+ (data.wins_mega || 0) + (data.wins_mega_doubles || 0),
211
+ (data.losses_mega || 0) + (data.losses_mega_doubles || 0)
212
+ )
212
213
  },
213
214
  solo: {
214
215
  playedGames: data.games_mega || 0,
@@ -333,7 +334,11 @@ module.exports = SkyWars;
333
334
  // eslint-disable-next-line require-jsdoc
334
335
  function getSkyWarsPrestige(level) {
335
336
  if (level >= 60) return 'Mythic';
336
- return ['Iron', 'Iron', 'Gold', 'Diamond', 'Emerald', 'Sapphire', 'Ruby', 'Crystal', 'Opal', 'Amethyst', 'Rainbow'][Math.floor(level / 5)] || 'Iron';
337
+ return (
338
+ ['Iron', 'Iron', 'Gold', 'Diamond', 'Emerald', 'Sapphire', 'Ruby', 'Crystal', 'Opal', 'Amethyst', 'Rainbow'][
339
+ Math.floor(level / 5)
340
+ ] || 'Iron'
341
+ );
337
342
  }
338
343
  // eslint-disable-next-line require-jsdoc
339
344
  function getSkyWarsLevel(xp) {
@@ -70,7 +70,7 @@ class SmashHeroes {
70
70
  * Active class
71
71
  * @type {string}
72
72
  */
73
- this.activeClass = data.active_class ? data.active_class : null;
73
+ this.activeClass = data.active_class ?? null;
74
74
  /**
75
75
  * Stats for each class
76
76
  * @type {SmashHeroesClassStats[]|null}
@@ -67,7 +67,7 @@ class TNTGames {
67
67
  */
68
68
  this.wizards = {
69
69
  points: data.points_capture || 0,
70
- class: data.capture_class ? data.capture_class : null,
70
+ class: data.capture_class ?? null,
71
71
  kills: data.kills_capture || 0,
72
72
  assists: data.assists_capture || 0,
73
73
  wins: data.wins_capture || 0,
@@ -52,7 +52,13 @@ class UHC {
52
52
  * @type {number}
53
53
  */
54
54
  this.wins =
55
- (data.wins || 0) + (data.wins_solo || 0) + (data['wins_red vs blue'] || 0) + (data['wins_no diamonds'] || 0) + (data.wins_brawl || 0) + (data['wins_solo brawl'] || 0) + (data['wins_duo brawl'] || 0);
55
+ (data.wins || 0) +
56
+ (data.wins_solo || 0) +
57
+ (data['wins_red vs blue'] || 0) +
58
+ (data['wins_no diamonds'] || 0) +
59
+ (data.wins_brawl || 0) +
60
+ (data['wins_solo brawl'] || 0) +
61
+ (data['wins_duo brawl'] || 0);
56
62
  /**
57
63
  * Heads eaten
58
64
  * @type {number}
@@ -145,9 +151,21 @@ class UHC {
145
151
  // eslint-disable-next-line require-jsdoc
146
152
  function getStarLevel(data) {
147
153
  const kills =
148
- (data.kills || 0) + (data.kills_solo || 0) + (data['kills_red vs blue'] || 0) + (data['kills_no diamonds'] || 0) + (data.kills_brawl || 0) + (data['kills_solo brawl'] || 0) + (data['kills_duo brawl'] || 0);
154
+ (data.kills || 0) +
155
+ (data.kills_solo || 0) +
156
+ (data['kills_red vs blue'] || 0) +
157
+ (data['kills_no diamonds'] || 0) +
158
+ (data.kills_brawl || 0) +
159
+ (data['kills_solo brawl'] || 0) +
160
+ (data['kills_duo brawl'] || 0);
149
161
  const wins =
150
- (data.wins || 0) + (data.wins_solo || 0) + (data['wins_red vs blue'] || 0) + (data['wins_no diamonds'] || 0) + (data.wins_brawl || 0) + (data['wins_solo brawl'] || 0) + (data['wins_duo brawl'] || 0);
162
+ (data.wins || 0) +
163
+ (data.wins_solo || 0) +
164
+ (data['wins_red vs blue'] || 0) +
165
+ (data['wins_no diamonds'] || 0) +
166
+ (data.wins_brawl || 0) +
167
+ (data['wins_solo brawl'] || 0) +
168
+ (data['wins_duo brawl'] || 0);
151
169
  const sum = kills * 1 + wins * 10;
152
170
  let starLevel = 1;
153
171
  const sums = [0, 1, 6, 21, 46, 96, 171, 271, 521, 1021, 1321, 1621, 1921, 2221, 2521, Infinity];
@@ -83,7 +83,7 @@ class WoolWars {
83
83
  */
84
84
  static generateStatsFor(data, _class) {
85
85
  // N.B i called it _class instead of class because reserved keyword
86
- const workingData = (_class ? data?.['classes'][_class] : data) || {};
86
+ const workingData = (_class ? data?.['classes']?.[_class] : data) || {};
87
87
  return {
88
88
  roundWins: workingData.wins || 0,
89
89
  gamesPlayed: workingData.games_played || 0,