hypixel-api-reborn 9.0.3 → 11.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 (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 -7
  5. package/src/API/getBoosters.js +6 -5
  6. package/src/API/getGameCounts.js +6 -5
  7. package/src/API/getGuild.js +18 -17
  8. package/src/API/getLeaderboards.js +13 -12
  9. package/src/API/getPlayer.js +22 -26
  10. package/src/API/getRecentGames.js +18 -17
  11. package/src/API/getServerInfo.js +66 -77
  12. package/src/API/getStatus.js +8 -7
  13. package/src/API/getWatchdogStats.js +6 -5
  14. package/src/API/index.js +19 -9
  15. package/src/API/skyblock/getEndedSkyblockAuctions.js +10 -9
  16. package/src/API/skyblock/getSkyblockAuctions.js +64 -64
  17. package/src/API/skyblock/getSkyblockAuctionsByPlayer.js +11 -10
  18. package/src/API/skyblock/getSkyblockBazaar.js +10 -9
  19. package/src/API/skyblock/getSkyblockMember.js +28 -24
  20. package/src/API/skyblock/getSkyblockNews.js +6 -5
  21. package/src/API/skyblock/getSkyblockProfiles.js +44 -40
  22. package/src/Client.js +406 -430
  23. package/src/Errors.js +44 -38
  24. package/src/Private/defaultCache.js +77 -0
  25. package/src/Private/rateLimit.js +79 -98
  26. package/src/Private/requests.js +65 -39
  27. package/src/Private/updater.js +45 -42
  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 -329
  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 -460
  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 -71
  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 -453
  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 -102
  79. package/src/structures/SkyBlock/SkyblockMember.js +820 -675
  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 -795
  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 -9
  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 -0
  95. package/src/utils/romanize.js +11 -0
  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 -2625
  100. package/src/API/getFriends.js +0 -13
  101. package/src/API/getKeyInfo.js +0 -9
  102. package/src/API/getRankedSkyWars.js +0 -10
  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,460 +1,694 @@
1
- /* eslint-disable max-len */
2
- const divide = require('../../utils/divide');
3
- /**
4
- * @param {string} string
5
- * @return {string}
6
- */
7
- function capitalize (string) {
8
- return string.charAt(0).toUpperCase() + string.slice(1);
9
- }
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
- /**
23
- * @param {object} data
24
- * @return {string|null}
25
- */
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;
36
- }
37
- }
38
- /**
39
- * Duels class
40
- */
41
- class Duels {
42
- /**
43
- * @param {object} data Duels data
44
- */
45
- constructor (data) {
46
- /**
47
- * Coins
48
- * @type {number}
49
- */
50
- this.coins = data.coins || 0;
51
- /**
52
- * Cosmetic title
53
- * @type {string|null}
54
- */
55
- this.title = cosmeticTitlePrestige(data);
56
- /**
57
- * Kills
58
- * @type {number}
59
- */
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));
61
- /**
62
- * Deaths
63
- * @type {number}
64
- */
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));
66
- /**
67
- * Kill Death ratio
68
- * @type {number}
69
- */
70
- this.KDRatio = divide(this.kills, this.deaths);
71
- /**
72
- * Wins
73
- * @type {number}
74
- */
75
- this.wins = data.wins || 0;
76
- /**
77
- * Losses
78
- * @type {number}
79
- */
80
- this.losses = data.losses || 0;
81
- /**
82
- * Win Loss ratio
83
- * @type {number}
84
- */
85
- this.WLRatio = divide(this.wins, this.losses);
86
- /**
87
- * Played games
88
- * @type {number}
89
- */
90
- this.playedGames = data.games_played_duels || 0;
91
- /**
92
- * Current winstreak
93
- * @type {number}
94
- */
95
- this.winstreak = data.current_winstreak || 0;
96
- /**
97
- * Best overall winstreak
98
- * @type {number}
99
- */
100
- this.bestWinstreak = data.best_overall_winstreak || 0;
101
- /**
102
- * UHC duels stats
103
- * @type {DuelsUHC}
104
- */
105
- this.uhc = {
106
- 'overall': {
107
- winstreak: data.current_uhc_winstreak || 0,
108
- bestWinstreak: data.best_uhc_winstreak || 0,
109
- kills: (data.uhc_duel_kills || 0) + (data.uhc_doubles_kills || 0) + (data.uhc_four_kills || 0) + (data.uhc_meetup_kills || 0),
110
- deaths: (data.uhc_duel_deaths || 0) + (data.uhc_doubles_deaths || 0) + (data.uhc_four_deaths || 0) + (data.uhc_meetup_deaths || 0),
111
- 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)),
112
- wins: (data.uhc_duel_wins || 0) + (data.uhc_doubles_wins || 0) + (data.uhc_four_wins || 0) + (data.uhc_meetup_wins || 0),
113
- losses: (data.uhc_duel_losses || 0) + (data.uhc_doubles_losses || 0) + (data.uhc_four_losses || 0) + (data.uhc_meetup_losses || 0),
114
- 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)),
115
- 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
- },
117
- '1v1': {
118
- winstreak: data.current_winstreak_mode_uhc_duel || 0,
119
- bestWinstreak: data.best_winstreak_mode_uhc_duel || 0,
120
- kills: data.uhc_duel_kills || 0,
121
- deaths: data.uhc_duel_deaths || 0,
122
- KDRatio: divide(data.uhc_duel_kills, data.uhc_duel_deaths),
123
- wins: data.uhc_duel_wins || 0,
124
- losses: data.uhc_duel_losses || 0,
125
- WLRatio: divide(data.uhc_duel_wins, data.uhc_duel_losses),
126
- playedGames: data.uhc_duel_rounds_played || 0
127
- },
128
- '2v2': {
129
- winstreak: data.current_winstreak_mode_uhc_doubles || 0,
130
- bestWinstreak: data.best_winstreak_mode_uhc_doubles || 0,
131
- kills: data.uhc_doubles_kills || 0,
132
- deaths: data.uhc_doubles_deaths || 0,
133
- KDRatio: divide(data.uhc_doubles_kills, data.uhc_doubles_deaths),
134
- wins: data.uhc_doubles_wins || 0,
135
- losses: data.uhc_doubles_losses || 0,
136
- WLRatio: divide(data.uhc_doubles_wins, data.uhc_doubles_losses),
137
- playedGames: data.uhc_doubles_rounds_played || 0
138
- },
139
- '4v4': {
140
- winstreak: data.current_winstreak_mode_uhc_four || 0,
141
- bestWinstreak: data.best_winstreak_mode_uhc_four || 0,
142
- kills: data.uhc_four_kills || 0,
143
- deaths: data.uhc_four_deaths || 0,
144
- KDRatio: divide(data.uhc_four_kills, data.uhc_four_deaths),
145
- wins: data.uhc_four_wins || 0,
146
- losses: data.uhc_four_losses || 0,
147
- WLRatio: divide(data.uhc_four_wins, data.uhc_four_losses),
148
- playedGames: data.uhc_four_rounds_played || 0
149
- },
150
- 'meetup': {
151
- winstreak: data.current_winstreak_mode_uhc_meetup || 0,
152
- bestWinstreak: data.best_winstreak_mode_uhc_meetup || 0,
153
- kills: data.uhc_meetup_kills || 0,
154
- deaths: data.uhc_meetup_deaths || 0,
155
- KDRatio: divide(data.uhc_meetup_kills, data.uhc_meetup_deaths),
156
- wins: data.uhc_meetup_wins || 0,
157
- losses: data.uhc_meetup_losses || 0,
158
- WLRatio: divide(data.uhc_meetup_wins, data.uhc_meetup_losses),
159
- playedGames: data.uhc_meetup_rounds_played || 0
160
- }
161
- };
162
- /**
163
- * MegaWalls duels stats
164
- * @type {DuelsModeStats}
165
- */
166
- this.megawalls = {
167
- winstreak: data.current_winstreak_mode_mw_duel || 0,
168
- bestWinstreak: data.best_winstreak_mode_mw_duel || 0,
169
- kills: data.mw_duel_kills || 0,
170
- deaths: data.mw_duel_deaths || 0,
171
- KDRatio: divide(data.mw_duel_kills, data.mw_duel_deaths),
172
- wins: data.mw_duel_wins || 0,
173
- losses: data.mw_duel_losses || 0,
174
- WLRatio: divide(data.mw_duel_wins, data.mw_duel_losses),
175
- playedGames: data.mw_duel_rounds_played || 0
176
- };
177
- /**
178
- * OP duels stats
179
- * @type {DuelsOP}
180
- */
181
- this.op = {
182
- 'overall': {
183
- winstreak: data.current_op_winstreak || 0,
184
- bestWinstreak: data.best_op_winstreak || 0,
185
- kills: (data.op_duel_kills || 0) + (data.op_doubles_kills || 0),
186
- deaths: (data.op_duel_deaths || 0) + (data.op_doubles_deaths || 0),
187
- KDRatio: divide((data.op_duel_kills || 0) + (data.op_doubles_kills || 0), (data.op_duel_deaths || 0) + (data.op_doubles_deaths || 0)),
188
- wins: (data.op_duel_wins || 0) + (data.op_doubles_wins || 0),
189
- losses: (data.op_duel_losses || 0) + (data.op_doubles_losses || 0),
190
- WLRatio: divide((data.op_duel_wins || 0) + (data.op_doubles_wins || 0), (data.op_duel_losses || 0) + (data.op_doubles_losses || 0)),
191
- playedGames: (data.op_duel_rounds_played || 0) + (data.op_doubles_rounds_played || 0)
192
- },
193
- '1v1': {
194
- winstreak: data.current_winstreak_mode_op_duel || 0,
195
- bestWinstreak: data.best_winstreak_mode_op_duel || 0,
196
- kills: data.op_duel_kills || 0,
197
- deaths: data.op_duel_deaths || 0,
198
- KDRatio: divide(data.op_duel_kills, data.op_duel_deaths),
199
- wins: data.op_duel_wins || 0,
200
- losses: data.op_duel_losses || 0,
201
- WLRatio: divide(data.op_duel_wins, data.op_duel_losses),
202
- playedGames: data.op_duel_rounds_played || 0
203
- },
204
- '2v2': {
205
- winstreak: data.current_winstreak_mode_op_doubles || 0,
206
- bestWinstreak: data.best_winstreak_mode_op_doubles || 0,
207
- kills: data.op_doubles_kills || 0,
208
- deaths: data.op_doubles_deaths || 0,
209
- KDRatio: divide(data.op_doubles_kills, data.op_doubles_deaths),
210
- wins: data.op_doubles_wins || 0,
211
- losses: data.op_doubles_losses || 0,
212
- WLRatio: divide(data.op_doubles_wins, data.op_doubles_losses),
213
- playedGames: data.op_doubles_rounds_played || 0
214
- }
215
- };
216
- /**
217
- * SkyWars duels stats
218
- * @type {DuelsSkyWars}
219
- */
220
- this.skywars = {
221
- 'overall': {
222
- winstreak: data.current_skywars_winstreak || 0,
223
- bestWinstreak: data.best_skywars_winstreak || 0,
224
- kills: ((data.sw_duel_kills || 0) + (data.sw_doubles_kills || 0)),
225
- deaths: ((data.sw_duel_deaths || 0) + (data.sw_doubles_deaths || 0)),
226
- KDRatio: divide((data.sw_duel_kills || 0) + (data.sw_doubles_kills || 0), (data.sw_duel_deaths || 0) + (data.sw_doubles_deaths || 0)),
227
- wins: ((data.sw_duel_wins || 0) + (data.sw_doubles_wins || 0)),
228
- losses: ((data.sw_duel_losses || 0) + (data.sw_doubles_losses || 0)),
229
- WLRatio: divide((data.sw_duel_wins || 0) + (data.sw_doubles_wins || 0), (data.sw_duel_losses || 0) + (data.sw_doubles_losses || 0)),
230
- playedGames: (data.sw_duel_rounds_played || 0) + (data.sw_doubles_rounds_played || 0)
231
- },
232
- '1v1': {
233
- winstreak: data.current_winstreak_mode_sw_duel || 0,
234
- bestWinstreak: data.best_winstreak_mode_sw_duel || 0,
235
- kills: data.sw_duel_kills || 0,
236
- deaths: data.sw_duel_deaths || 0,
237
- KDRatio: divide(data.sw_duel_kills, data.sw_duel_deaths),
238
- wins: data.sw_duel_wins || 0,
239
- losses: data.sw_duel_losses || 0,
240
- WLRatio: divide(data.sw_duel_wins, data.sw_duel_losses),
241
- playedGames: data.sw_duel_rounds_played || 0
242
- },
243
- '2v2': {
244
- winstreak: data.current_winstreak_mode_sw_doubles || 0,
245
- bestWinstreak: data.best_winstreak_mode_sw_doubles || 0,
246
- kills: data.sw_doubles_kills || 0,
247
- deaths: data.sw_doubles_deaths || 0,
248
- KDRatio: divide(data.sw_doubles_kills, data.sw_doubles_deaths),
249
- wins: data.sw_doubles_wins || 0,
250
- losses: data.sw_doubles_losses || 0,
251
- WLRatio: divide(data.sw_doubles_wins, data.sw_doubles_losses),
252
- playedGames: data.sw_doubles_rounds_played || 0
253
- }
254
- };
255
- /**
256
- * Sumo duels stats
257
- * @type {DuelsModeStats}
258
- */
259
- this.sumo = {
260
- winstreak: data.current_winstreak_mode_sumo_duel || 0,
261
- bestWinstreak: data.best_winstreak_mode_sumo_duel || 0,
262
- kills: data.sumo_duel_kills || 0,
263
- deaths: data.sumo_duel_deaths || 0,
264
- KDRatio: divide(data.sumo_duel_kills, data.sumo_duel_deaths),
265
- wins: data.sumo_duel_wins || 0,
266
- losses: data.sumo_duel_losses || 0,
267
- WLRatio: divide(data.sumo_duel_wins, data.sumo_duel_losses),
268
- playedGames: data.sumo_duel_rounds_played || 0
269
- };
270
- /**
271
- * Classic duels stats
272
- * @type {DuelsModeStats}
273
- */
274
- this.classic = {
275
- winstreak: data.current_winstreak_mode_classic_duel || 0,
276
- bestWinstreak: data.best_winstreak_mode_classic_duel || 0,
277
- kills: data.classic_duel_kills || 0,
278
- deaths: data.classic_duel_deaths || 0,
279
- KDRatio: divide(data.classic_duel_kills, data.classic_duel_deaths),
280
- wins: data.classic_duel_wins || 0,
281
- losses: data.classic_duel_losses || 0,
282
- WLRatio: divide(data.classic_duel_wins, data.classic_duel_losses),
283
- playedGames: data.classic_duel_rounds_played || 0
284
- };
285
- /**
286
- * Combo duels stats
287
- * @type {DuelsModeStats}
288
- */
289
- this.combo = {
290
- winstreak: data.current_winstreak_mode_combo_duel || 0,
291
- bestWinstreak: data.best_winstreak_mode_combo_duel || 0,
292
- kills: data.combo_duel_kills || 0,
293
- deaths: data.combo_duel_deaths || 0,
294
- KDRatio: divide(data.combo_duel_kills, data.combo_duel_deaths),
295
- wins: data.combo_duel_wins || 0,
296
- losses: data.combo_duel_losses || 0,
297
- WLRatio: divide(data.combo_duel_wins, data.combo_duel_losses),
298
- playedGames: data.combo_duel_rounds_played || 0
299
- };
300
- /**
301
- * The bridge duels stats
302
- * @type {DuelsBridge}
303
- */
304
- this.bridge = {
305
- 'overall': {
306
- winstreak: data.current_bridge_winstreak || 0,
307
- 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))
315
- },
316
- '1v1': {
317
- winstreak: data.current_winstreak_mode_bridge_duel || 0,
318
- bestWinstreak: data.best_winstreak_mode_bridge_duel || 0,
319
- kills: data.bridge_duel_bridge_kills || 0,
320
- deaths: data.bridge_duel_bridge_deaths || 0,
321
- KDRatio: divide(data.bridge_duel_bridge_kills, data.bridge_duel_bridge_deaths),
322
- wins: data.bridge_duel_wins || 0,
323
- losses: data.bridge_duel_losses || 0,
324
- WLRatio: divide(data.bridge_duel_wins, data.bridge_duel_losses),
325
- playedGames: data.bridge_duel_rounds_played || 0
326
- },
327
- '2v2': {
328
- winstreak: data.current_winstreak_mode_bridge_doubles || 0,
329
- bestWinstreak: data.best_winstreak_mode_bridge_doubles || 0,
330
- kills: data.bridge_doubles_bridge_kills || 0,
331
- deaths: data.bridge_doubles_bridge_deaths || 0,
332
- KDRatio: divide(data.bridge_doubles_bridge_kills, data.bridge_doubles_bridge_deaths),
333
- wins: data.bridge_doubles_wins || 0,
334
- losses: data.bridge_doubles_losses || 0,
335
- WLRatio: divide(data.bridge_doubles_wins, data.bridge_doubles_losses),
336
- playedGames: data.bridge_doubles_rounds_played || 0
337
- },
338
- '2v2v2v2': {
339
- winstreak: data.current_winstreak_mode_bridge_2v2v2v2 || 0,
340
- bestWinstreak: data.best_winstreak_mode_bridge_2v2v2v2 || 0,
341
- kills: data.bridge_2v2v2v2_bridge_kills || 0,
342
- deaths: data.bridge_2v2v2v2_bridge_deaths || 0,
343
- KDRatio: divide(data.bridge_2v2v2v2_bridge_kills, data.bridge_2v2v2v2_bridge_deaths),
344
- wins: data.bridge_2v2v2v2_wins || 0,
345
- losses: data.bridge_2v2v2v2_losses || 0,
346
- WLRatio: divide(data.bridge_2v2v2v2_wins, data.bridge_2v2v2v2_losses),
347
- playedGames: data.bridge_2v2v2v2_rounds_played || 0
348
- },
349
- '3v3v3v3': {
350
- winstreak: data.current_winstreak_mode_bridge_3v3v3v3 || 0,
351
- bestWinstreak: data.best_winstreak_mode_bridge_3v3v3v3 || 0,
352
- kills: data.bridge_3v3v3v3_bridge_kills || 0,
353
- deaths: data.bridge_3v3v3v3_bridge_deaths || 0,
354
- KDRatio: divide(data.bridge_3v3v3v3_bridge_kills, data.bridge_3v3v3v3_bridge_deaths),
355
- wins: data.bridge_3v3v3v3_wins || 0,
356
- losses: data.bridge_3v3v3v3_losses || 0,
357
- WLRatio: divide(data.bridge_3v3v3v3_wins, data.bridge_3v3v3v3_losses),
358
- playedGames: data.bridge_3v3v3v3_rounds_played || 0
359
- },
360
- '4v4': {
361
- winstreak: data.current_winstreak_mode_bridge_four || 0,
362
- bestWinstreak: data.best_winstreak_mode_bridge_four || 0,
363
- kills: data.bridge_four_bridge_kills || 0,
364
- deaths: data.bridge_four_bridge_deaths || 0,
365
- KDRatio: divide(data.bridge_four_bridge_kills, data.bridge_four_bridge_deaths),
366
- wins: data.bridge_four_wins || 0,
367
- losses: data.bridge_four_losses || 0,
368
- WLRatio: divide(data.bridge_four_wins, data.bridge_four_losses),
369
- playedGames: data.bridge_four_rounds_played || 0
370
- }
371
- };
372
- /**
373
- * Blitz duel stats
374
- * @type {DuelsModeStats}
375
- */
376
- this.blitz = {
377
- winstreak: data.current_winstreak_mode_blitz_duel || 0,
378
- bestWinstreak: data.best_winstreak_mode_blitz_duel || 0,
379
- kills: data.blitz_duel_kills || 0,
380
- deaths: data.blitz_duel_deaths || 0,
381
- KDRatio: divide(data.blitz_duel_kills, data.blitz_duel_deaths),
382
- wins: data.blitz_duel_wins || 0,
383
- losses: data.blitz_duel_losses || 0,
384
- WLRatio: divide(data.blitz_duel_wins, data.blitz_duel_losses),
385
- playedGames: data.blitz_duel_rounds_played || 0
386
- };
387
- /**
388
- * Nodebuff duel stats
389
- * @type {DuelsModeStats}
390
- */
391
- this.nodebuff = {
392
- winstreak: data.current_winstreak_mode_potion_duel || 0,
393
- bestWinstreak: data.best_winstreak_mode_potion_duel || 0,
394
- kills: data.potion_duel_kills || 0,
395
- deaths: data.potion_duel_deaths || 0,
396
- KDRatio: divide(data.potion_duel_kills, data.potion_duel_deaths),
397
- wins: data.potion_duel_wins || 0,
398
- losses: data.potion_duel_losses || 0,
399
- WLRatio: divide(data.potion_duel_wins, data.potion_duel_losses),
400
- playedGames: data.potion_duel_rounds_played || 0
401
- };
402
- /**
403
- * Bow duel stats
404
- * @type {DuelsModeStats}
405
- */
406
- this.bow = {
407
- winstreak: data.current_winstreak_mode_bow_duel || 0,
408
- bestWinstreak: data.best_winstreak_mode_bow_duel || 0,
409
- kills: data.bow_duel_kills || 0,
410
- deaths: data.bow_duel_deaths || 0,
411
- KDRatio: divide(data.bow_duel_kills, data.bow_duel_deaths),
412
- wins: data.bow_duel_wins || 0,
413
- losses: data.bow_duel_losses || 0,
414
- WLRatio: divide(data.bow_duel_wins, data.bow_duel_losses),
415
- playedGames: data.bow_duel_rounds_played || 0
416
- };
417
- }
418
- }
419
- /**
420
- * @typedef {object} DuelsModeStats
421
- * @property {number} winstreak Current winstreak
422
- * @property {number} bestWinstreak Best winstreak
423
- * @property {number} kills Kills
424
- * @property {number} deaths Deaths
425
- * @property {number} wins Wins
426
- * @property {number} losses Losses
427
- * @property {number} KDRatio Kill/Death ratio
428
- * @property {number} WLRatio Win/Loss ratio
429
- * @property {number} playedGames Played games
430
- */
431
- /**
432
- * @typedef {object} DuelsOP
433
- * @property {DuelsModeStats} overall Overall OP duel stats
434
- * @property {DuelsModeStats} '1v1' OP Duel 1v1 stats
435
- * @property {DuelsModeStats} '2v2' OP Duel 2v2 stats
436
- */
437
- /**
438
- * @typedef {object} DuelsUHC
439
- * @property {DuelsModeStats} overall Overall UHC duel stats
440
- * @property {DuelsModeStats} '1v1' UHC Duel 1v1 stats
441
- * @property {DuelsModeStats} '2v2' UHC Duel 2v2 stats
442
- * @property {DuelsModeStats} '4v4' UHC Duel 4v4 stats
443
- * @property {DuelsModeStats} meetup UHC Meetup
444
- */
445
- /**
446
- * @typedef {object} DuelsSkyWars
447
- * @property {DuelsModeStats} overall Overall SkyWars duel stats
448
- * @property {DuelsModeStats} '1v1' SkyWars Duel 1v1 stats
449
- * @property {DuelsModeStats} '2v2' SkyWars Duel 2v2 stats
450
- */
451
- /**
452
- * @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
459
- */
460
- 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;