hypixel-api-reborn 10.0.0 → 11.0.1

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 (105) hide show
  1. package/.prettierrc +13 -0
  2. package/README.md +28 -16
  3. package/package.json +60 -58
  4. package/src/API/getAPIStatus.js +8 -8
  5. package/src/API/getBoosters.js +6 -6
  6. package/src/API/getGameCounts.js +6 -6
  7. package/src/API/getGuild.js +18 -18
  8. package/src/API/getLeaderboards.js +13 -13
  9. package/src/API/getPlayer.js +22 -27
  10. package/src/API/getRecentGames.js +18 -18
  11. package/src/API/getServerInfo.js +66 -77
  12. package/src/API/getStatus.js +8 -8
  13. package/src/API/getWatchdogStats.js +6 -6
  14. package/src/API/index.js +19 -23
  15. package/src/API/skyblock/getEndedSkyblockAuctions.js +10 -10
  16. package/src/API/skyblock/getSkyblockAuctions.js +64 -64
  17. package/src/API/skyblock/getSkyblockAuctionsByPlayer.js +11 -11
  18. package/src/API/skyblock/getSkyblockBazaar.js +10 -10
  19. package/src/API/skyblock/getSkyblockMember.js +28 -25
  20. package/src/API/skyblock/getSkyblockNews.js +6 -6
  21. package/src/API/skyblock/getSkyblockProfiles.js +44 -41
  22. package/src/Client.js +406 -450
  23. package/src/Errors.js +44 -39
  24. package/src/Private/defaultCache.js +77 -78
  25. package/src/Private/rateLimit.js +79 -98
  26. package/src/Private/requests.js +65 -54
  27. package/src/Private/updater.js +45 -45
  28. package/src/Private/uuidCache.js +37 -33
  29. package/src/Private/validate.js +97 -97
  30. package/src/index.js +82 -83
  31. package/src/structures/APIIncident.js +78 -78
  32. package/src/structures/APIStatus.js +47 -47
  33. package/src/structures/Boosters/Booster.js +83 -87
  34. package/src/structures/Color.js +129 -129
  35. package/src/structures/Game.js +164 -160
  36. package/src/structures/GameCounts.js +151 -151
  37. package/src/structures/Guild/Guild.js +204 -218
  38. package/src/structures/Guild/GuildMember.js +66 -66
  39. package/src/structures/Guild/GuildRank.js +48 -48
  40. package/src/structures/ItemBytes.js +33 -36
  41. package/src/structures/Leaderboard.js +31 -31
  42. package/src/structures/MiniGames/Arcade.js +567 -569
  43. package/src/structures/MiniGames/ArenaBrawl.js +52 -56
  44. package/src/structures/MiniGames/BedWars.js +423 -351
  45. package/src/structures/MiniGames/BlitzSurvivalGames.js +172 -148
  46. package/src/structures/MiniGames/BuildBattle.js +53 -53
  47. package/src/structures/MiniGames/CopsAndCrims.js +90 -90
  48. package/src/structures/MiniGames/Duels.js +694 -630
  49. package/src/structures/MiniGames/MegaWalls.js +137 -137
  50. package/src/structures/MiniGames/MurderMystery.js +93 -93
  51. package/src/structures/MiniGames/Paintball.js +67 -67
  52. package/src/structures/MiniGames/Pit.js +19 -19
  53. package/src/structures/MiniGames/Quakecraft.js +101 -101
  54. package/src/structures/MiniGames/SkyWars.js +508 -559
  55. package/src/structures/MiniGames/SmashHeroes.js +144 -151
  56. package/src/structures/MiniGames/SpeedUHC.js +115 -57
  57. package/src/structures/MiniGames/TNTGames.js +116 -116
  58. package/src/structures/MiniGames/TurboKartRacers.js +201 -176
  59. package/src/structures/MiniGames/UHC.js +164 -143
  60. package/src/structures/MiniGames/VampireZ.js +60 -60
  61. package/src/structures/MiniGames/Walls.js +52 -52
  62. package/src/structures/MiniGames/Warlords.js +62 -62
  63. package/src/structures/MiniGames/WoolWars.js +123 -0
  64. package/src/structures/Pet.js +96 -97
  65. package/src/structures/Pets.js +64 -64
  66. package/src/structures/Player.js +433 -449
  67. package/src/structures/PlayerCosmetics.js +100 -95
  68. package/src/structures/RecentGame.js +57 -57
  69. package/src/structures/ServerInfo.js +78 -78
  70. package/src/structures/SkyBlock/Auctions/Auction.js +104 -104
  71. package/src/structures/SkyBlock/Auctions/AuctionInfo.js +54 -54
  72. package/src/structures/SkyBlock/Auctions/BaseAuction.js +45 -45
  73. package/src/structures/SkyBlock/Auctions/Bid.js +48 -48
  74. package/src/structures/SkyBlock/Auctions/PartialAuction.js +25 -25
  75. package/src/structures/SkyBlock/Bazzar/Order.js +38 -38
  76. package/src/structures/SkyBlock/Bazzar/Product.js +53 -53
  77. package/src/structures/SkyBlock/News/SkyblockNews.js +60 -68
  78. package/src/structures/SkyBlock/SkyblockInventoryItem.js +124 -130
  79. package/src/structures/SkyBlock/SkyblockMember.js +820 -687
  80. package/src/structures/SkyBlock/SkyblockPet.js +71 -71
  81. package/src/structures/SkyBlock/SkyblockProfile.js +60 -60
  82. package/src/structures/Status.js +41 -41
  83. package/src/structures/Watchdog/Stats.js +36 -36
  84. package/src/utils/Constants.js +2789 -809
  85. package/src/utils/SkyblockUtils.js +208 -164
  86. package/src/utils/arrayTools.js +4 -4
  87. package/src/utils/divide.js +5 -5
  88. package/src/utils/guildExp.js +57 -67
  89. package/src/utils/index.js +13 -13
  90. package/src/utils/isGuildID.js +3 -3
  91. package/src/utils/isUUID.js +5 -5
  92. package/src/utils/oscillation.js +15 -23
  93. package/src/utils/removeSnakeCase.js +22 -35
  94. package/src/utils/rgbToHexColor.js +8 -8
  95. package/src/utils/romanize.js +11 -13
  96. package/src/utils/toIGN.js +20 -20
  97. package/src/utils/toUuid.js +19 -19
  98. package/src/utils/varInt.js +17 -21
  99. package/typings/index.d.ts +3532 -2644
  100. package/src/API/getFriends.js +0 -14
  101. package/src/API/getKeyInfo.js +0 -10
  102. package/src/API/getRankedSkyWars.js +0 -11
  103. package/src/structures/Friend.js +0 -38
  104. package/src/structures/KeyInfo.js +0 -42
  105. package/src/structures/MiniGames/SkyWarsRanked.js +0 -45
@@ -1,630 +1,694 @@
1
- /* eslint-disable max-len */
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
-
7
- /**
8
- * @param {object<string,any>} data
9
- * @param {string|null} mode
10
- * @returns {string|undefined}
11
- */
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;
20
- }
21
- /**
22
- * @param {object<string,any>} data
23
- * @return {{kills:number,deaths:number}}
24
- */
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
- }
34
- }
35
- return {
36
- kills: totalKills,
37
- deaths: totalDeaths
38
- };
39
- }
40
- /**
41
- * Duels class
42
- */
43
- class Duels {
44
- /**
45
- * @param {object} data Duels data
46
- */
47
- constructor (data) {
48
- /**
49
- * Coins
50
- * @type {number}
51
- */
52
- this.coins = data.coins || 0;
53
- /**
54
- * All modes division
55
- * @type {string|null}
56
- */
57
- this.division = getDivision(data);
58
- /**
59
- * Kills
60
- * @type {number}
61
- */
62
- this.kills = getTotalKillsDeaths(data).kills;
63
- /**
64
- * Deaths
65
- * @type {number}
66
- */
67
- this.deaths = getTotalKillsDeaths(data).deaths;
68
- /**
69
- * Kill Death ratio
70
- * @type {number}
71
- */
72
- this.KDRatio = divide(this.kills, this.deaths);
73
- /**
74
- * Wins
75
- * @type {number}
76
- */
77
- this.wins = data.wins || 0;
78
- /**
79
- * Losses
80
- * @type {number}
81
- */
82
- this.losses = data.losses || 0;
83
- /**
84
- * Win Loss ratio
85
- * @type {number}
86
- */
87
- this.WLRatio = divide(this.wins, this.losses);
88
- /**
89
- * Played games
90
- * @type {number}
91
- */
92
- this.playedGames = data.games_played_duels || 0;
93
- /**
94
- * Current winstreak
95
- * @type {number}
96
- */
97
- this.winstreak = data.current_winstreak || 0;
98
- /**
99
- * Best overall winstreak
100
- * @type {number}
101
- */
102
- this.bestWinstreak = data.best_overall_winstreak || 0;
103
- /**
104
- * UHC duels stats
105
- * @type {DuelsUHC}
106
- */
107
- this.uhc = {
108
- 'overall': {
109
- division: getDivision(data, 'uhc'),
110
- winstreak: data.current_uhc_winstreak || 0,
111
- bestWinstreak: data.best_uhc_winstreak || 0,
112
- kills: (data.uhc_duel_kills || 0) + (data.uhc_doubles_kills || 0) + (data.uhc_four_kills || 0) + (data.uhc_meetup_kills || 0),
113
- deaths: (data.uhc_duel_deaths || 0) + (data.uhc_doubles_deaths || 0) + (data.uhc_four_deaths || 0) + (data.uhc_meetup_deaths || 0),
114
- KDRatio: divide((data.uhc_duel_kills || 0) + (data.uhc_doubles_kills || 0) + (data.uhc_four_kills || 0) + (data.uhc_meetup_kills || 0), (data.uhc_duel_deaths || 0) + (data.uhc_doubles_deaths || 0) + (data.uhc_four_deaths || 0) + (data.uhc_meetup_deaths || 0)),
115
- wins: (data.uhc_duel_wins || 0) + (data.uhc_doubles_wins || 0) + (data.uhc_four_wins || 0) + (data.uhc_meetup_wins || 0),
116
- losses: (data.uhc_duel_losses || 0) + (data.uhc_doubles_losses || 0) + (data.uhc_four_losses || 0) + (data.uhc_meetup_losses || 0),
117
- WLRatio: divide((data.uhc_duel_wins || 0) + (data.uhc_doubles_wins || 0) + (data.uhc_four_wins || 0) + (data.uhc_meetup_wins || 0), (data.uhc_duel_losses || 0) + (data.uhc_doubles_losses || 0) + (data.uhc_four_losses || 0) + (data.uhc_meetup_losses || 0)),
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)
119
- },
120
- '1v1': {
121
- division: getDivision(data, 'uhc'),
122
- winstreak: data.current_winstreak_mode_uhc_duel || 0,
123
- bestWinstreak: data.best_winstreak_mode_uhc_duel || 0,
124
- kills: data.uhc_duel_kills || 0,
125
- deaths: data.uhc_duel_deaths || 0,
126
- KDRatio: divide(data.uhc_duel_kills, data.uhc_duel_deaths),
127
- wins: data.uhc_duel_wins || 0,
128
- losses: data.uhc_duel_losses || 0,
129
- WLRatio: divide(data.uhc_duel_wins, data.uhc_duel_losses),
130
- playedGames: data.uhc_duel_rounds_played || 0
131
- },
132
- '2v2': {
133
- division: getDivision(data, 'uhc'),
134
- winstreak: data.current_winstreak_mode_uhc_doubles || 0,
135
- bestWinstreak: data.best_winstreak_mode_uhc_doubles || 0,
136
- kills: data.uhc_doubles_kills || 0,
137
- deaths: data.uhc_doubles_deaths || 0,
138
- KDRatio: divide(data.uhc_doubles_kills, data.uhc_doubles_deaths),
139
- wins: data.uhc_doubles_wins || 0,
140
- losses: data.uhc_doubles_losses || 0,
141
- WLRatio: divide(data.uhc_doubles_wins, data.uhc_doubles_losses),
142
- playedGames: data.uhc_doubles_rounds_played || 0
143
- },
144
- '4v4': {
145
- division: getDivision(data, 'uhc'),
146
- winstreak: data.current_winstreak_mode_uhc_four || 0,
147
- bestWinstreak: data.best_winstreak_mode_uhc_four || 0,
148
- kills: data.uhc_four_kills || 0,
149
- deaths: data.uhc_four_deaths || 0,
150
- KDRatio: divide(data.uhc_four_kills, data.uhc_four_deaths),
151
- wins: data.uhc_four_wins || 0,
152
- losses: data.uhc_four_losses || 0,
153
- WLRatio: divide(data.uhc_four_wins, data.uhc_four_losses),
154
- playedGames: data.uhc_four_rounds_played || 0
155
- },
156
- 'meetup': {
157
- division: getDivision(data, 'uhc'),
158
- winstreak: data.current_winstreak_mode_uhc_meetup || 0,
159
- bestWinstreak: data.best_winstreak_mode_uhc_meetup || 0,
160
- kills: data.uhc_meetup_kills || 0,
161
- deaths: data.uhc_meetup_deaths || 0,
162
- KDRatio: divide(data.uhc_meetup_kills, data.uhc_meetup_deaths),
163
- wins: data.uhc_meetup_wins || 0,
164
- losses: data.uhc_meetup_losses || 0,
165
- WLRatio: divide(data.uhc_meetup_wins, data.uhc_meetup_losses),
166
- playedGames: data.uhc_meetup_rounds_played || 0
167
- }
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
- };
219
- /**
220
- * MegaWalls duels stats
221
- * @type {DuelsModeStats}
222
- */
223
- this.megawalls = {
224
- division: getDivision(data, 'mega_walls'),
225
- winstreak: data.current_winstreak_mode_mw_duel || 0,
226
- bestWinstreak: data.best_winstreak_mode_mw_duel || 0,
227
- kills: data.mw_duel_kills || 0,
228
- deaths: data.mw_duel_deaths || 0,
229
- KDRatio: divide(data.mw_duel_kills, data.mw_duel_deaths),
230
- wins: data.mw_duel_wins || 0,
231
- losses: data.mw_duel_losses || 0,
232
- WLRatio: divide(data.mw_duel_wins, data.mw_duel_losses),
233
- playedGames: data.mw_duel_rounds_played || 0
234
- };
235
- /**
236
- * OP duels stats
237
- * @type {DuelsOP}
238
- */
239
- this.op = {
240
- 'overall': {
241
- division: getDivision(data, 'op'),
242
- winstreak: data.current_op_winstreak || 0,
243
- bestWinstreak: data.best_op_winstreak || 0,
244
- kills: (data.op_duel_kills || 0) + (data.op_doubles_kills || 0),
245
- deaths: (data.op_duel_deaths || 0) + (data.op_doubles_deaths || 0),
246
- KDRatio: divide((data.op_duel_kills || 0) + (data.op_doubles_kills || 0), (data.op_duel_deaths || 0) + (data.op_doubles_deaths || 0)),
247
- wins: (data.op_duel_wins || 0) + (data.op_doubles_wins || 0),
248
- losses: (data.op_duel_losses || 0) + (data.op_doubles_losses || 0),
249
- WLRatio: divide((data.op_duel_wins || 0) + (data.op_doubles_wins || 0), (data.op_duel_losses || 0) + (data.op_doubles_losses || 0)),
250
- playedGames: (data.op_duel_rounds_played || 0) + (data.op_doubles_rounds_played || 0)
251
- },
252
- '1v1': {
253
- division: getDivision(data, 'op'),
254
- winstreak: data.current_winstreak_mode_op_duel || 0,
255
- bestWinstreak: data.best_winstreak_mode_op_duel || 0,
256
- kills: data.op_duel_kills || 0,
257
- deaths: data.op_duel_deaths || 0,
258
- KDRatio: divide(data.op_duel_kills, data.op_duel_deaths),
259
- wins: data.op_duel_wins || 0,
260
- losses: data.op_duel_losses || 0,
261
- WLRatio: divide(data.op_duel_wins, data.op_duel_losses),
262
- playedGames: data.op_duel_rounds_played || 0
263
- },
264
- '2v2': {
265
- division: getDivision(data, 'op'),
266
- winstreak: data.current_winstreak_mode_op_doubles || 0,
267
- bestWinstreak: data.best_winstreak_mode_op_doubles || 0,
268
- kills: data.op_doubles_kills || 0,
269
- deaths: data.op_doubles_deaths || 0,
270
- KDRatio: divide(data.op_doubles_kills, data.op_doubles_deaths),
271
- wins: data.op_doubles_wins || 0,
272
- losses: data.op_doubles_losses || 0,
273
- WLRatio: divide(data.op_doubles_wins, data.op_doubles_losses),
274
- playedGames: data.op_doubles_rounds_played || 0
275
- }
276
- };
277
- /**
278
- * SkyWars duels stats
279
- * @type {DuelsSkyWars}
280
- */
281
- this.skywars = {
282
- 'overall': {
283
- division: getDivision(data, 'skywars'),
284
- winstreak: data.current_skywars_winstreak || 0,
285
- bestWinstreak: data.best_skywars_winstreak || 0,
286
- kills: ((data.sw_duel_kills || 0) + (data.sw_doubles_kills || 0)),
287
- deaths: ((data.sw_duel_deaths || 0) + (data.sw_doubles_deaths || 0)),
288
- KDRatio: divide((data.sw_duel_kills || 0) + (data.sw_doubles_kills || 0), (data.sw_duel_deaths || 0) + (data.sw_doubles_deaths || 0)),
289
- wins: ((data.sw_duel_wins || 0) + (data.sw_doubles_wins || 0)),
290
- losses: ((data.sw_duel_losses || 0) + (data.sw_doubles_losses || 0)),
291
- WLRatio: divide((data.sw_duel_wins || 0) + (data.sw_doubles_wins || 0), (data.sw_duel_losses || 0) + (data.sw_doubles_losses || 0)),
292
- playedGames: (data.sw_duel_rounds_played || 0) + (data.sw_doubles_rounds_played || 0)
293
- },
294
- '1v1': {
295
- division: getDivision(data, 'skywars'),
296
- winstreak: data.current_winstreak_mode_sw_duel || 0,
297
- bestWinstreak: data.best_winstreak_mode_sw_duel || 0,
298
- kills: data.sw_duel_kills || 0,
299
- deaths: data.sw_duel_deaths || 0,
300
- KDRatio: divide(data.sw_duel_kills, data.sw_duel_deaths),
301
- wins: data.sw_duel_wins || 0,
302
- losses: data.sw_duel_losses || 0,
303
- WLRatio: divide(data.sw_duel_wins, data.sw_duel_losses),
304
- playedGames: data.sw_duel_rounds_played || 0
305
- },
306
- '2v2': {
307
- division: getDivision(data, 'skywars'),
308
- winstreak: data.current_winstreak_mode_sw_doubles || 0,
309
- bestWinstreak: data.best_winstreak_mode_sw_doubles || 0,
310
- kills: data.sw_doubles_kills || 0,
311
- deaths: data.sw_doubles_deaths || 0,
312
- KDRatio: divide(data.sw_doubles_kills, data.sw_doubles_deaths),
313
- wins: data.sw_doubles_wins || 0,
314
- losses: data.sw_doubles_losses || 0,
315
- WLRatio: divide(data.sw_doubles_wins, data.sw_doubles_losses),
316
- playedGames: data.sw_doubles_rounds_played || 0
317
- }
318
- };
319
- /**
320
- * Sumo duels stats
321
- * @type {DuelsModeStats}
322
- */
323
- this.sumo = {
324
- division: getDivision(data, 'sumo'),
325
- winstreak: data.current_winstreak_mode_sumo_duel || 0,
326
- bestWinstreak: data.best_winstreak_mode_sumo_duel || 0,
327
- kills: data.sumo_duel_kills || 0,
328
- deaths: data.sumo_duel_deaths || 0,
329
- KDRatio: divide(data.sumo_duel_kills, data.sumo_duel_deaths),
330
- wins: data.sumo_duel_wins || 0,
331
- losses: data.sumo_duel_losses || 0,
332
- WLRatio: divide(data.sumo_duel_wins, data.sumo_duel_losses),
333
- playedGames: data.sumo_duel_rounds_played || 0
334
- };
335
- /**
336
- * Classic duels stats
337
- * @type {DuelsModeStats}
338
- */
339
- this.classic = {
340
- division: getDivision(data, 'classic'),
341
- winstreak: data.current_winstreak_mode_classic_duel || 0,
342
- bestWinstreak: data.best_winstreak_mode_classic_duel || 0,
343
- kills: data.classic_duel_kills || 0,
344
- deaths: data.classic_duel_deaths || 0,
345
- KDRatio: divide(data.classic_duel_kills, data.classic_duel_deaths),
346
- wins: data.classic_duel_wins || 0,
347
- losses: data.classic_duel_losses || 0,
348
- WLRatio: divide(data.classic_duel_wins, data.classic_duel_losses),
349
- playedGames: data.classic_duel_rounds_played || 0
350
- };
351
- /**
352
- * Combo duels stats
353
- * @type {DuelsModeStats}
354
- */
355
- this.combo = {
356
- division: getDivision(data, 'combo'),
357
- winstreak: data.current_winstreak_mode_combo_duel || 0,
358
- bestWinstreak: data.best_winstreak_mode_combo_duel || 0,
359
- kills: data.combo_duel_kills || 0,
360
- deaths: data.combo_duel_deaths || 0,
361
- KDRatio: divide(data.combo_duel_kills, data.combo_duel_deaths),
362
- wins: data.combo_duel_wins || 0,
363
- losses: data.combo_duel_losses || 0,
364
- WLRatio: divide(data.combo_duel_wins, data.combo_duel_losses),
365
- playedGames: data.combo_duel_rounds_played || 0
366
- };
367
- /**
368
- * The bridge duels stats
369
- * @type {DuelsBridge}
370
- */
371
- this.bridge = {
372
- 'overall': {
373
- division: getDivision(data, 'bridge'),
374
- winstreak: data.current_bridge_winstreak || 0,
375
- bestWinstreak: data.best_bridge_winstreak || 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))
383
- },
384
- '1v1': {
385
- division: getDivision(data, 'bridge'),
386
- winstreak: data.current_winstreak_mode_bridge_duel || 0,
387
- bestWinstreak: data.best_winstreak_mode_bridge_duel || 0,
388
- kills: data.bridge_duel_bridge_kills || 0,
389
- deaths: data.bridge_duel_bridge_deaths || 0,
390
- KDRatio: divide(data.bridge_duel_bridge_kills, data.bridge_duel_bridge_deaths),
391
- wins: data.bridge_duel_wins || 0,
392
- losses: data.bridge_duel_losses || 0,
393
- WLRatio: divide(data.bridge_duel_wins, data.bridge_duel_losses),
394
- playedGames: data.bridge_duel_rounds_played || 0
395
- },
396
- '2v2': {
397
- division: getDivision(data, 'bridge'),
398
- winstreak: data.current_winstreak_mode_bridge_doubles || 0,
399
- bestWinstreak: data.best_winstreak_mode_bridge_doubles || 0,
400
- kills: data.bridge_doubles_bridge_kills || 0,
401
- deaths: data.bridge_doubles_bridge_deaths || 0,
402
- KDRatio: divide(data.bridge_doubles_bridge_kills, data.bridge_doubles_bridge_deaths),
403
- wins: data.bridge_doubles_wins || 0,
404
- losses: data.bridge_doubles_losses || 0,
405
- WLRatio: divide(data.bridge_doubles_wins, data.bridge_doubles_losses),
406
- playedGames: data.bridge_doubles_rounds_played || 0
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
- },
420
- '2v2v2v2': {
421
- division: getDivision(data, 'bridge'),
422
- winstreak: data.current_winstreak_mode_bridge_2v2v2v2 || 0,
423
- bestWinstreak: data.best_winstreak_mode_bridge_2v2v2v2 || 0,
424
- kills: data.bridge_2v2v2v2_bridge_kills || 0,
425
- deaths: data.bridge_2v2v2v2_bridge_deaths || 0,
426
- KDRatio: divide(data.bridge_2v2v2v2_bridge_kills, data.bridge_2v2v2v2_bridge_deaths),
427
- wins: data.bridge_2v2v2v2_wins || 0,
428
- losses: data.bridge_2v2v2v2_losses || 0,
429
- WLRatio: divide(data.bridge_2v2v2v2_wins, data.bridge_2v2v2v2_losses),
430
- playedGames: data.bridge_2v2v2v2_rounds_played || 0
431
- },
432
- '3v3v3v3': {
433
- division: getDivision(data, 'bridge'),
434
- winstreak: data.current_winstreak_mode_bridge_3v3v3v3 || 0,
435
- bestWinstreak: data.best_winstreak_mode_bridge_3v3v3v3 || 0,
436
- kills: data.bridge_3v3v3v3_bridge_kills || 0,
437
- deaths: data.bridge_3v3v3v3_bridge_deaths || 0,
438
- KDRatio: divide(data.bridge_3v3v3v3_bridge_kills, data.bridge_3v3v3v3_bridge_deaths),
439
- wins: data.bridge_3v3v3v3_wins || 0,
440
- losses: data.bridge_3v3v3v3_losses || 0,
441
- WLRatio: divide(data.bridge_3v3v3v3_wins, data.bridge_3v3v3v3_losses),
442
- playedGames: data.bridge_3v3v3v3_rounds_played || 0
443
- },
444
- '4v4': {
445
- division: getDivision(data, 'bridge'),
446
- winstreak: data.current_winstreak_mode_bridge_four || 0,
447
- bestWinstreak: data.best_winstreak_mode_bridge_four || 0,
448
- kills: data.bridge_four_bridge_kills || 0,
449
- deaths: data.bridge_four_bridge_deaths || 0,
450
- KDRatio: divide(data.bridge_four_bridge_kills, data.bridge_four_bridge_deaths),
451
- wins: data.bridge_four_wins || 0,
452
- losses: data.bridge_four_losses || 0,
453
- WLRatio: divide(data.bridge_four_wins, data.bridge_four_losses),
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
467
- }
468
- };
469
- /**
470
- * Blitz duel stats
471
- * @type {DuelsModeStats}
472
- */
473
- this.blitz = {
474
- division: getDivision(data, 'blitz'),
475
- winstreak: data.current_winstreak_mode_blitz_duel || 0,
476
- bestWinstreak: data.best_winstreak_mode_blitz_duel || 0,
477
- kills: data.blitz_duel_kills || 0,
478
- deaths: data.blitz_duel_deaths || 0,
479
- KDRatio: divide(data.blitz_duel_kills, data.blitz_duel_deaths),
480
- wins: data.blitz_duel_wins || 0,
481
- losses: data.blitz_duel_losses || 0,
482
- WLRatio: divide(data.blitz_duel_wins, data.blitz_duel_losses),
483
- playedGames: data.blitz_duel_rounds_played || 0
484
- };
485
- /**
486
- * Nodebuff duel stats
487
- * @type {DuelsModeStats}
488
- */
489
- this.nodebuff = {
490
- division: getDivision(data, 'no_debuff'),
491
- winstreak: data.current_winstreak_mode_potion_duel || 0,
492
- bestWinstreak: data.best_winstreak_mode_potion_duel || 0,
493
- kills: data.potion_duel_kills || 0,
494
- deaths: data.potion_duel_deaths || 0,
495
- KDRatio: divide(data.potion_duel_kills, data.potion_duel_deaths),
496
- wins: data.potion_duel_wins || 0,
497
- losses: data.potion_duel_losses || 0,
498
- WLRatio: divide(data.potion_duel_wins, data.potion_duel_losses),
499
- playedGames: data.potion_duel_rounds_played || 0
500
- };
501
- /**
502
- * Bow duel stats
503
- * @type {DuelsModeStats}
504
- */
505
- this.bow = {
506
- division: getDivision(data, 'bow'),
507
- winstreak: data.current_winstreak_mode_bow_duel || 0,
508
- bestWinstreak: data.best_winstreak_mode_bow_duel || 0,
509
- kills: data.bow_duel_kills || 0,
510
- deaths: data.bow_duel_deaths || 0,
511
- KDRatio: divide(data.bow_duel_kills, data.bow_duel_deaths),
512
- wins: data.bow_duel_wins || 0,
513
- losses: data.bow_duel_losses || 0,
514
- WLRatio: divide(data.bow_duel_wins, data.bow_duel_losses),
515
- playedGames: data.bow_duel_rounds_played || 0
516
- };
517
- }
518
- }
519
- /**
520
- * @typedef {object} DuelsModeStats
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
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
591
- * @property {number} kills Kills
592
- * @property {number} deaths Deaths
593
- * @property {number} wins Wins
594
- * @property {number} losses Losses
595
- * @property {number} KDRatio Kill/Death ratio
596
- * @property {number} WLRatio Win/Loss ratio
597
- * @property {number} playedGames Played games
598
- */
599
- /**
600
- * @typedef {object} DuelsOP
601
- * @property {DuelsModeStats} overall Overall OP duel stats
602
- * @property {DuelsModeStats} '1v1' OP Duel 1v1 stats
603
- * @property {DuelsModeStats} '2v2' OP Duel 2v2 stats
604
- */
605
- /**
606
- * @typedef {object} DuelsUHC
607
- * @property {DuelsModeStats} overall Overall UHC duel stats
608
- * @property {DuelsModeStats} '1v1' UHC Duel 1v1 stats
609
- * @property {DuelsModeStats} '2v2' UHC Duel 2v2 stats
610
- * @property {DuelsModeStats} '4v4' UHC Duel 4v4 stats
611
- * @property {DuelsModeStats} meetup UHC Meetup
612
- */
613
- /**
614
- * @typedef {object} DuelsSkyWars
615
- * @property {DuelsModeStats} overall Overall SkyWars duel stats
616
- * @property {DuelsModeStats} '1v1' SkyWars Duel 1v1 stats
617
- * @property {DuelsModeStats} '2v2' SkyWars Duel 2v2 stats
618
- */
619
- /**
620
- * @typedef {object} DuelsBridge
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
629
- */
630
- module.exports = Duels;
1
+ /* eslint-disable max-len */
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
+
7
+ // eslint-disable-next-line require-jsdoc
8
+ function getDivision(data, mode = null) {
9
+ for (const div of duels_divisions.slice().reverse()) {
10
+ const prestige = data[`${mode ? mode : 'all_modes'}_${div.key}_title_prestige`];
11
+ if (prestige) {
12
+ return `${div.name} ${romanize(prestige)}`;
13
+ }
14
+ }
15
+ return null;
16
+ }
17
+ // eslint-disable-next-line require-jsdoc
18
+ function getTotalKillsDeaths(data) {
19
+ let totalDeaths = 0;
20
+ let totalKills = 0;
21
+ for (const [k, v] of Object.entries(data)) {
22
+ if (k.includes('deaths') && k !== 'deaths') {
23
+ totalDeaths += v;
24
+ } else if (k.includes('kills') && k !== 'kills') {
25
+ totalKills += v;
26
+ }
27
+ }
28
+ return {
29
+ kills: totalKills,
30
+ deaths: totalDeaths
31
+ };
32
+ }
33
+ /**
34
+ * Duels class
35
+ */
36
+ class Duels {
37
+ /**
38
+ * @param {object} data Duels data
39
+ */
40
+ constructor(data) {
41
+ /**
42
+ * Coins
43
+ * @type {number}
44
+ */
45
+ this.coins = data.coins || 0;
46
+ /**
47
+ * All modes division
48
+ * @type {string|null}
49
+ */
50
+ this.division = getDivision(data);
51
+ /**
52
+ * Kills
53
+ * @type {number}
54
+ */
55
+ this.kills = getTotalKillsDeaths(data).kills;
56
+ /**
57
+ * Deaths
58
+ * @type {number}
59
+ */
60
+ this.deaths = getTotalKillsDeaths(data).deaths;
61
+ /**
62
+ * Kill Death ratio
63
+ * @type {number}
64
+ */
65
+ this.KDRatio = divide(this.kills, this.deaths);
66
+ /**
67
+ * Wins
68
+ * @type {number}
69
+ */
70
+ this.wins = data.wins || 0;
71
+ /**
72
+ * Losses
73
+ * @type {number}
74
+ */
75
+ this.losses = data.losses || 0;
76
+ /**
77
+ * Win Loss ratio
78
+ * @type {number}
79
+ */
80
+ this.WLRatio = divide(this.wins, this.losses);
81
+ /**
82
+ * Played games
83
+ * @type {number}
84
+ */
85
+ this.playedGames = data.games_played_duels || 0;
86
+ /**
87
+ * Current winstreak
88
+ * @type {number}
89
+ */
90
+ this.winstreak = data.current_winstreak || 0;
91
+ /**
92
+ * Best overall winstreak
93
+ * @type {number}
94
+ */
95
+ this.bestWinstreak = data.best_overall_winstreak || 0;
96
+ /**
97
+ * UHC duels stats
98
+ * @type {DuelsUHC}
99
+ */
100
+ this.uhc = {
101
+ overall: {
102
+ division: getDivision(data, 'uhc'),
103
+ winstreak: data.current_uhc_winstreak || 0,
104
+ 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),
107
+ 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)
110
+ ),
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),
113
+ 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)
116
+ ),
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)
118
+ },
119
+ '1v1': {
120
+ division: getDivision(data, 'uhc'),
121
+ winstreak: data.current_winstreak_mode_uhc_duel || 0,
122
+ bestWinstreak: data.best_winstreak_mode_uhc_duel || 0,
123
+ kills: data.uhc_duel_kills || 0,
124
+ deaths: data.uhc_duel_deaths || 0,
125
+ KDRatio: divide(data.uhc_duel_kills, data.uhc_duel_deaths),
126
+ wins: data.uhc_duel_wins || 0,
127
+ losses: data.uhc_duel_losses || 0,
128
+ WLRatio: divide(data.uhc_duel_wins, data.uhc_duel_losses),
129
+ playedGames: data.uhc_duel_rounds_played || 0
130
+ },
131
+ '2v2': {
132
+ division: getDivision(data, 'uhc'),
133
+ winstreak: data.current_winstreak_mode_uhc_doubles || 0,
134
+ bestWinstreak: data.best_winstreak_mode_uhc_doubles || 0,
135
+ kills: data.uhc_doubles_kills || 0,
136
+ deaths: data.uhc_doubles_deaths || 0,
137
+ KDRatio: divide(data.uhc_doubles_kills, data.uhc_doubles_deaths),
138
+ wins: data.uhc_doubles_wins || 0,
139
+ losses: data.uhc_doubles_losses || 0,
140
+ WLRatio: divide(data.uhc_doubles_wins, data.uhc_doubles_losses),
141
+ playedGames: data.uhc_doubles_rounds_played || 0
142
+ },
143
+ '4v4': {
144
+ division: getDivision(data, 'uhc'),
145
+ winstreak: data.current_winstreak_mode_uhc_four || 0,
146
+ bestWinstreak: data.best_winstreak_mode_uhc_four || 0,
147
+ kills: data.uhc_four_kills || 0,
148
+ deaths: data.uhc_four_deaths || 0,
149
+ KDRatio: divide(data.uhc_four_kills, data.uhc_four_deaths),
150
+ wins: data.uhc_four_wins || 0,
151
+ losses: data.uhc_four_losses || 0,
152
+ WLRatio: divide(data.uhc_four_wins, data.uhc_four_losses),
153
+ playedGames: data.uhc_four_rounds_played || 0
154
+ },
155
+ meetup: {
156
+ division: getDivision(data, 'uhc'),
157
+ winstreak: data.current_winstreak_mode_uhc_meetup || 0,
158
+ bestWinstreak: data.best_winstreak_mode_uhc_meetup || 0,
159
+ kills: data.uhc_meetup_kills || 0,
160
+ deaths: data.uhc_meetup_deaths || 0,
161
+ KDRatio: divide(data.uhc_meetup_kills, data.uhc_meetup_deaths),
162
+ wins: data.uhc_meetup_wins || 0,
163
+ losses: data.uhc_meetup_losses || 0,
164
+ WLRatio: divide(data.uhc_meetup_wins, data.uhc_meetup_losses),
165
+ playedGames: data.uhc_meetup_rounds_played || 0
166
+ }
167
+ };
168
+ /**
169
+ * @type {DuelsParkour}
170
+ */
171
+ this.parkour = {
172
+ division: getDivision(data, 'parkour'),
173
+ deaths: data.parkour_eight_deaths || 0,
174
+ wins: data.parkour_eight_wins || 0,
175
+ losses: data.parkour_eight_losses || 0,
176
+ WLRatio: divide(data.parkour_eight_wins, data.parkour_eight_losses),
177
+ playedGames: data.parkour_eight_rounds_played || 0
178
+ };
179
+ /**
180
+ * @type {DuelsBoxing}
181
+ */
182
+ this.boxing = {
183
+ division: getDivision(data, 'boxing'),
184
+ kills: data.boxing_duel_kills || 0,
185
+ wins: data.boxing_duel_wins || 0,
186
+ losses: data.boxing_duel_losses || 0,
187
+ WLRatio: divide(data.boxing_duel_wins, data.boxing_duel_losses),
188
+ playedGames: data.boxing_duel_rounds_played || 0,
189
+ meleeSwings: data.boxing_duel_melee_swings || 0,
190
+ meleeHits: data.boxing_duel_melee_hits || 0
191
+ };
192
+ /**
193
+ * @type {DuelsBowspleef}
194
+ */
195
+ this.bowspleef = {
196
+ division: getDivision(data, 'tnt_games'),
197
+ winstreak: data.current_tnt_games_winstreak || 0,
198
+ bestWinstreak: data.best_tnt_games_winstreak || 0,
199
+ bowShots: data.bowspleef_duel_bow_shots || 0,
200
+ deaths: data.bowspleef_duel_deaths || 0,
201
+ wins: data.bowspleef_duel_wins || 0,
202
+ losses: data.bowspleef_duel_losses || 0,
203
+ WLRatio: divide(data.bowspleef_duel_wins || 0, data.bowspleef_duel_losses || 0),
204
+ playedGames: data.bowspleef_duel_rounds_played || 0
205
+ };
206
+ /**
207
+ * @type {DuelsArena}
208
+ */
209
+ this.arena = {
210
+ kills: data.duel_arena_kills || 0,
211
+ deaths: data.duel_arena_deaths || 0,
212
+ KDRatio: divide(data.duel_arena_kills, data.duel_arena_deaths),
213
+ wins: data.duel_arena_wins || 0,
214
+ losses: data.duel_arena_losses || 0,
215
+ WLRatio: divide(data.duel_arena_wins, data.duel_arena_losses),
216
+ playedGames: data.duel_arena_rounds_played || 0
217
+ };
218
+ /**
219
+ * MegaWalls duels stats
220
+ * @type {DuelsModeStats}
221
+ */
222
+ this.megawalls = {
223
+ division: getDivision(data, 'mega_walls'),
224
+ winstreak: data.current_winstreak_mode_mw_duel || 0,
225
+ bestWinstreak: data.best_winstreak_mode_mw_duel || 0,
226
+ kills: data.mw_duel_kills || 0,
227
+ deaths: data.mw_duel_deaths || 0,
228
+ KDRatio: divide(data.mw_duel_kills, data.mw_duel_deaths),
229
+ wins: data.mw_duel_wins || 0,
230
+ losses: data.mw_duel_losses || 0,
231
+ WLRatio: divide(data.mw_duel_wins, data.mw_duel_losses),
232
+ playedGames: data.mw_duel_rounds_played || 0
233
+ };
234
+ /**
235
+ * OP duels stats
236
+ * @type {DuelsOP}
237
+ */
238
+ this.op = {
239
+ overall: {
240
+ division: getDivision(data, 'op'),
241
+ winstreak: data.current_op_winstreak || 0,
242
+ bestWinstreak: data.best_op_winstreak || 0,
243
+ kills: (data.op_duel_kills || 0) + (data.op_doubles_kills || 0),
244
+ 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)),
246
+ wins: (data.op_duel_wins || 0) + (data.op_doubles_wins || 0),
247
+ 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)),
249
+ playedGames: (data.op_duel_rounds_played || 0) + (data.op_doubles_rounds_played || 0)
250
+ },
251
+ '1v1': {
252
+ division: getDivision(data, 'op'),
253
+ winstreak: data.current_winstreak_mode_op_duel || 0,
254
+ bestWinstreak: data.best_winstreak_mode_op_duel || 0,
255
+ kills: data.op_duel_kills || 0,
256
+ deaths: data.op_duel_deaths || 0,
257
+ KDRatio: divide(data.op_duel_kills, data.op_duel_deaths),
258
+ wins: data.op_duel_wins || 0,
259
+ losses: data.op_duel_losses || 0,
260
+ WLRatio: divide(data.op_duel_wins, data.op_duel_losses),
261
+ playedGames: data.op_duel_rounds_played || 0
262
+ },
263
+ '2v2': {
264
+ division: getDivision(data, 'op'),
265
+ winstreak: data.current_winstreak_mode_op_doubles || 0,
266
+ bestWinstreak: data.best_winstreak_mode_op_doubles || 0,
267
+ kills: data.op_doubles_kills || 0,
268
+ deaths: data.op_doubles_deaths || 0,
269
+ KDRatio: divide(data.op_doubles_kills, data.op_doubles_deaths),
270
+ wins: data.op_doubles_wins || 0,
271
+ losses: data.op_doubles_losses || 0,
272
+ WLRatio: divide(data.op_doubles_wins, data.op_doubles_losses),
273
+ playedGames: data.op_doubles_rounds_played || 0
274
+ }
275
+ };
276
+ /**
277
+ * SkyWars duels stats
278
+ * @type {DuelsSkyWars}
279
+ */
280
+ this.skywars = {
281
+ overall: {
282
+ division: getDivision(data, 'skywars'),
283
+ winstreak: data.current_skywars_winstreak || 0,
284
+ bestWinstreak: data.best_skywars_winstreak || 0,
285
+ kills: (data.sw_duel_kills || 0) + (data.sw_doubles_kills || 0),
286
+ 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)),
288
+ wins: (data.sw_duel_wins || 0) + (data.sw_doubles_wins || 0),
289
+ 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)),
291
+ playedGames: (data.sw_duel_rounds_played || 0) + (data.sw_doubles_rounds_played || 0)
292
+ },
293
+ '1v1': {
294
+ division: getDivision(data, 'skywars'),
295
+ winstreak: data.current_winstreak_mode_sw_duel || 0,
296
+ bestWinstreak: data.best_winstreak_mode_sw_duel || 0,
297
+ kills: data.sw_duel_kills || 0,
298
+ deaths: data.sw_duel_deaths || 0,
299
+ KDRatio: divide(data.sw_duel_kills, data.sw_duel_deaths),
300
+ wins: data.sw_duel_wins || 0,
301
+ losses: data.sw_duel_losses || 0,
302
+ WLRatio: divide(data.sw_duel_wins, data.sw_duel_losses),
303
+ playedGames: data.sw_duel_rounds_played || 0
304
+ },
305
+ '2v2': {
306
+ division: getDivision(data, 'skywars'),
307
+ winstreak: data.current_winstreak_mode_sw_doubles || 0,
308
+ bestWinstreak: data.best_winstreak_mode_sw_doubles || 0,
309
+ kills: data.sw_doubles_kills || 0,
310
+ deaths: data.sw_doubles_deaths || 0,
311
+ KDRatio: divide(data.sw_doubles_kills, data.sw_doubles_deaths),
312
+ wins: data.sw_doubles_wins || 0,
313
+ losses: data.sw_doubles_losses || 0,
314
+ WLRatio: divide(data.sw_doubles_wins, data.sw_doubles_losses),
315
+ playedGames: data.sw_doubles_rounds_played || 0
316
+ }
317
+ };
318
+ /**
319
+ * Sumo duels stats
320
+ * @type {DuelsModeStats}
321
+ */
322
+ this.sumo = {
323
+ division: getDivision(data, 'sumo'),
324
+ winstreak: data.current_winstreak_mode_sumo_duel || 0,
325
+ bestWinstreak: data.best_winstreak_mode_sumo_duel || 0,
326
+ kills: data.sumo_duel_kills || 0,
327
+ deaths: data.sumo_duel_deaths || 0,
328
+ KDRatio: divide(data.sumo_duel_kills, data.sumo_duel_deaths),
329
+ wins: data.sumo_duel_wins || 0,
330
+ losses: data.sumo_duel_losses || 0,
331
+ WLRatio: divide(data.sumo_duel_wins, data.sumo_duel_losses),
332
+ playedGames: data.sumo_duel_rounds_played || 0
333
+ };
334
+ /**
335
+ * Classic duels stats
336
+ * @type {DuelsModeStats}
337
+ */
338
+ this.classic = {
339
+ division: getDivision(data, 'classic'),
340
+ winstreak: data.current_winstreak_mode_classic_duel || 0,
341
+ bestWinstreak: data.best_winstreak_mode_classic_duel || 0,
342
+ kills: data.classic_duel_kills || 0,
343
+ deaths: data.classic_duel_deaths || 0,
344
+ KDRatio: divide(data.classic_duel_kills, data.classic_duel_deaths),
345
+ wins: data.classic_duel_wins || 0,
346
+ losses: data.classic_duel_losses || 0,
347
+ WLRatio: divide(data.classic_duel_wins, data.classic_duel_losses),
348
+ playedGames: data.classic_duel_rounds_played || 0
349
+ };
350
+ /**
351
+ * Combo duels stats
352
+ * @type {DuelsModeStats}
353
+ */
354
+ this.combo = {
355
+ division: getDivision(data, 'combo'),
356
+ winstreak: data.current_winstreak_mode_combo_duel || 0,
357
+ bestWinstreak: data.best_winstreak_mode_combo_duel || 0,
358
+ kills: data.combo_duel_kills || 0,
359
+ deaths: data.combo_duel_deaths || 0,
360
+ KDRatio: divide(data.combo_duel_kills, data.combo_duel_deaths),
361
+ wins: data.combo_duel_wins || 0,
362
+ losses: data.combo_duel_losses || 0,
363
+ WLRatio: divide(data.combo_duel_wins, data.combo_duel_losses),
364
+ playedGames: data.combo_duel_rounds_played || 0
365
+ };
366
+ /**
367
+ * The bridge duels stats
368
+ * @type {DuelsBridge}
369
+ */
370
+ this.bridge = {
371
+ overall: {
372
+ division: getDivision(data, 'bridge'),
373
+ winstreak: data.current_bridge_winstreak || 0,
374
+ bestWinstreak: data.best_bridge_winstreak || 0,
375
+ kills:
376
+ (data.bridge_duel_bridge_kills || 0) +
377
+ (data.bridge_doubles_bridge_kills || 0) +
378
+ (data.bridge_2v2v2v2_bridge_kills || 0) +
379
+ (data.bridge_3v3v3v3_bridge_kills || 0) +
380
+ (data.bridge_four_bridge_kills || 0) +
381
+ (data.bridge_threes_bridge_kills || 0) +
382
+ (data.capture_threes_bridge_kills || 0),
383
+ deaths:
384
+ (data.bridge_duel_bridge_deaths || 0) +
385
+ (data.bridge_doubles_bridge_deaths || 0) +
386
+ (data.bridge_2v2v2v2_bridge_deaths || 0) +
387
+ (data.bridge_3v3v3v3_bridge_deaths || 0) +
388
+ (data.bridge_four_bridge_deaths || 0) +
389
+ (data.bridge_threes_bridge_deaths || 0) +
390
+ (data.capture_threes_bridge_deaths || 0),
391
+ KDRatio: divide(
392
+ (data.bridge_duel_bridge_kills || 0) +
393
+ (data.bridge_doubles_bridge_kills || 0) +
394
+ (data.bridge_2v2v2v2_bridge_kills || 0) +
395
+ (data.bridge_3v3v3v3_bridge_kills || 0) +
396
+ (data.bridge_four_bridge_kills || 0) +
397
+ (data.bridge_threes_bridge_kills || 0) +
398
+ (data.capture_threes_bridge_kills || 0),
399
+ (data.bridge_duel_bridge_deaths || 0) +
400
+ (data.bridge_doubles_bridge_deaths || 0) +
401
+ (data.bridge_2v2v2v2_bridge_deaths || 0) +
402
+ (data.bridge_3v3v3v3_bridge_deaths || 0) +
403
+ (data.bridge_four_bridge_deaths || 0) +
404
+ (data.bridge_threes_bridge_deaths || 0) +
405
+ (data.capture_threes_bridge_deaths || 0)
406
+ ),
407
+ wins:
408
+ (data.bridge_duel_wins || 0) +
409
+ (data.bridge_doubles_wins || 0) +
410
+ (data.bridge_2v2v2v2_wins || 0) +
411
+ (data.bridge_3v3v3v3_wins || 0) +
412
+ (data.bridge_four_wins || 0) +
413
+ (data.bridge_threes_wins || 0) +
414
+ (data.capture_threes_wins || 0),
415
+ losses:
416
+ (data.bridge_duel_losses || 0) +
417
+ (data.bridge_doubles_losses || 0) +
418
+ (data.bridge_2v2v2v2_losses || 0) +
419
+ (data.bridge_3v3v3v3_losses || 0) +
420
+ (data.bridge_four_losses || 0) +
421
+ (data.bridge_threes_bridge_losses || 0) +
422
+ (data.capture_threes_bridge_losses || 0),
423
+ WLRatio: divide(
424
+ (data.bridge_duel_wins || 0) +
425
+ (data.bridge_doubles_wins || 0) +
426
+ (data.bridge_2v2v2v2_wins || 0) +
427
+ (data.bridge_3v3v3v3_wins || 0) +
428
+ (data.bridge_four_wins || 0) +
429
+ (data.bridge_threes_bridge_wins || 0) +
430
+ (data.capture_threes_wins || 0),
431
+ (data.bridge_duel_losses || 0) +
432
+ (data.bridge_doubles_losses || 0) +
433
+ (data.bridge_2v2v2v2_losses || 0) +
434
+ (data.bridge_3v3v3v3_losses || 0) +
435
+ (data.bridge_four_losses || 0) +
436
+ (data.bridge_threes_bridge_losses || 0) +
437
+ (data.capture_threes_bridge_losses || 0)
438
+ ),
439
+ playedGames:
440
+ (data.bridge_duel_rounds_played || 0) +
441
+ (data.bridge_doubles_rounds_played || 0) +
442
+ (data.bridge_2v2v2v2_rounds_played || 0) +
443
+ (data.bridge_3v3v3v3_rounds_played || 0) +
444
+ (data.bridge_four_rounds_played || 0) +
445
+ (data.bridge_threes_bridge_rounds_played || 0) +
446
+ (data.capture_threes_rounds_played || 0)
447
+ },
448
+ '1v1': {
449
+ division: getDivision(data, 'bridge'),
450
+ winstreak: data.current_winstreak_mode_bridge_duel || 0,
451
+ bestWinstreak: data.best_winstreak_mode_bridge_duel || 0,
452
+ kills: data.bridge_duel_bridge_kills || 0,
453
+ deaths: data.bridge_duel_bridge_deaths || 0,
454
+ KDRatio: divide(data.bridge_duel_bridge_kills, data.bridge_duel_bridge_deaths),
455
+ wins: data.bridge_duel_wins || 0,
456
+ losses: data.bridge_duel_losses || 0,
457
+ WLRatio: divide(data.bridge_duel_wins, data.bridge_duel_losses),
458
+ playedGames: data.bridge_duel_rounds_played || 0
459
+ },
460
+ '2v2': {
461
+ division: getDivision(data, 'bridge'),
462
+ winstreak: data.current_winstreak_mode_bridge_doubles || 0,
463
+ bestWinstreak: data.best_winstreak_mode_bridge_doubles || 0,
464
+ kills: data.bridge_doubles_bridge_kills || 0,
465
+ deaths: data.bridge_doubles_bridge_deaths || 0,
466
+ KDRatio: divide(data.bridge_doubles_bridge_kills, data.bridge_doubles_bridge_deaths),
467
+ wins: data.bridge_doubles_wins || 0,
468
+ losses: data.bridge_doubles_losses || 0,
469
+ WLRatio: divide(data.bridge_doubles_wins, data.bridge_doubles_losses),
470
+ playedGames: data.bridge_doubles_rounds_played || 0
471
+ },
472
+ '3v3': {
473
+ division: getDivision(data, 'bridge'),
474
+ winstreak: data.current_winstreak_mode_bridge_threes || 0,
475
+ bestWinstreak: data.best_winstreak_mode_bridge_threes || 0,
476
+ kills: data.bridge_threes_bridge_kills || 0,
477
+ deaths: data.bridge_threes_bridge_deaths || 0,
478
+ KDRatio: divide(data.bridge_threes_bridge_kills, data.bridge_threes_bridge_deaths),
479
+ wins: data.bridge_threes_wins || 0,
480
+ losses: data.bridge_threes_losses || 0,
481
+ WLRatio: divide(data.bridge_threes_wins, data.bridge_threes_losses),
482
+ playedGames: data.bridge_threes_rounds_played || 0
483
+ },
484
+ '2v2v2v2': {
485
+ division: getDivision(data, 'bridge'),
486
+ winstreak: data.current_winstreak_mode_bridge_2v2v2v2 || 0,
487
+ bestWinstreak: data.best_winstreak_mode_bridge_2v2v2v2 || 0,
488
+ kills: data.bridge_2v2v2v2_bridge_kills || 0,
489
+ deaths: data.bridge_2v2v2v2_bridge_deaths || 0,
490
+ KDRatio: divide(data.bridge_2v2v2v2_bridge_kills, data.bridge_2v2v2v2_bridge_deaths),
491
+ wins: data.bridge_2v2v2v2_wins || 0,
492
+ losses: data.bridge_2v2v2v2_losses || 0,
493
+ WLRatio: divide(data.bridge_2v2v2v2_wins, data.bridge_2v2v2v2_losses),
494
+ playedGames: data.bridge_2v2v2v2_rounds_played || 0
495
+ },
496
+ '3v3v3v3': {
497
+ division: getDivision(data, 'bridge'),
498
+ winstreak: data.current_winstreak_mode_bridge_3v3v3v3 || 0,
499
+ bestWinstreak: data.best_winstreak_mode_bridge_3v3v3v3 || 0,
500
+ kills: data.bridge_3v3v3v3_bridge_kills || 0,
501
+ deaths: data.bridge_3v3v3v3_bridge_deaths || 0,
502
+ KDRatio: divide(data.bridge_3v3v3v3_bridge_kills, data.bridge_3v3v3v3_bridge_deaths),
503
+ wins: data.bridge_3v3v3v3_wins || 0,
504
+ losses: data.bridge_3v3v3v3_losses || 0,
505
+ WLRatio: divide(data.bridge_3v3v3v3_wins, data.bridge_3v3v3v3_losses),
506
+ playedGames: data.bridge_3v3v3v3_rounds_played || 0
507
+ },
508
+ '4v4': {
509
+ division: getDivision(data, 'bridge'),
510
+ winstreak: data.current_winstreak_mode_bridge_four || 0,
511
+ bestWinstreak: data.best_winstreak_mode_bridge_four || 0,
512
+ kills: data.bridge_four_bridge_kills || 0,
513
+ deaths: data.bridge_four_bridge_deaths || 0,
514
+ KDRatio: divide(data.bridge_four_bridge_kills, data.bridge_four_bridge_deaths),
515
+ wins: data.bridge_four_wins || 0,
516
+ losses: data.bridge_four_losses || 0,
517
+ WLRatio: divide(data.bridge_four_wins, data.bridge_four_losses),
518
+ playedGames: data.bridge_four_rounds_played || 0
519
+ },
520
+ // eslint-disable-next-line quote-props
521
+ ctf: {
522
+ division: getDivision(data, 'bridge'),
523
+ kills: data.capture_threes_bridge_kills || 0,
524
+ deaths: data.capture_threes_bridge_deaths || 0,
525
+ KDRatio: divide(data.capture_threes_bridge_kills, data.capture_threes_bridge_deaths),
526
+ wins: data.capture_threes_wins || 0,
527
+ losses: data.capture_threes_losses || 0,
528
+ WLRatio: divide(data.capture_threes_wins, data.capture_threes_losses),
529
+ captures: data.capture_threes_captures || 0,
530
+ playedGames: data.capture_threes_rounds_played || 0
531
+ }
532
+ };
533
+ /**
534
+ * Blitz duel stats
535
+ * @type {DuelsModeStats}
536
+ */
537
+ this.blitz = {
538
+ division: getDivision(data, 'blitz'),
539
+ winstreak: data.current_winstreak_mode_blitz_duel || 0,
540
+ bestWinstreak: data.best_winstreak_mode_blitz_duel || 0,
541
+ kills: data.blitz_duel_kills || 0,
542
+ deaths: data.blitz_duel_deaths || 0,
543
+ KDRatio: divide(data.blitz_duel_kills, data.blitz_duel_deaths),
544
+ wins: data.blitz_duel_wins || 0,
545
+ losses: data.blitz_duel_losses || 0,
546
+ WLRatio: divide(data.blitz_duel_wins, data.blitz_duel_losses),
547
+ playedGames: data.blitz_duel_rounds_played || 0
548
+ };
549
+ /**
550
+ * Nodebuff duel stats
551
+ * @type {DuelsModeStats}
552
+ */
553
+ this.nodebuff = {
554
+ division: getDivision(data, 'no_debuff'),
555
+ winstreak: data.current_winstreak_mode_potion_duel || 0,
556
+ bestWinstreak: data.best_winstreak_mode_potion_duel || 0,
557
+ kills: data.potion_duel_kills || 0,
558
+ deaths: data.potion_duel_deaths || 0,
559
+ KDRatio: divide(data.potion_duel_kills, data.potion_duel_deaths),
560
+ wins: data.potion_duel_wins || 0,
561
+ losses: data.potion_duel_losses || 0,
562
+ WLRatio: divide(data.potion_duel_wins, data.potion_duel_losses),
563
+ playedGames: data.potion_duel_rounds_played || 0
564
+ };
565
+ /**
566
+ * Bow duel stats
567
+ * @type {DuelsModeStats}
568
+ */
569
+ this.bow = {
570
+ division: getDivision(data, 'bow'),
571
+ winstreak: data.current_winstreak_mode_bow_duel || 0,
572
+ bestWinstreak: data.best_winstreak_mode_bow_duel || 0,
573
+ kills: data.bow_duel_kills || 0,
574
+ deaths: data.bow_duel_deaths || 0,
575
+ KDRatio: divide(data.bow_duel_kills, data.bow_duel_deaths),
576
+ wins: data.bow_duel_wins || 0,
577
+ losses: data.bow_duel_losses || 0,
578
+ WLRatio: divide(data.bow_duel_wins, data.bow_duel_losses),
579
+ playedGames: data.bow_duel_rounds_played || 0
580
+ };
581
+ }
582
+ }
583
+ /**
584
+ * @typedef {object} DuelsModeStats
585
+ * @property {number} winstreak Current winstreak
586
+ * @property {number} bestWinstreak Best winstreak
587
+ * @property {string|null} division Division
588
+ * @property {number} kills Kills
589
+ * @property {number} deaths Deaths
590
+ * @property {number} wins Wins
591
+ * @property {number} losses Losses
592
+ * @property {number} KDRatio Kill/Death ratio
593
+ * @property {number} WLRatio Win/Loss ratio
594
+ * @property {number} playedGames Played games
595
+ */
596
+ /**
597
+ * @typedef {object} BridgeModeStats
598
+ * @property {number} winstreak Current winstreak
599
+ * @property {number} bestWinstreak Best winstreak
600
+ * @property {string|null} division Division
601
+ * @property {number} kills Kills
602
+ * @property {number} deaths Deaths
603
+ * @property {number} wins Wins
604
+ * @property {number} losses Losses
605
+ * @property {number} KDRatio Kill/Death ratio
606
+ * @property {number} WLRatio Win/Loss ratio
607
+ * @property {number} playedGames Played games
608
+ */
609
+ /**
610
+ * @typedef {object} DuelsBowspleef
611
+ * @property {string|null} division Division
612
+ * @property {number} winstreak Winstreak
613
+ * @property {number} bestWinstreak Best winstreak
614
+ * @property {number} bowShots Bow shots
615
+ * @property {number} deaths Deaths
616
+ * @property {number} wins Wins
617
+ * @property {number} losses Losses
618
+ * @property {number} WLRatio Win/Loss ratio
619
+ * @property {number} playedGames Played games
620
+ */
621
+ /**
622
+ * @typedef {object} BridgeCTFModeStats
623
+ * @property {string|null} division Division
624
+ * @property {number} kills Kills
625
+ * @property {number} deaths Deaths
626
+ * @property {number} wins Wins
627
+ * @property {number} losses Losses
628
+ * @property {number} KDRatio Kill/Death ratio
629
+ * @property {number} WLRatio Win/Loss ratio
630
+ * @property {number} playedGames Played games
631
+ * @property {number} captures Captures
632
+ */
633
+ /**
634
+ * @typedef {object} DuelsParkour
635
+ * @property {string|null} division Division
636
+ * @property {number} deaths Deaths
637
+ * @property {number} wins Wins
638
+ * @property {number} losses Losses
639
+ * @property {number} WLRatio Win/Loss ratio
640
+ * @property {number} playedGames Played games
641
+ */
642
+ /**
643
+ * @typedef {object} DuelsBoxing
644
+ * @property {string|null} division Division
645
+ * @property {number} kills Kills
646
+ * @property {number} wins Wins
647
+ * @property {number} losses Losses
648
+ * @property {number} WLRatio Win/Loss ratio
649
+ * @property {number} playedGames Played games
650
+ * @property {number} meleeSwings Melee swings
651
+ * @property {number} meleeHits Melee hits
652
+ */
653
+ /**
654
+ * @typedef {object} DuelsArena
655
+ * @property {number} kills Kills
656
+ * @property {number} deaths Deaths
657
+ * @property {number} wins Wins
658
+ * @property {number} losses Losses
659
+ * @property {number} KDRatio Kill/Death ratio
660
+ * @property {number} WLRatio Win/Loss ratio
661
+ * @property {number} playedGames Played games
662
+ */
663
+ /**
664
+ * @typedef {object} DuelsOP
665
+ * @property {DuelsModeStats} overall Overall OP duel stats
666
+ * @property {DuelsModeStats} '1v1' OP Duel 1v1 stats
667
+ * @property {DuelsModeStats} '2v2' OP Duel 2v2 stats
668
+ */
669
+ /**
670
+ * @typedef {object} DuelsUHC
671
+ * @property {DuelsModeStats} overall Overall UHC duel stats
672
+ * @property {DuelsModeStats} '1v1' UHC Duel 1v1 stats
673
+ * @property {DuelsModeStats} '2v2' UHC Duel 2v2 stats
674
+ * @property {DuelsModeStats} '4v4' UHC Duel 4v4 stats
675
+ * @property {DuelsModeStats} meetup UHC Meetup
676
+ */
677
+ /**
678
+ * @typedef {object} DuelsSkyWars
679
+ * @property {DuelsModeStats} overall Overall SkyWars duel stats
680
+ * @property {DuelsModeStats} '1v1' SkyWars Duel 1v1 stats
681
+ * @property {DuelsModeStats} '2v2' SkyWars Duel 2v2 stats
682
+ */
683
+ /**
684
+ * @typedef {object} DuelsBridge
685
+ * @property {BridgeModeStats} overall Overall The Bridge duel stats
686
+ * @property {BridgeModeStats} '1v1' The Bridge Duel 1v1 stats
687
+ * @property {BridgeModeStats} '2v2' The Bridge Duel 2v2 stats
688
+ * @property {BridgeModeStats} '3v3' The Bridge Duel 3v3 stats
689
+ * @property {BridgeModeStats} '4v4' The Bridge Duel 4v4 stats
690
+ * @property {BridgeModeStats} '2v2v2v2' The Bridge Duel 2v2v2v2 stats
691
+ * @property {BridgeModeStats} '3v3v3v3' The Bridge Duel 3v3v3v3 stats
692
+ * @property {BridgeCTFModeStats} ctf The Bridge Capture The Flag duel 3v3 stats
693
+ */
694
+ module.exports = Duels;