hypixel-api-reborn 9.0.3 → 10.0.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 (40) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/src/API/getAPIStatus.js +2 -1
  4. package/src/API/getBoosters.js +1 -0
  5. package/src/API/getFriends.js +1 -0
  6. package/src/API/getGameCounts.js +1 -0
  7. package/src/API/getGuild.js +1 -0
  8. package/src/API/getKeyInfo.js +1 -0
  9. package/src/API/getLeaderboards.js +1 -0
  10. package/src/API/getPlayer.js +2 -1
  11. package/src/API/getRankedSkyWars.js +1 -0
  12. package/src/API/getRecentGames.js +1 -0
  13. package/src/API/getStatus.js +1 -0
  14. package/src/API/getWatchdogStats.js +1 -0
  15. package/src/API/index.js +23 -9
  16. package/src/API/skyblock/getEndedSkyblockAuctions.js +1 -0
  17. package/src/API/skyblock/getSkyblockAuctionsByPlayer.js +1 -0
  18. package/src/API/skyblock/getSkyblockBazaar.js +1 -0
  19. package/src/API/skyblock/getSkyblockMember.js +1 -0
  20. package/src/API/skyblock/getSkyblockNews.js +1 -0
  21. package/src/API/skyblock/getSkyblockProfiles.js +1 -0
  22. package/src/Client.js +34 -14
  23. package/src/Errors.js +2 -1
  24. package/src/Private/defaultCache.js +78 -0
  25. package/src/Private/requests.js +24 -9
  26. package/src/Private/updater.js +4 -1
  27. package/src/Private/validate.js +3 -3
  28. package/src/structures/MiniGames/BedWars.js +22 -0
  29. package/src/structures/MiniGames/Duels.js +216 -46
  30. package/src/structures/MiniGames/TurboKartRacers.js +105 -0
  31. package/src/structures/Player.js +4 -8
  32. package/src/structures/ServerInfo.js +1 -1
  33. package/src/structures/SkyBlock/News/SkyblockNews.js +4 -4
  34. package/src/structures/SkyBlock/SkyblockInventoryItem.js +29 -1
  35. package/src/structures/SkyBlock/SkyblockMember.js +25 -13
  36. package/src/utils/Constants.js +14 -0
  37. package/src/utils/index.js +13 -9
  38. package/src/utils/rgbToHexColor.js +8 -0
  39. package/src/utils/romanize.js +13 -0
  40. package/typings/index.d.ts +375 -356
@@ -1,39 +1,41 @@
1
1
  /* eslint-disable max-len */
2
2
  const divide = require('../../utils/divide');
3
+ const romanize = require('../../utils/romanize');
4
+ // eslint-disable-next-line camelcase
5
+ const { duels_divisions } = require('../../utils/Constants');
6
+
3
7
  /**
4
- * @param {string} string
5
- * @return {string}
8
+ * @param {object<string,any>} data
9
+ * @param {string|null} mode
10
+ * @returns {string|undefined}
6
11
  */
7
- function capitalize (string) {
8
- return string.charAt(0).toUpperCase() + string.slice(1);
12
+ function getDivision (data, mode) {
13
+ for (const div of duels_divisions.slice().reverse()) {
14
+ const prestige = data[`${mode ? mode : 'all_modes'}_${div.key}_title_prestige`];
15
+ if (prestige !== undefined) {
16
+ return `${div.name} ${romanize(prestige)}`;
17
+ }
18
+ }
19
+ return null;
9
20
  }
10
- const numerals = {
11
- 1: 'I',
12
- 2: 'II',
13
- 3: 'III',
14
- 4: 'IV',
15
- 5: 'V',
16
- 6: 'VI',
17
- 7: 'VII',
18
- 8: 'VIII',
19
- 9: 'IX',
20
- 10: 'X'
21
- };
22
21
  /**
23
- * @param {object} data
24
- * @return {string|null}
22
+ * @param {object<string,any>} data
23
+ * @return {{kills:number,deaths:number}}
25
24
  */
26
- function cosmeticTitlePrestige (data) {
27
- if (data.active_cosmetictitle === 'custom') {
28
- if (!data.equipped_custom_titles) return null;
29
- return `${data.equipped_custom_titles.replace([0-9a-fl]{1}/g, '')}`;
30
- }
31
- if (data.active_cosmetictitle) {
32
- const prestige = data[`${data.active_cosmetictitle.split('_').reverse().join('_')}_title_prestige`] || 1;
33
- return `${capitalize(data.active_cosmetictitle.split('_')[1])} ${capitalize(data.active_cosmetictitle.split('_')[0])} ${numerals[prestige]}`;
34
- } else {
35
- return null;
25
+ function getTotalKillsDeaths (data) {
26
+ let totalDeaths = 0;
27
+ let totalKills = 0;
28
+ for (const [k, v] of Object.entries(data)) {
29
+ if (k.includes('deaths') && k !== 'deaths') {
30
+ totalDeaths += v;
31
+ } else if (k.includes('kills') && k !== 'kills') {
32
+ totalKills += v;
33
+ }
36
34
  }
35
+ return {
36
+ kills: totalKills,
37
+ deaths: totalDeaths
38
+ };
37
39
  }
38
40
  /**
39
41
  * Duels class
@@ -49,20 +51,20 @@ class Duels {
49
51
  */
50
52
  this.coins = data.coins || 0;
51
53
  /**
52
- * Cosmetic title
54
+ * All modes division
53
55
  * @type {string|null}
54
56
  */
55
- this.title = cosmeticTitlePrestige(data);
57
+ this.division = getDivision(data);
56
58
  /**
57
59
  * Kills
58
60
  * @type {number}
59
61
  */
60
- this.kills = (((data.uhc_duel_kills || 0) + (data.uhc_doubles_kills || 0) + (data.uhc_four_kills || 0) + (data.uhc_meetup_kills || 0)) + (data.mw_duel_kills || 0) + ((data.op_duel_kills || 0) + (data.op_doubles_kills || 0)) + (((data.sw_duel_kills || 0) + (data.sw_doubles_kills || 0))) + (data.sumo_duel_kills || 0) + (data.classic_duel_kills || 0) + (data.combo_duel_kills || 0) + ((data.bridge_duel_bridge_kills || 0) + (data.bridge_doubles_bridge_kills || 0) + (data.bridge_2v2v2v2_bridge_kills || 0) + (data.bridge_3v3v3v3_bridge_kills || 0) + (data.bridge_four_bridge_kills || 0)) + (data.blitz_duel_kills || 0) + (data.potion_duel_kills || 0) + (data.bow_duel_kills || 0));
62
+ this.kills = getTotalKillsDeaths(data).kills;
61
63
  /**
62
64
  * Deaths
63
65
  * @type {number}
64
66
  */
65
- this.deaths = (((data.uhc_duel_deaths || 0) + (data.uhc_doubles_deaths || 0) + (data.uhc_four_deaths || 0) + (data.uhc_meetup_deaths || 0)) + (data.mw_duel_deaths || 0) + ((data.op_duel_deaths || 0) + (data.op_doubles_deaths || 0)) + ((data.sw_duel_deaths || 0) + (data.sw_doubles_deaths || 0)) + (data.sumo_duel_deaths || 0) + (data.classic_duel_deaths || 0) + (data.combo_duel_deaths || 0) + ((data.bridge_duel_bridge_deaths || 0) + (data.bridge_doubles_bridge_deaths || 0) + (data.bridge_2v2v2v2_bridge_deaths || 0) + (data.bridge_3v3v3v3_bridge_deaths || 0) + (data.bridge_four_bridge_deaths || 0)) + (data.blitz_duel_deaths || 0) + (data.potion_duel_deaths || 0) + (data.bow_duel_deaths || 0));
67
+ this.deaths = getTotalKillsDeaths(data).deaths;
66
68
  /**
67
69
  * Kill Death ratio
68
70
  * @type {number}
@@ -104,6 +106,7 @@ class Duels {
104
106
  */
105
107
  this.uhc = {
106
108
  'overall': {
109
+ division: getDivision(data, 'uhc'),
107
110
  winstreak: data.current_uhc_winstreak || 0,
108
111
  bestWinstreak: data.best_uhc_winstreak || 0,
109
112
  kills: (data.uhc_duel_kills || 0) + (data.uhc_doubles_kills || 0) + (data.uhc_four_kills || 0) + (data.uhc_meetup_kills || 0),
@@ -115,6 +118,7 @@ class Duels {
115
118
  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)
116
119
  },
117
120
  '1v1': {
121
+ division: getDivision(data, 'uhc'),
118
122
  winstreak: data.current_winstreak_mode_uhc_duel || 0,
119
123
  bestWinstreak: data.best_winstreak_mode_uhc_duel || 0,
120
124
  kills: data.uhc_duel_kills || 0,
@@ -126,6 +130,7 @@ class Duels {
126
130
  playedGames: data.uhc_duel_rounds_played || 0
127
131
  },
128
132
  '2v2': {
133
+ division: getDivision(data, 'uhc'),
129
134
  winstreak: data.current_winstreak_mode_uhc_doubles || 0,
130
135
  bestWinstreak: data.best_winstreak_mode_uhc_doubles || 0,
131
136
  kills: data.uhc_doubles_kills || 0,
@@ -137,6 +142,7 @@ class Duels {
137
142
  playedGames: data.uhc_doubles_rounds_played || 0
138
143
  },
139
144
  '4v4': {
145
+ division: getDivision(data, 'uhc'),
140
146
  winstreak: data.current_winstreak_mode_uhc_four || 0,
141
147
  bestWinstreak: data.best_winstreak_mode_uhc_four || 0,
142
148
  kills: data.uhc_four_kills || 0,
@@ -148,6 +154,7 @@ class Duels {
148
154
  playedGames: data.uhc_four_rounds_played || 0
149
155
  },
150
156
  'meetup': {
157
+ division: getDivision(data, 'uhc'),
151
158
  winstreak: data.current_winstreak_mode_uhc_meetup || 0,
152
159
  bestWinstreak: data.best_winstreak_mode_uhc_meetup || 0,
153
160
  kills: data.uhc_meetup_kills || 0,
@@ -159,11 +166,62 @@ class Duels {
159
166
  playedGames: data.uhc_meetup_rounds_played || 0
160
167
  }
161
168
  };
169
+ /**
170
+ * @type {DuelsParkour}
171
+ */
172
+ this.parkour = {
173
+ division: getDivision(data, 'parkour'),
174
+ deaths: data.parkour_eight_deaths || 0,
175
+ wins: data.parkour_eight_wins || 0,
176
+ losses: data.parkour_eight_losses || 0,
177
+ WLRatio: divide(data.parkour_eight_wins, data.parkour_eight_losses),
178
+ playedGames: data.parkour_eight_rounds_played || 0
179
+ };
180
+ /**
181
+ * @type {DuelsBoxing}
182
+ */
183
+ this.boxing = {
184
+ division: getDivision(data, 'boxing'),
185
+ kills: data.boxing_duel_kills || 0,
186
+ wins: data.boxing_duel_wins || 0,
187
+ losses: data.boxing_duel_losses || 0,
188
+ WLRatio: divide(data.boxing_duel_wins, data.boxing_duel_losses),
189
+ playedGames: data.boxing_duel_rounds_played || 0,
190
+ meleeSwings: data.boxing_duel_melee_swings || 0,
191
+ meleeHits: data.boxing_duel_melee_hits || 0
192
+ };
193
+ /**
194
+ * @type {DuelsBowspleef}
195
+ */
196
+ this.bowspleef = {
197
+ division: getDivision(data, 'tnt_games'),
198
+ winstreak: data.current_tnt_games_winstreak || 0,
199
+ bestWinstreak: data.best_tnt_games_winstreak || 0,
200
+ bowShots: data.bowspleef_duel_bow_shots || 0,
201
+ deaths: data.bowspleef_duel_deaths || 0,
202
+ wins: data.bowspleef_duel_wins || 0,
203
+ losses: data.bowspleef_duel_losses || 0,
204
+ WLRatio: divide((data.bowspleef_duel_wins || 0), (data.bowspleef_duel_losses || 0)),
205
+ playedGames: data.bowspleef_duel_rounds_played || 0
206
+ };
207
+ /**
208
+ * @type {DuelsArena}
209
+ */
210
+ this.arena = {
211
+ kills: data.duel_arena_kills || 0,
212
+ deaths: data.duel_arena_deaths || 0,
213
+ KDRatio: divide(data.duel_arena_kills, data.duel_arena_deaths),
214
+ wins: data.duel_arena_wins || 0,
215
+ losses: data.duel_arena_losses || 0,
216
+ WLRatio: divide(data.duel_arena_wins, data.duel_arena_losses),
217
+ playedGames: data.duel_arena_rounds_played || 0
218
+ };
162
219
  /**
163
220
  * MegaWalls duels stats
164
221
  * @type {DuelsModeStats}
165
222
  */
166
223
  this.megawalls = {
224
+ division: getDivision(data, 'mega_walls'),
167
225
  winstreak: data.current_winstreak_mode_mw_duel || 0,
168
226
  bestWinstreak: data.best_winstreak_mode_mw_duel || 0,
169
227
  kills: data.mw_duel_kills || 0,
@@ -180,6 +238,7 @@ class Duels {
180
238
  */
181
239
  this.op = {
182
240
  'overall': {
241
+ division: getDivision(data, 'op'),
183
242
  winstreak: data.current_op_winstreak || 0,
184
243
  bestWinstreak: data.best_op_winstreak || 0,
185
244
  kills: (data.op_duel_kills || 0) + (data.op_doubles_kills || 0),
@@ -191,6 +250,7 @@ class Duels {
191
250
  playedGames: (data.op_duel_rounds_played || 0) + (data.op_doubles_rounds_played || 0)
192
251
  },
193
252
  '1v1': {
253
+ division: getDivision(data, 'op'),
194
254
  winstreak: data.current_winstreak_mode_op_duel || 0,
195
255
  bestWinstreak: data.best_winstreak_mode_op_duel || 0,
196
256
  kills: data.op_duel_kills || 0,
@@ -202,6 +262,7 @@ class Duels {
202
262
  playedGames: data.op_duel_rounds_played || 0
203
263
  },
204
264
  '2v2': {
265
+ division: getDivision(data, 'op'),
205
266
  winstreak: data.current_winstreak_mode_op_doubles || 0,
206
267
  bestWinstreak: data.best_winstreak_mode_op_doubles || 0,
207
268
  kills: data.op_doubles_kills || 0,
@@ -219,6 +280,7 @@ class Duels {
219
280
  */
220
281
  this.skywars = {
221
282
  'overall': {
283
+ division: getDivision(data, 'skywars'),
222
284
  winstreak: data.current_skywars_winstreak || 0,
223
285
  bestWinstreak: data.best_skywars_winstreak || 0,
224
286
  kills: ((data.sw_duel_kills || 0) + (data.sw_doubles_kills || 0)),
@@ -230,6 +292,7 @@ class Duels {
230
292
  playedGames: (data.sw_duel_rounds_played || 0) + (data.sw_doubles_rounds_played || 0)
231
293
  },
232
294
  '1v1': {
295
+ division: getDivision(data, 'skywars'),
233
296
  winstreak: data.current_winstreak_mode_sw_duel || 0,
234
297
  bestWinstreak: data.best_winstreak_mode_sw_duel || 0,
235
298
  kills: data.sw_duel_kills || 0,
@@ -241,6 +304,7 @@ class Duels {
241
304
  playedGames: data.sw_duel_rounds_played || 0
242
305
  },
243
306
  '2v2': {
307
+ division: getDivision(data, 'skywars'),
244
308
  winstreak: data.current_winstreak_mode_sw_doubles || 0,
245
309
  bestWinstreak: data.best_winstreak_mode_sw_doubles || 0,
246
310
  kills: data.sw_doubles_kills || 0,
@@ -257,6 +321,7 @@ class Duels {
257
321
  * @type {DuelsModeStats}
258
322
  */
259
323
  this.sumo = {
324
+ division: getDivision(data, 'sumo'),
260
325
  winstreak: data.current_winstreak_mode_sumo_duel || 0,
261
326
  bestWinstreak: data.best_winstreak_mode_sumo_duel || 0,
262
327
  kills: data.sumo_duel_kills || 0,
@@ -272,6 +337,7 @@ class Duels {
272
337
  * @type {DuelsModeStats}
273
338
  */
274
339
  this.classic = {
340
+ division: getDivision(data, 'classic'),
275
341
  winstreak: data.current_winstreak_mode_classic_duel || 0,
276
342
  bestWinstreak: data.best_winstreak_mode_classic_duel || 0,
277
343
  kills: data.classic_duel_kills || 0,
@@ -287,6 +353,7 @@ class Duels {
287
353
  * @type {DuelsModeStats}
288
354
  */
289
355
  this.combo = {
356
+ division: getDivision(data, 'combo'),
290
357
  winstreak: data.current_winstreak_mode_combo_duel || 0,
291
358
  bestWinstreak: data.best_winstreak_mode_combo_duel || 0,
292
359
  kills: data.combo_duel_kills || 0,
@@ -303,17 +370,19 @@ class Duels {
303
370
  */
304
371
  this.bridge = {
305
372
  'overall': {
373
+ division: getDivision(data, 'bridge'),
306
374
  winstreak: data.current_bridge_winstreak || 0,
307
375
  bestWinstreak: data.best_bridge_winstreak || 0,
308
- kills: ((data.bridge_duel_bridge_kills || 0) + (data.bridge_doubles_bridge_kills || 0) + (data.bridge_2v2v2v2_bridge_kills || 0) + (data.bridge_3v3v3v3_bridge_kills || 0) + (data.bridge_four_bridge_kills || 0)),
309
- deaths: ((data.bridge_duel_bridge_deaths || 0) + (data.bridge_doubles_bridge_deaths || 0) + (data.bridge_2v2v2v2_bridge_deaths || 0) + (data.bridge_3v3v3v3_bridge_deaths || 0) + (data.bridge_four_bridge_deaths || 0)),
310
- KDRatio: divide(((data.bridge_duel_bridge_kills || 0) + (data.bridge_doubles_bridge_kills || 0) + (data.bridge_2v2v2v2_bridge_kills || 0) + (data.bridge_3v3v3v3_bridge_kills || 0) + (data.bridge_four_bridge_kills || 0)), ((data.bridge_duel_bridge_deaths || 0) + (data.bridge_doubles_bridge_deaths || 0) + (data.bridge_2v2v2v2_bridge_deaths || 0) + (data.bridge_3v3v3v3_bridge_deaths || 0) + (data.bridge_four_bridge_deaths || 0))),
311
- wins: ((data.bridge_duel_wins || 0) + (data.bridge_doubles_wins || 0) + (data.bridge_2v2v2v2_wins || 0) + (data.bridge_3v3v3v3_wins || 0) + (data.bridge_four_wins || 0)),
312
- losses: ((data.bridge_duel_losses || 0) + (data.bridge_doubles_losses || 0) + (data.bridge_2v2v2v2_losses || 0) + (data.bridge_3v3v3v3_losses || 0) + (data.bridge_four_losses || 0)),
313
- WLRatio: divide(((data.bridge_duel_wins || 0) + (data.bridge_doubles_wins || 0) + (data.bridge_2v2v2v2_wins || 0) + (data.bridge_3v3v3v3_wins || 0) + (data.bridge_four_wins || 0)), ((data.bridge_duel_losses || 0) + (data.bridge_doubles_losses || 0) + (data.bridge_2v2v2v2_losses || 0) + (data.bridge_3v3v3v3_losses || 0) + (data.bridge_four_losses || 0))),
314
- playedGames: ((data.bridge_duel_rounds_played || 0) + (data.bridge_doubles_rounds_played || 0) + (data.bridge_2v2v2v2_rounds_played || 0) + (data.bridge_3v3v3v3_rounds_played || 0) + (data.bridge_four_rounds_played || 0))
376
+ kills: ((data.bridge_duel_bridge_kills || 0) + (data.bridge_doubles_bridge_kills || 0) + (data.bridge_2v2v2v2_bridge_kills || 0) + (data.bridge_3v3v3v3_bridge_kills || 0) + (data.bridge_four_bridge_kills || 0) + (data.bridge_threes_bridge_kills || 0) + (data.capture_threes_bridge_kills || 0)),
377
+ deaths: ((data.bridge_duel_bridge_deaths || 0) + (data.bridge_doubles_bridge_deaths || 0) + (data.bridge_2v2v2v2_bridge_deaths || 0) + (data.bridge_3v3v3v3_bridge_deaths || 0) + (data.bridge_four_bridge_deaths || 0) + (data.bridge_threes_bridge_deaths || 0) + (data.capture_threes_bridge_deaths || 0)),
378
+ KDRatio: divide(((data.bridge_duel_bridge_kills || 0) + (data.bridge_doubles_bridge_kills || 0) + (data.bridge_2v2v2v2_bridge_kills || 0) + (data.bridge_3v3v3v3_bridge_kills || 0) + (data.bridge_four_bridge_kills || 0) + (data.bridge_threes_bridge_kills || 0) + (data.capture_threes_bridge_kills || 0)), ((data.bridge_duel_bridge_deaths || 0) + (data.bridge_doubles_bridge_deaths || 0) + (data.bridge_2v2v2v2_bridge_deaths || 0) + (data.bridge_3v3v3v3_bridge_deaths || 0) + (data.bridge_four_bridge_deaths || 0) + (data.bridge_threes_bridge_deaths || 0) + (data.capture_threes_bridge_deaths || 0))),
379
+ wins: ((data.bridge_duel_wins || 0) + (data.bridge_doubles_wins || 0) + (data.bridge_2v2v2v2_wins || 0) + (data.bridge_3v3v3v3_wins || 0) + (data.bridge_four_wins || 0) + (data.bridge_threes_bridge_wins || 0) + (data.capture_threes_wins || 0)),
380
+ losses: ((data.bridge_duel_losses || 0) + (data.bridge_doubles_losses || 0) + (data.bridge_2v2v2v2_losses || 0) + (data.bridge_3v3v3v3_losses || 0) + (data.bridge_four_losses || 0) + (data.bridge_threes_bridge_losses || 0) + (data.capture_threes_bridge_losses || 0)),
381
+ WLRatio: divide(((data.bridge_duel_wins || 0) + (data.bridge_doubles_wins || 0) + (data.bridge_2v2v2v2_wins || 0) + (data.bridge_3v3v3v3_wins || 0) + (data.bridge_four_wins || 0) + (data.bridge_threes_bridge_wins || 0) + (data.capture_threes_wins || 0)), ((data.bridge_duel_losses || 0) + (data.bridge_doubles_losses || 0) + (data.bridge_2v2v2v2_losses || 0) + (data.bridge_3v3v3v3_losses || 0) + (data.bridge_four_losses || 0) + (data.bridge_threes_bridge_losses || 0) + (data.capture_threes_bridge_losses || 0))),
382
+ playedGames: ((data.bridge_duel_rounds_played || 0) + (data.bridge_doubles_rounds_played || 0) + (data.bridge_2v2v2v2_rounds_played || 0) + (data.bridge_3v3v3v3_rounds_played || 0) + (data.bridge_four_rounds_played || 0) + (data.bridge_threes_bridge_rounds_played || 0) + (data.capture_threes_rounds_played || 0))
315
383
  },
316
384
  '1v1': {
385
+ division: getDivision(data, 'bridge'),
317
386
  winstreak: data.current_winstreak_mode_bridge_duel || 0,
318
387
  bestWinstreak: data.best_winstreak_mode_bridge_duel || 0,
319
388
  kills: data.bridge_duel_bridge_kills || 0,
@@ -325,6 +394,7 @@ class Duels {
325
394
  playedGames: data.bridge_duel_rounds_played || 0
326
395
  },
327
396
  '2v2': {
397
+ division: getDivision(data, 'bridge'),
328
398
  winstreak: data.current_winstreak_mode_bridge_doubles || 0,
329
399
  bestWinstreak: data.best_winstreak_mode_bridge_doubles || 0,
330
400
  kills: data.bridge_doubles_bridge_kills || 0,
@@ -335,7 +405,20 @@ class Duels {
335
405
  WLRatio: divide(data.bridge_doubles_wins, data.bridge_doubles_losses),
336
406
  playedGames: data.bridge_doubles_rounds_played || 0
337
407
  },
408
+ '3v3': {
409
+ division: getDivision(data, 'bridge'),
410
+ winstreak: data.current_winstreak_mode_bridge_threes || 0,
411
+ bestWinstreak: data.best_winstreak_mode_bridge_threes || 0,
412
+ kills: data.bridge_threes_bridge_kills || 0,
413
+ deaths: data.bridge_threes_bridge_deaths || 0,
414
+ KDRatio: divide(data.bridge_threes_bridge_kills, data.bridge_threes_bridge_deaths),
415
+ wins: data.bridge_threes_wins || 0,
416
+ losses: data.bridge_threes_losses || 0,
417
+ WLRatio: divide(data.bridge_threes_wins, data.bridge_threes_losses),
418
+ playedGames: data.bridge_threes_rounds_played || 0
419
+ },
338
420
  '2v2v2v2': {
421
+ division: getDivision(data, 'bridge'),
339
422
  winstreak: data.current_winstreak_mode_bridge_2v2v2v2 || 0,
340
423
  bestWinstreak: data.best_winstreak_mode_bridge_2v2v2v2 || 0,
341
424
  kills: data.bridge_2v2v2v2_bridge_kills || 0,
@@ -347,6 +430,7 @@ class Duels {
347
430
  playedGames: data.bridge_2v2v2v2_rounds_played || 0
348
431
  },
349
432
  '3v3v3v3': {
433
+ division: getDivision(data, 'bridge'),
350
434
  winstreak: data.current_winstreak_mode_bridge_3v3v3v3 || 0,
351
435
  bestWinstreak: data.best_winstreak_mode_bridge_3v3v3v3 || 0,
352
436
  kills: data.bridge_3v3v3v3_bridge_kills || 0,
@@ -358,6 +442,7 @@ class Duels {
358
442
  playedGames: data.bridge_3v3v3v3_rounds_played || 0
359
443
  },
360
444
  '4v4': {
445
+ division: getDivision(data, 'bridge'),
361
446
  winstreak: data.current_winstreak_mode_bridge_four || 0,
362
447
  bestWinstreak: data.best_winstreak_mode_bridge_four || 0,
363
448
  kills: data.bridge_four_bridge_kills || 0,
@@ -367,6 +452,18 @@ class Duels {
367
452
  losses: data.bridge_four_losses || 0,
368
453
  WLRatio: divide(data.bridge_four_wins, data.bridge_four_losses),
369
454
  playedGames: data.bridge_four_rounds_played || 0
455
+ },
456
+ // eslint-disable-next-line quote-props
457
+ ctf: {
458
+ division: getDivision(data, 'bridge'),
459
+ kills: data.capture_threes_bridge_kills || 0,
460
+ deaths: data.capture_threes_bridge_deaths || 0,
461
+ KDRatio: divide(data.capture_threes_bridge_kills, data.capture_threes_bridge_deaths),
462
+ wins: data.capture_threes_wins || 0,
463
+ losses: data.capture_threes_losses || 0,
464
+ WLRatio: divide(data.capture_threes_wins, data.capture_threes_losses),
465
+ captures: data.capture_threes_captures || 0,
466
+ playedGames: data.capture_threes_rounds_played || 0
370
467
  }
371
468
  };
372
469
  /**
@@ -374,6 +471,7 @@ class Duels {
374
471
  * @type {DuelsModeStats}
375
472
  */
376
473
  this.blitz = {
474
+ division: getDivision(data, 'blitz'),
377
475
  winstreak: data.current_winstreak_mode_blitz_duel || 0,
378
476
  bestWinstreak: data.best_winstreak_mode_blitz_duel || 0,
379
477
  kills: data.blitz_duel_kills || 0,
@@ -389,6 +487,7 @@ class Duels {
389
487
  * @type {DuelsModeStats}
390
488
  */
391
489
  this.nodebuff = {
490
+ division: getDivision(data, 'no_debuff'),
392
491
  winstreak: data.current_winstreak_mode_potion_duel || 0,
393
492
  bestWinstreak: data.best_winstreak_mode_potion_duel || 0,
394
493
  kills: data.potion_duel_kills || 0,
@@ -404,6 +503,7 @@ class Duels {
404
503
  * @type {DuelsModeStats}
405
504
  */
406
505
  this.bow = {
506
+ division: getDivision(data, 'bow'),
407
507
  winstreak: data.current_winstreak_mode_bow_duel || 0,
408
508
  bestWinstreak: data.best_winstreak_mode_bow_duel || 0,
409
509
  kills: data.bow_duel_kills || 0,
@@ -418,8 +518,76 @@ class Duels {
418
518
  }
419
519
  /**
420
520
  * @typedef {object} DuelsModeStats
421
- * @property {number} winstreak Current winstreak
521
+ * @property {number|undefined} winstreak Current winstreak
522
+ * @property {number|undefined} bestWinstreak Best winstreak
523
+ * @property {string|null} division Division
524
+ * @property {number} kills Kills
525
+ * @property {number} deaths Deaths
526
+ * @property {number} wins Wins
527
+ * @property {number} losses Losses
528
+ * @property {number} KDRatio Kill/Death ratio
529
+ * @property {number} WLRatio Win/Loss ratio
530
+ * @property {number} playedGames Played games
531
+ */
532
+ /**
533
+ * @typedef {object} BridgeModeStats
534
+ * @property {number|undefined} winstreak Current winstreak
535
+ * @property {number|undefined} bestWinstreak Best winstreak
536
+ * @property {string|null} division Division
537
+ * @property {number} kills Kills
538
+ * @property {number} deaths Deaths
539
+ * @property {number} wins Wins
540
+ * @property {number} losses Losses
541
+ * @property {number} KDRatio Kill/Death ratio
542
+ * @property {number} WLRatio Win/Loss ratio
543
+ * @property {number} playedGames Played games
544
+ * @property {number} goals Goals
545
+ */
546
+ /**
547
+ * @typedef {object} DuelsBowspleef
548
+ * @property {string|null} division Division
549
+ * @property {number} winstreak Winstreak
422
550
  * @property {number} bestWinstreak Best winstreak
551
+ * @property {number} bowShots Bow shots
552
+ * @property {number} deaths Deaths
553
+ * @property {number} wins Wins
554
+ * @property {number} losses Losses
555
+ * @property {number} WLRatio Win/Loss ratio
556
+ * @property {number} playedGames Played games
557
+ */
558
+ /**
559
+ * @typedef {object} BridgeCTFModeStats
560
+ * @property {string|null} division Division
561
+ * @property {number} kills Kills
562
+ * @property {number} deaths Deaths
563
+ * @property {number} wins Wins
564
+ * @property {number} losses Losses
565
+ * @property {number} KDRatio Kill/Death ratio
566
+ * @property {number} WLRatio Win/Loss ratio
567
+ * @property {number} playedGames Played games
568
+ * @property {number} captures Captures
569
+ */
570
+ /**
571
+ * @typedef {object} DuelsParkour
572
+ * @property {number} deaths Deaths
573
+ * @property {number} wins Wins
574
+ * @property {number} losses Losses
575
+ * @property {number} WLRatio Win/Loss ratio
576
+ * @property {number} playedGames Played games
577
+ */
578
+ /**
579
+ * @typedef {object} DuelsBoxing
580
+ * @property {string} division Division
581
+ * @property {number} kills Kills
582
+ * @property {number} wins Wins
583
+ * @property {number} losses Losses
584
+ * @property {number} WLRatio Win/Loss ratio
585
+ * @property {number} playedGames Played games
586
+ * @property {number} meleeSwings Melee swings
587
+ * @property {number} meleeHits Melee hits
588
+ */
589
+ /**
590
+ * @typedef {object} DuelsArena
423
591
  * @property {number} kills Kills
424
592
  * @property {number} deaths Deaths
425
593
  * @property {number} wins Wins
@@ -450,11 +618,13 @@ class Duels {
450
618
  */
451
619
  /**
452
620
  * @typedef {object} DuelsBridge
453
- * @property {DuelsModeStats} overall Overall The Bridge duel stats
454
- * @property {DuelsModeStats} '1v1' The Bridge Duel 1v1 stats
455
- * @property {DuelsModeStats} '2v2' The Bridge Duel 2v2 stats
456
- * @property {DuelsModeStats} '4v4' The Bridge Duel 4v4 stats
457
- * @property {DuelsModeStats} '2v2v2v2' The Bridge Duel 2v2v2v2 stats
458
- * @property {DuelsModeStats} '3v3v3v3' The Bridge Duel 3v3v3v3 stats
621
+ * @property {BridgeModeStats} overall Overall The Bridge duel stats
622
+ * @property {BridgeModeStats} '1v1' The Bridge Duel 1v1 stats
623
+ * @property {BridgeModeStats} '2v2' The Bridge Duel 2v2 stats
624
+ * @property {BridgeModeStats} '3v3' The Bridge Duel 3v3 stats
625
+ * @property {BridgeModeStats} '4v4' The Bridge Duel 4v4 stats
626
+ * @property {BridgeModeStats} '2v2v2v2' The Bridge Duel 2v2v2v2 stats
627
+ * @property {BridgeModeStats} '3v3v3v3' The Bridge Duel 3v3v3v3 stats
628
+ * @property {BridgeCTFModeStats} ctf The Bridge Capture The Flag duel 3v3 stats
459
629
  */
460
630
  module.exports = Duels;
@@ -66,6 +66,111 @@ class TurboKartRacers {
66
66
  * @type {number}
67
67
  */
68
68
  this.junglerushPlays = data.junglerush_plays || 0;
69
+ /**
70
+ * Canyon Map Plays
71
+ * @type {number}
72
+ */
73
+ this.canyonPlays = data.canyon_plays || 0;
74
+ /**
75
+ * Retro Bronze Trophies
76
+ * @type {number}
77
+ */
78
+ this.retroBronzeTrophies = data.bronze_trophy_retro || 0;
79
+ /**
80
+ * Jungle Rush Map Plays
81
+ * @type {number}
82
+ */
83
+ this.retroSilverTrophies = data.silver_trophy_retro || 0;
84
+ /**
85
+ * Jungle Rush Map Plays
86
+ * @type {number}
87
+ */
88
+ this.retroGoldTrophies = data.gold_trophy_retro || 0;
89
+ /**
90
+ * hypixelgp Bronze Trophies
91
+ * @type {number}
92
+ */
93
+ this.hypixelgpBronzeTrophies = data.bronze_trophy_hypixelgp || 0;
94
+ /**
95
+ * hypixelgp Silver Trophies
96
+ * @type {number}
97
+ */
98
+ this.hypixelgpSilverTrophies = data.silver_trophy_hypixelgp || 0;
99
+ /**
100
+ * hypixelgp Gold Trophies
101
+ * @type {number}
102
+ */
103
+ this.hypixelgpGoldTrophies = data.gold_trophy_hypixelgp || 0;
104
+ /**
105
+ * olympus Bronze Trophies
106
+ * @type {number}
107
+ */
108
+ this.olympusBronzeTrophies = data.bronze_trophy_olympus || 0;
109
+ /**
110
+ * olympus Silver Trophies
111
+ * @type {number}
112
+ */
113
+ this.olympusSilverTrophies = data.silver_trophy_olympus || 0;
114
+ /**
115
+ * olympus Gold Trophies
116
+ * @type {number}
117
+ */
118
+ this.olympusGoldTrophies = data.gold_trophy_olympus || 0;
119
+ /**
120
+ * junglerush Bronze Trophies
121
+ * @type {number}
122
+ */
123
+ this.junglerushBronzeTrophies = data.bronze_trophy_junglerush || 0;
124
+ /**
125
+ * junglerush Silver Trophies
126
+ * @type {number}
127
+ */
128
+ this.junglerushSilverTrophies = data.silver_trophy_junglerush || 0;
129
+ /**
130
+ * junglerush Gold Trophies
131
+ * @type {number}
132
+ */
133
+ this.junglerushGoldTrophies = data.gold_trophy_junglerush || 0;
134
+ /**
135
+ * Canyon Bronze Trophies
136
+ * @type {number}
137
+ */
138
+ this.canyonBronzeTrophies = data.gold_trophy_canyon || 0;
139
+ /**
140
+ * Canyon Silver Trophies
141
+ * @type {number}
142
+ */
143
+ this.canyonSilverTrophies = data.gold_trophy_canyon || 0;
144
+ /**
145
+ * Canyon Gold Trophies
146
+ * @type {number}
147
+ */
148
+ this.canyonGoldTrophies = data.gold_trophy_canyon || 0;
149
+ /**
150
+ * Bananas Recived
151
+ * @type {number}
152
+ */
153
+ this.bananaHitsReceived = data.banana_hits_received || 0;
154
+ /**
155
+ * Bananas Sent
156
+ * @type {number}
157
+ */
158
+ this.bananaHitsSent = data.banana_hits_sent || 0;
159
+ /**
160
+ * Blue Torpedos Hit
161
+ * @type {number}
162
+ */
163
+ this.blueTorpedoHit = data.blue_torpedo_hit || 0;
164
+ /**
165
+ * Grand Prix Status
166
+ * @type {boolean}
167
+ */
168
+ this.grandPrix = data.grand_prix || 'false';
169
+ /**
170
+ * Grand Prix Tokens
171
+ * @type {number}
172
+ */
173
+ this.grandPrixTokens = data.grand_prix_tokens || 0;
69
174
  }
70
175
  }
71
176
  module.exports = TurboKartRacers;
@@ -102,7 +102,7 @@ class Player {
102
102
  * Player's plus color (must be a MVP+ rank)
103
103
  * @type {Color|null}
104
104
  */
105
- this.plusColor = this.rank === 'MVP+' || this.rank === 'MVP++' ? (data.rankPlusColor ? new Color(data.rankPlusColor) : null) : null;
105
+ this.plusColor = this.rank === 'MVP+' || this.rank === 'MVP++' ? (data.rankPlusColor ? new Color(data.rankPlusColor) : new Color('RED')) : null;
106
106
  /**
107
107
  * MVP++ prefix color
108
108
  * @type {Color|null}
@@ -283,14 +283,11 @@ function getRank (player) {
283
283
  rank = player.prefix.replace(/§[0-9|a-z]|\[|\]/g, '');
284
284
  } else if (player.rank && player.rank !== 'NORMAL') {
285
285
  switch (player.rank) {
286
- case 'MODERATOR':
287
- rank = 'Moderator';
288
- break;
289
286
  case 'YOUTUBER':
290
287
  rank = 'YouTube';
291
288
  break;
292
- case 'HELPER':
293
- rank = 'Helper';
289
+ case 'GAME_MASTER':
290
+ rank = 'Game Master';
294
291
  break;
295
292
  case 'ADMIN':
296
293
  rank = 'Admin';
@@ -401,8 +398,7 @@ function parseClaimedRewards (data) {
401
398
  * * `MVP`
402
399
  * * `MVP+`
403
400
  * * `MVP++`
404
- * * `Helper`
405
- * * `Moderator`
401
+ * * `Game Master`
406
402
  * * `Admin`
407
403
  * * `YouTube`
408
404
  */
@@ -57,7 +57,7 @@ class ServerInfo {
57
57
  * Ping in ms
58
58
  * @type {number}
59
59
  */
60
- this.ping = parseInt(ping);
60
+ this.ping = parseInt(ping, 10);
61
61
  }
62
62
  /**
63
63
  * toString override
@@ -1,5 +1,5 @@
1
1
  const dateRegExp = /(\d{1,2})(?:st|nd|rd|th|) ([A-z]+) (\d+)/;
2
- const versionRegExp = /^v\d+(\.\d+){1,}$/;
2
+ const versionRegExp = /v\d+(\.\d+){1,}/;
3
3
  /**
4
4
  * SkyblockNews
5
5
  */
@@ -61,8 +61,8 @@ function parseDate(stringDate) {
61
61
  * @returns {string | null}
62
62
  */
63
63
  function parseVer(stringVer) {
64
- const matches = versionRegExp.test(stringVer);
65
- if (!matches) return null; // this shouldn't really happen
66
- return matched;
64
+ const matches = versionRegExp.exec(stringVer);
65
+ if (!matches.length) return null; // this shouldn't really happen
66
+ return matches[0];
67
67
  }
68
68
  module.exports = SkyblockNews;