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,675 +1,820 @@
1
- /* eslint-disable camelcase */
2
- const { decode, getLevelByXp, getLevelByAchievement, getSlayerLevel } = require('../../utils/SkyblockUtils');
3
- const { skyblock_year_0, skills, skills_achievements } = require('../../utils/Constants');
4
- const { single } = require('../../utils/removeSnakeCase');
5
- const SkyblockInventoryItem = require('./SkyblockInventoryItem');
6
- const SkyblockPet = require('./SkyblockPet');
7
- const objectPath = require('object-path');
8
- /**
9
- * Skyblock member class
10
- */
11
- class SkyblockMember {
12
- /**
13
- * @param {object} data Skyblock member data
14
- */
15
- constructor (data) {
16
- /**
17
- * Skyblock member UUID
18
- * @type {string}
19
- */
20
- this.uuid = data.uuid;
21
- /**
22
- * Skyblock member's player profile<br>
23
- * If `fetchPlayer` option is `true`.
24
- * @type {Player|null}
25
- */
26
- this.player = data.m.player || null;
27
- /**
28
- * Skyblock member's profile name
29
- * @type {string}
30
- */
31
- this.profileName = data.profileName;
32
- /**
33
- * Timestamp when player first joined SkyBlock
34
- * @type {number}
35
- */
36
- this.firstJoinTimestamp = data.m.first_join;
37
- /**
38
- * Timestamp when player first joined SkyBlock as Date
39
- * @type {Date}
40
- */
41
- this.firstJoinAt = new Date(data.m.first_join);
42
- /**
43
- * Timestamp when player first joined the SkyBlock Hub
44
- * @type {number}
45
- */
46
- this.firstJoinHubTimestamp = data.m.first_join_hub;
47
- /**
48
- * Timestamp when player first joined the SkyBlock Hub as Date
49
- * @type {Date}
50
- */
51
- this.firstJoinHubAt = new Date(this.firstJoinTimestamp + data.m.first_join_hub);
52
- /**
53
- * Last save timestamp
54
- * @type {number}
55
- */
56
- this.lastSave = data.m.last_save;
57
- /**
58
- * Last save timestamp as Date
59
- * @type {Date}
60
- */
61
- this.lastSaveAt = new Date(data.m.last_save);
62
- /**
63
- * Last death timestamp as Date
64
- * @type {Date}
65
- */
66
- this.lastDeathAt = new Date(skyblock_year_0 + data.m.last_death * 1000);
67
- /**
68
- * Last save timestamp
69
- * @type {number}
70
- */
71
- this.lastDeath = data.m.last_death;
72
- /**
73
- * Equipped armor
74
- * @return {Promise<SkyblockMemberArmor>}
75
- */
76
- this.getArmor = async () => {
77
- const base64 = data.m.inv_armor;
78
- const decoded = await decode(base64.data);
79
- const armor = {
80
- helmet: decoded[3].id ? new SkyblockInventoryItem(decoded[3]) : null,
81
- chestplate: decoded[2].id ? new SkyblockInventoryItem(decoded[2]) : null,
82
- leggings: decoded[1].id ? new SkyblockInventoryItem(decoded[1]) : null,
83
- boots: decoded[0].id ? new SkyblockInventoryItem(decoded[0]) : null
84
- };
85
- return armor;
86
- };
87
- /**
88
- * Collected fairy souls
89
- * @type {number}
90
- */
91
- this.fairySouls = data.m.fairy_souls_collected || 0;
92
- /**
93
- * Amount of fairy soul exchanges
94
- * @type {number}
95
- */
96
- this.fairyExchanges = data.m.fairyExchanges || 0;
97
- /**
98
- * Skyblock member skills
99
- * @type {SkyblockMemberSkills}
100
- */
101
- this.skills = getSkills(data.m);
102
- /**
103
- * Skyblock member slayer
104
- * @type {SkyblockMemberSlayer|null}
105
- */
106
- this.slayer = getSlayer(data.m);
107
- /**
108
- * Skyblock member dungeons
109
- * @type {SkyblockMemberDungeons|null}
110
- */
111
- this.dungeons = getDungeons(data.m);
112
- /**
113
- * Skyblock member collections
114
- * @type {object}
115
- */
116
- this.collections = data.m.collection ? data.m.collection : null;
117
- /**
118
- * Skyblock member enderchest
119
- * @return {Promise<SkyblockInventoryItem[]>}
120
- */
121
- this.getEnderChest = async () => {
122
- const chest = data.m.ender_chest_contents;
123
- if (!chest) return [];
124
-
125
- try {
126
- const enderChest = await decode(chest.data);
127
-
128
- const edited = [];
129
- for (let i = 0; i < enderChest.length; i++) {
130
- if (!enderChest[i].id) {
131
- continue;
132
- }
133
- edited.push(new SkyblockInventoryItem(enderChest[i]));
134
- }
135
- return edited;
136
- } catch (e) {
137
- return e;
138
- }
139
- };
140
- /**
141
- * Skyblock member inventory
142
- * @return {Promise<SkyblockInventoryItem[]>}
143
- */
144
- this.getInventory = async () => {
145
- let inventory = data.m.inv_contents;
146
- if (!inventory) return [];
147
-
148
- try {
149
- inventory = await decode(inventory.data);
150
- const edited = [];
151
- for (let i = 0; i < inventory.length; i++) {
152
- if (!inventory[i].id) {
153
- continue;
154
- }
155
- edited.push(new SkyblockInventoryItem(inventory[i]));
156
- }
157
- return edited;
158
- } catch (e) {
159
- return e;
160
- }
161
- };
162
- /**
163
- * Skyblock coins in purse
164
- * @type {number}
165
- */
166
- this.purse = data.m.coin_purse || 0;
167
- /**
168
- * Skyblock member stats
169
- * @type {SkyblockMemberStats}
170
- */
171
- this.stats = data.m.stats ? single(data.m.stats) : null;
172
- /**
173
- * Skyblock pets
174
- * @type {SkyblockPet[]}
175
- */
176
- this.pets = data.m.pets ? data.m.pets.map((pet) => new SkyblockPet(pet)) : [];
177
- /**
178
- * Skyblock jacob data
179
- * @type {jacobData}
180
- */
181
- this.jacob = getJacobData(data);
182
- }
183
- /**
184
- * Skyblock Member pet score
185
- * @return {number}
186
- */
187
- getPetScore () {
188
- return this.pets.reduce((acc, cur) => acc + (cur.petScore || 0), 0);
189
- }
190
- /**
191
- * UUID
192
- * @return {string}
193
- */
194
- toString () {
195
- return this.uuid;
196
- }
197
- }
198
- /**
199
- * @param {object} data
200
- * @return {object}
201
- */
202
- function getSkills (data) {
203
- const skillsObject = {};
204
- if (!objectPath.has(data, 'experience_skill_foraging')) {
205
- if (data.player) {
206
- for (const [skill, achievement] of Object.entries(skills_achievements)) {
207
- skillsObject[skill] = getLevelByAchievement(data.player.achievements[achievement], skill);
208
- }
209
- skillsObject.usedAchievementApi = true;
210
- return skillsObject;
211
- }
212
- return null;
213
- }
214
- for (const skill of skills) {
215
- skillsObject[skill] = getLevelByXp(data[`experience_skill_${skill}`], skill, skill === 'farming' ? (data.jacob2 && data.jacob2.perks && data.jacob2.perks.farming_level_cap) || 0 : null);
216
- }
217
- if (data.player) skillsObject.usedAchievementApi = false;
218
- return skillsObject;
219
- }
220
- /**
221
- * @param {object} data
222
- * @return {object}
223
- */
224
- function getSlayer (data) {
225
- if (!objectPath.has(data, 'slayer_bosses')) {
226
- return null;
227
- }
228
- return {
229
- zombie: getSlayerLevel(data.slayer_bosses.zombie),
230
- spider: getSlayerLevel(data.slayer_bosses.spider),
231
- wolf: getSlayerLevel(data.slayer_bosses.wolf)
232
- };
233
- }
234
- /**
235
- * @param {object} data
236
- * @return {object}
237
- */
238
- function getDungeons (data) {
239
- if (!objectPath.has(data, 'dungeons')) {
240
- return null;
241
- }
242
- return {
243
- types: {
244
- catacombs: getLevelByXp(data.dungeons.dungeon_types.catacombs ? data.dungeons.dungeon_types.catacombs.experience : null, 'dungeons')
245
- },
246
- classes: {
247
- healer: getLevelByXp(data.dungeons.player_classes.healer ? data.dungeons.player_classes.healer.experience : null, 'dungeons'),
248
- mage: getLevelByXp(data.dungeons.player_classes.mage ? data.dungeons.player_classes.mage.experience : null, 'dungeons'),
249
- berserk: getLevelByXp(data.dungeons.player_classes.berserk ? data.dungeons.player_classes.berserk.experience : null, 'dungeons'),
250
- archer: getLevelByXp(data.dungeons.player_classes.archer ? data.dungeons.player_classes.archer.experience : null, 'dungeons'),
251
- tank: getLevelByXp(data.dungeons.player_classes.tank ? data.dungeons.player_classes.tank.experience : null, 'dungeons')
252
- }
253
- };
254
- }
255
- /**
256
- * @param {object} data
257
- * @return {jacobData}
258
- */
259
- function getJacobData (data) {
260
- if (!data.m.jacob2) {
261
- return {
262
- medals: {
263
- bronze: 0,
264
- silver: 0,
265
- gold: 0
266
- },
267
- perks: {
268
- doubleDrops: 0,
269
- farmingLevelCap: 0
270
- },
271
- contests: {}
272
- };
273
- }
274
- return {
275
- medals: data.m.jacob2.medals_inv ?
276
- { bronze: data.m.jacob2.medals_inv.bronze || 0, silver: data.m.jacob2.medals_inv.silver || 0, gold: data.m.jacob2.medals_inv.gold || 0 } :
277
- { bronze: 0, silver: 0, gold: 0 },
278
- perks: data.m.jacob2.perks ?
279
- { doubleDrops: data.m.jacob2.perks.doubleDrops || 0, farmingLevelCap: data.m.jacob2.perks.farmingLevelCap || 0 } :
280
- { doubleDrops: 0, farmingLevelCap: 0 },
281
- contests: data.m.jacob2.contests || {}
282
- };
283
- }
284
- /**
285
- * @typedef {object} SkyblockMemberArmor Equipped armor
286
- * @property {SkyblockInventoryItem|null} helmet Helmet
287
- * @property {SkyblockInventoryItem|null} chestplate Chestplate
288
- * @property {SkyblockInventoryItem|null} leggings Leggings
289
- * @property {SkyblockInventoryItem|null} boots Boots
290
- */
291
- /**
292
- * @typedef {object} SkyblockMemberSkills
293
- * @property {SkyblockSkillLevel} farming Farming skill
294
- * @property {SkyblockSkillLevel} mining Mining skill
295
- * @property {SkyblockSkillLevel} combat Combat skill
296
- * @property {SkyblockSkillLevel} foraging Foraging skills
297
- * @property {SkyblockSkillLevel} fishing Fishing skill
298
- * @property {SkyblockSkillLevel} enchanting Enchanting skill
299
- * @property {SkyblockSkillLevel} alchemy Alchemy skill
300
- * @property {SkyblockSkillLevel} taming Taming skill
301
- * @property {SkyblockSkillLevel} carpentry Carpentry skill
302
- * @property {SkyblockSkillLevel} runecrafting Runecrafting skill
303
- */
304
- /**
305
- * @typedef {object} SkyblockSkillLevel
306
- * There is list of skills: {@link SkyblockMemberSkills}. <br>
307
- * Usage: `<SkyblockMember>.skills.farming.xp`.
308
- *
309
- * @property {number} xp Total XP
310
- * @property {number} level Level
311
- * @property {number} maxLevel Max level
312
- * @property {number} xpCurrent Current XP
313
- * @property {number} xpForNext XP for next level
314
- * @property {number} progress Progress
315
- */
316
- /**
317
- * @typedef {object} SkyblockMemberSlayer
318
- * @property {SkyblockMemberSlayerLevel} zombie
319
- * @property {SkyblockMemberSlayerLevel} spider
320
- * @property {SkyblockMemberSlayerLevel} wolf
321
- */
322
- /**
323
- * @typedef {object} SkyblockMemberSlayerLevel
324
- * @property {number} xp Total XP
325
- * @property {number} tier1 Tier 1
326
- * @property {number} tier2 Tier 2
327
- * @property {number} tier3 Tier 3
328
- * @property {number} tier4 Tier 4
329
- * @property {number} level Level
330
- */
331
- /**
332
- * @typedef {object} SkyblockMemberDungeons
333
- * @property {object} types Dungeons types
334
- * @property {object} classes Dungeons classes
335
- */
336
- /**
337
- * @typedef {object} SkyblockMemberDungeonsTypes
338
- * @property {SkyblockSkillLevel} catacombs
339
- */
340
- /**
341
- * @typedef {object} SkyblockMemberDungeonsClasses
342
- * @property {SkyblockSkillLevel} healer Healer class
343
- * @property {SkyblockSkillLevel} mage Mage class
344
- * @property {SkyblockSkillLevel} berserk Berserk class
345
- * @property {SkyblockSkillLevel} archer Archer class
346
- * @property {SkyblockSkillLevel} tank Tank class
347
- */
348
- /**
349
- * @typedef {object} SkyblockMemberStats
350
- * @property {number|undefined} auctionsBids
351
- * @property {number|undefined} auctionsBoughtCommon
352
- * @property {number|undefined} auctionsBoughtEpic
353
- * @property {number|undefined} auctionsBoughtLegendary
354
- * @property {number|undefined} auctionsBoughtRare
355
- * @property {number|undefined} auctionsBoughtSpecial
356
- * @property {number|undefined} auctionsBoughtUncommon
357
- * @property {number|undefined} auctionsCompleted
358
- * @property {number|undefined} auctionsCreated
359
- * @property {number|undefined} auctionsFees
360
- * @property {number|undefined} auctionsGoldEarned
361
- * @property {number|undefined} auctionsGoldSpent
362
- * @property {number|undefined} auctionsHighestBid
363
- * @property {number|undefined} auctionsNoBids
364
- * @property {number|undefined} auctionsSoldCommon
365
- * @property {number|undefined} auctionsSoldEpic
366
- * @property {number|undefined} auctionsSoldLegendary
367
- * @property {number|undefined} auctionsSoldRare
368
- * @property {number|undefined} auctionsSoldSpecial
369
- * @property {number|undefined} auctionsSoldUncommon
370
- * @property {number|undefined} auctionsWon
371
- * @property {number|undefined} chickenRaceBestTime_2
372
- * @property {number|undefined} deaths
373
- * @property {number|undefined} deathsBlaze
374
- * @property {number|undefined} deathsCactus
375
- * @property {number|undefined} deathsCatfish
376
- * @property {number|undefined} deathsCorruptedProtector
377
- * @property {number|undefined} deathsCryptDreadlord
378
- * @property {number|undefined} deathsCryptLurker
379
- * @property {number|undefined} deathsCryptSouleater
380
- * @property {number|undefined} deathsDiamondGuy
381
- * @property {number|undefined} deathsDiamondSkeleton
382
- * @property {number|undefined} deathsDiamondZombie
383
- * @property {number|undefined} deathsDungeonRespawningSkeleton
384
- * @property {number|undefined} deathsEmeraldSlime
385
- * @property {number|undefined} deathsEnderman
386
- * @property {number|undefined} deathsEndermite
387
- * @property {number|undefined} deathsFall
388
- * @property {number|undefined} deathsFire
389
- * @property {number|undefined} deathsFireballMagmaCube
390
- * @property {number|undefined} deathsGaiaConstruct
391
- * @property {number|undefined} deathsGeneratorMagmaCube
392
- * @property {number|undefined} deathsGeneratorSlime
393
- * @property {number|undefined} deathsHowlingSpirit
394
- * @property {number|undefined} deathsKingMidas
395
- * @property {number|undefined} deathsLapisZombie
396
- * @property {number|undefined} deathsLiquidHotMagma
397
- * @property {number|undefined} deathsLividClone
398
- * @property {number|undefined} deathsLostAdventurer
399
- * @property {number|undefined} deathsMagmaCube
400
- * @property {number|undefined} deathsMagmaCubeBoss
401
- * @property {number|undefined} deathsObsidianWither
402
- * @property {number|undefined} deathsOldDragon
403
- * @property {number|undefined} deathsOldWolf
404
- * @property {number|undefined} deathsPlayer
405
- * @property {number|undefined} deathsProfessor
406
- * @property {number|undefined} deathsProfessorGuardianSummon
407
- * @property {number|undefined} deathsProfessorMageGuardian
408
- * @property {number|undefined} deathsProtectorDragon
409
- * @property {number|undefined} deathsRandomSlime
410
- * @property {number|undefined} deathsRedstonePigman
411
- * @property {number|undefined} deathsRevenantZombie
412
- * @property {number|undefined} deathsRuinWolf
413
- * @property {number|undefined} deathsSadanStatue
414
- * @property {number|undefined} deathsScaredSkeleton
415
- * @property {number|undefined} deathsScarf
416
- * @property {number|undefined} deathsScarfMage
417
- * @property {number|undefined} deathsScarfWarrior
418
- * @property {number|undefined} deathsSeaGuardian
419
- * @property {number|undefined} deathsShadowAssassin
420
- * @property {number|undefined} deathsSkeleton
421
- * @property {number|undefined} deathsSkeletonEmperor
422
- * @property {number|undefined} deathsSkeletonGrunt
423
- * @property {number|undefined} deathsSkeletonMaster
424
- * @property {number|undefined} deathsSkeletonSoldier
425
- * @property {number|undefined} deathsSkeletor
426
- * @property {number|undefined} deathsSniperSkeleton
427
- * @property {number|undefined} deathsSoulOfTheAlpha
428
- * @property {number|undefined} deathsSpider
429
- * @property {number|undefined} deathsSpiderJockey
430
- * @property {number|undefined} deathsSpiritBat
431
- * @property {number|undefined} deathsSpiritRabbit
432
- * @property {number|undefined} deathsStrongDragon
433
- * @property {number|undefined} deathsSuffocation
434
- * @property {number|undefined} deathsSuperiorDragon
435
- * @property {number|undefined} deathsTarantulaSpider
436
- * @property {number|undefined} deathsTentaclees
437
- * @property {number|undefined} deathsTrap
438
- * @property {number|undefined} deathsUnburriedZombie
439
- * @property {number|undefined} deathsUnknown
440
- * @property {number|undefined} deathsUnstableDragon
441
- * @property {number|undefined} deathsVoid
442
- * @property {number|undefined} deathsVoraciousSpider
443
- * @property {number|undefined} deathsWatcher
444
- * @property {number|undefined} deathsWatcherSummonUndead
445
- * @property {number|undefined} deathsWeaverSpider
446
- * @property {number|undefined} deathsWiseDragon
447
- * @property {number|undefined} deathsWitherSkeleton
448
- * @property {number|undefined} deathsWolf
449
- * @property {number|undefined} deathsYoungDragon
450
- * @property {number|undefined} deathsZealotEnderman
451
- * @property {number|undefined} deathsZombie
452
- * @property {number|undefined} deathsZombieDeep
453
- * @property {number|undefined} deathsZombieGrunt
454
- * @property {number|undefined} deathsZombieSoldier
455
- * @property {number|undefined} dungeonHubCrystalCoreAnythingNoReturnBestTime
456
- * @property {number|undefined} dungeonHubCrystalCoreAnythingWithReturnBestTime
457
- * @property {number|undefined} dungeonHubCrystalCoreNoAbilitiesNoReturnBestTime
458
- * @property {number|undefined} dungeonHubCrystalCoreNoPearlsNoReturnBestTime
459
- * @property {number|undefined} dungeonHubCrystalCoreNoPearlsWithReturnBestTime
460
- * @property {number|undefined} dungeonHubCrystalCoreNothingNoReturnBestTime
461
- * @property {number|undefined} dungeonHubGiantMushroomAnythingNoReturnBestTime
462
- * @property {number|undefined} dungeonHubGiantMushroomNoAbilitiesNoReturnBestTime
463
- * @property {number|undefined} dungeonHubGiantMushroomNoPearlsNoReturnBestTime
464
- * @property {number|undefined} dungeonHubGiantMushroomNothingNoReturnBestTime
465
- * @property {number|undefined} dungeonHubPrecursorRuinsAnythingNoReturnBestTime
466
- * @property {number|undefined} dungeonHubPrecursorRuinsNoAbilitiesNoReturnBestTime
467
- * @property {number|undefined} dungeonHubPrecursorRuinsNoPearlsNoReturnBestTime
468
- * @property {number|undefined} dungeonHubPrecursorRuinsNothingNoReturnBestTime
469
- * @property {number|undefined} endRaceBestTime
470
- * @property {number|undefined} enderCrystalsDestroyed
471
- * @property {number|undefined} foragingRaceBestTime
472
- * @property {number|undefined} giftsGiven
473
- * @property {number|undefined} giftsReceived
474
- * @property {number|undefined} highestCritDamage
475
- * @property {number|undefined} highestCriticalDamage
476
- * @property {number|undefined} itemsFished
477
- * @property {number|undefined} itemsFishedLargeTreasure
478
- * @property {number|undefined} itemsFishedNormal
479
- * @property {number|undefined} itemsFishedTreasure
480
- * @property {number|undefined} kills
481
- * @property {number|undefined} killsBatPinata
482
- * @property {number|undefined} killsBatSpooky
483
- * @property {number|undefined} killsBattyWitch
484
- * @property {number|undefined} killsBlaze
485
- * @property {number|undefined} killsBlazeHigherOrLower
486
- * @property {number|undefined} killsBlueShark
487
- * @property {number|undefined} killsBonzoSummonUndead
488
- * @property {number|undefined} killsBroodMotherCaveSpider
489
- * @property {number|undefined} killsBroodMotherSpider
490
- * @property {number|undefined} killsCarrotKing
491
- * @property {number|undefined} killsCatfish
492
- * @property {number|undefined} killsCaveSpider
493
- * @property {number|undefined} killsCellarSpider
494
- * @property {number|undefined} killsChicken
495
- * @property {number|undefined} killsChickenDeep
496
- * @property {number|undefined} killsCorruptedProtector
497
- * @property {number|undefined} killsCow
498
- * @property {number|undefined} killsCreeper
499
- * @property {number|undefined} killsCryptDreadlord
500
- * @property {number|undefined} killsCryptLurker
501
- * @property {number|undefined} killsCryptSouleater
502
- * @property {number|undefined} killsCryptTankZombie
503
- * @property {number|undefined} killsCryptUndead
504
- * @property {number|undefined} killsCryptUndeadAlexander
505
- * @property {number|undefined} killsCryptUndeadApunch
506
- * @property {number|undefined} killsCryptUndeadBernhard
507
- * @property {number|undefined} killsCryptUndeadChristian
508
- * @property {number|undefined} killsCryptUndeadCodenameB
509
- * @property {number|undefined} killsCryptUndeadConnorlinfoot
510
- * @property {number|undefined} killsCryptUndeadDctr
511
- * @property {number|undefined} killsCryptUndeadFriedrich
512
- * @property {number|undefined} killsCryptUndeadJayavarmen
513
- * @property {number|undefined} killsCryptUndeadLikaos
514
- * @property {number|undefined} killsCryptUndeadMarius
515
- * @property {number|undefined} killsCryptUndeadNicholas
516
- * @property {number|undefined} killsCryptUndeadNitroholic_
517
- * @property {number|undefined} killsCryptUndeadPieter
518
- * @property {number|undefined} killsCryptUndeadRelenter
519
- * @property {number|undefined} killsCryptUndeadSfarnham
520
- * @property {number|undefined} killsCryptUndeadValentin
521
- * @property {number|undefined} killsCryptWitherskeleton
522
- * @property {number|undefined} killsDasherSpider
523
- * @property {number|undefined} killsDeepSeaProtector
524
- * @property {number|undefined} killsDiamondGuy
525
- * @property {number|undefined} killsDiamondSkeleton
526
- * @property {number|undefined} killsDiamondZombie
527
- * @property {number|undefined} killsDungeonRespawningSkeleton
528
- * @property {number|undefined} killsDungeonRespawningSkeletonSkull
529
- * @property {number|undefined} killsDungeonSecretBat
530
- * @property {number|undefined} killsEmeraldSlime
531
- * @property {number|undefined} killsEnderman
532
- * @property {number|undefined} killsEndermite
533
- * @property {number|undefined} killsFireballMagmaCube
534
- * @property {number|undefined} killsForestIslandBat
535
- * @property {number|undefined} killsFrostyTheSnowman
536
- * @property {number|undefined} killsFrozenSteve
537
- * @property {number|undefined} killsGaiaConstruct
538
- * @property {number|undefined} killsGeneratorGhast
539
- * @property {number|undefined} killsGeneratorMagmaCube
540
- * @property {number|undefined} killsGeneratorSlime
541
- * @property {number|undefined} killsGhast
542
- * @property {number|undefined} killsGuardianDefender
543
- * @property {number|undefined} killsGuardianEmperor
544
- * @property {number|undefined} killsHorsemanBat
545
- * @property {number|undefined} killsHorsemanHorse
546
- * @property {number|undefined} killsHorsemanZombie
547
- * @property {number|undefined} killsHowlingSpirit
548
- * @property {number|undefined} killsInvisibleCreeper
549
- * @property {number|undefined} killsJockeyShotSilverfish
550
- * @property {number|undefined} killsJockeySkeleton
551
- * @property {number|undefined} killsKingMidas
552
- * @property {number|undefined} killsLapisZombie
553
- * @property {number|undefined} killsLiquidHotMagma
554
- * @property {number|undefined} killsLonelySpider
555
- * @property {number|undefined} killsLostAdventurer
556
- * @property {number|undefined} killsMagmaCube
557
- * @property {number|undefined} killsMagmaCubeBoss
558
- * @property {number|undefined} killsMinosHunter
559
- * @property {number|undefined} killsMinotaur
560
- * @property {number|undefined} killsNightRespawningSkeleton
561
- * @property {number|undefined} killsNightSquid
562
- * @property {number|undefined} killsNurseShark
563
- * @property {number|undefined} killsObsidianWither
564
- * @property {number|undefined} killsOldWolf
565
- * @property {number|undefined} killsPackSpirit
566
- * @property {number|undefined} killsParasite
567
- * @property {number|undefined} killsPhantomSpirit
568
- * @property {number|undefined} killsPig
569
- * @property {number|undefined} killsPigman
570
- * @property {number|undefined} killsPlayer
571
- * @property {number|undefined} killsPondSquid
572
- * @property {number|undefined} killsProfessorGuardianSummon
573
- * @property {number|undefined} killsProtectorDragon
574
- * @property {number|undefined} killsRabbit
575
- * @property {number|undefined} killsRandomSlime
576
- * @property {number|undefined} killsRedstonePigman
577
- * @property {number|undefined} killsRespawningSkeleton
578
- * @property {number|undefined} killsRevenantZombie
579
- * @property {number|undefined} killsRuinWolf
580
- * @property {number|undefined} killsScaredSkeleton
581
- * @property {number|undefined} killsScarfArcher
582
- * @property {number|undefined} killsScarfMage
583
- * @property {number|undefined} killsScarfPriest
584
- * @property {number|undefined} killsScarfWarrior
585
- * @property {number|undefined} killsScaryJerry
586
- * @property {number|undefined} killsSeaArcher
587
- * @property {number|undefined} killsSeaGuardian
588
- * @property {number|undefined} killsSeaLeech
589
- * @property {number|undefined} killsSeaWalker
590
- * @property {number|undefined} killsSeaWitch
591
- * @property {number|undefined} killsShadowAssassin
592
- * @property {number|undefined} killsSheep
593
- * @property {number|undefined} killsSiameseLynx
594
- * @property {number|undefined} killsSkeleton
595
- * @property {number|undefined} killsSkeletonEmperor
596
- * @property {number|undefined} killsSkeletonGrunt
597
- * @property {number|undefined} killsSkeletonMaster
598
- * @property {number|undefined} killsSkeletonSoldier
599
- * @property {number|undefined} killsSkeletor
600
- * @property {number|undefined} killsSlime
601
- * @property {number|undefined} killsSniperSkeleton
602
- * @property {number|undefined} killsSoulOfTheAlpha
603
- * @property {number|undefined} killsSpider
604
- * @property {number|undefined} killsSpiderJockey
605
- * @property {number|undefined} killsSpiritBat
606
- * @property {number|undefined} killsSpiritBull
607
- * @property {number|undefined} killsSpiritChicken
608
- * @property {number|undefined} killsSpiritMiniboss
609
- * @property {number|undefined} killsSpiritRabbit
610
- * @property {number|undefined} killsSpiritSheep
611
- * @property {number|undefined} killsSpiritWolf
612
- * @property {number|undefined} killsSplitterSpider
613
- * @property {number|undefined} killsSplitterSpiderSilverfish
614
- * @property {number|undefined} killsStrongDragon
615
- * @property {number|undefined} killsSuperArcher
616
- * @property {number|undefined} killsSuperTankZombie
617
- * @property {number|undefined} killsTarantulaSpider
618
- * @property {number|undefined} killsTentaclees
619
- * @property {number|undefined} killsTigerShark
620
- * @property {number|undefined} killsTrickOrTreater
621
- * @property {number|undefined} killsUnburriedZombie
622
- * @property {number|undefined} killsVoraciousSpider
623
- * @property {number|undefined} killsWatcher
624
- * @property {number|undefined} killsWatcherBonzo
625
- * @property {number|undefined} killsWatcherSummonUndead
626
- * @property {number|undefined} killsWaterHydra
627
- * @property {number|undefined} killsWeaverSpider
628
- * @property {number|undefined} killsWitch
629
- * @property {number|undefined} killsWitchBat
630
- * @property {number|undefined} killsWitherGourd
631
- * @property {number|undefined} killsWitherSkeleton
632
- * @property {number|undefined} killsWraith
633
- * @property {number|undefined} killsZealotEnderman
634
- * @property {number|undefined} killsZombie
635
- * @property {number|undefined} killsZombieDeep
636
- * @property {number|undefined} killsZombieGrunt
637
- * @property {number|undefined} killsZombieKnight
638
- * @property {number|undefined} killsZombieSoldier
639
- * @property {number|undefined} killsZombieVillager
640
- * @property {number|undefined} mostWinterCannonballsHit
641
- * @property {number|undefined} mostWinterDamageDealt
642
- * @property {number|undefined} mostWinterMagmaDamageDealt
643
- * @property {number|undefined} mostWinterSnowballsHit
644
- * @property {number|undefined} mythosBurrowsChainsComplete
645
- * @property {number|undefined} mythosBurrowsChainsCompleteCommon
646
- * @property {number|undefined} mythosBurrowsChainsCompleteRare
647
- * @property {number|undefined} mythosBurrowsChainsCompleteNull
648
- * @property {number|undefined} mythosBurrowsDugCombat
649
- * @property {number|undefined} mythosBurrowsDugCombatCommon
650
- * @property {number|undefined} mythosBurrowsDugCombatRare
651
- * @property {number|undefined} mythosBurrowsDugCombatNull
652
- * @property {number|undefined} mythosBurrowsDugNext
653
- * @property {number|undefined} mythosBurrowsDugNextCommon
654
- * @property {number|undefined} mythosBurrowsDugNextRare
655
- * @property {number|undefined} mythosBurrowsDugNextNull
656
- * @property {number|undefined} mythosBurrowsDugTreasure
657
- * @property {number|undefined} mythosBurrowsDugTreasureCommon
658
- * @property {number|undefined} mythosBurrowsDugTreasureRare
659
- * @property {number|undefined} mythosBurrowsDugTreasureNull
660
- * @property {number|undefined} mythosKills
661
- * @property {number|undefined} petMilestoneOresMined
662
- * @property {number|undefined} petMilestoneSeaCreaturesKilled
663
- */
664
- /**
665
- * @typedef {object} jacobData
666
- * @property {object} medals Medals
667
- * @property {number} medals.bronze Bronze medals
668
- * @property {number} medals.silver Silver medals
669
- * @property {number} medals.gold Gold medals
670
- * @property {object} perks Perks
671
- * @property {number} perks.doubleDrops Double drops
672
- * @property {number} perks.farmingLevelCap Farming level cap
673
- * @property {object} contests Contests
674
- */
675
- module.exports = SkyblockMember;
1
+ /* eslint-disable camelcase */
2
+ const { decode, getLevelByXp, getLevelByAchievement, getSlayerLevel, getMemberStats, getTrophyFishRank } = require('../../utils/SkyblockUtils');
3
+ const { skyblock_year_0, skills, skills_achievements } = require('../../utils/Constants');
4
+ const SkyblockInventoryItem = require('./SkyblockInventoryItem');
5
+ const SkyblockPet = require('./SkyblockPet');
6
+ const objectPath = require('object-path');
7
+ const Constants = require('../../utils/Constants');
8
+ /**
9
+ * Skyblock member class
10
+ */
11
+ class SkyblockMember {
12
+ /**
13
+ * @param {object} data Skyblock member data
14
+ */
15
+ constructor(data) {
16
+ /**
17
+ * Skyblock member UUID
18
+ * @type {string}
19
+ */
20
+ this.uuid = data.uuid;
21
+ /**
22
+ * Skyblock member's player profile<br>
23
+ * If `fetchPlayer` option is `true`.
24
+ * @type {Player|null}
25
+ */
26
+ this.player = data.m.player || null;
27
+ /**
28
+ * Skyblock member's profile name
29
+ * @type {string}
30
+ */
31
+ this.profileName = data.profileName;
32
+ /**
33
+ * Timestamp when player first joined SkyBlock
34
+ * @type {number}
35
+ */
36
+ this.firstJoinTimestamp = data.m.first_join;
37
+ /**
38
+ * Timestamp when player first joined SkyBlock as Date
39
+ * @type {Date}
40
+ */
41
+ this.firstJoinAt = new Date(data.m.first_join);
42
+ /**
43
+ * Timestamp when player first joined the SkyBlock Hub
44
+ * @type {number}
45
+ */
46
+ this.firstJoinHubTimestamp = data.m.first_join_hub;
47
+ /**
48
+ * Timestamp when player first joined the SkyBlock Hub as Date
49
+ * @type {Date}
50
+ */
51
+ this.firstJoinHubAt = new Date(this.firstJoinTimestamp + data.m.first_join_hub);
52
+ /**
53
+ * Last save timestamp
54
+ * @type {number}
55
+ */
56
+ this.lastSaveTimestamp = data.m.last_save;
57
+ /**
58
+ * Last save timestamp as Date
59
+ * @type {Date}
60
+ */
61
+ this.lastSaveAt = new Date(data.m.last_save);
62
+ /**
63
+ * Last save timestamp
64
+ * @type {number}
65
+ */
66
+ this.lastDeathTimestamp = data.m.last_death;
67
+ /**
68
+ * Last death timestamp as Date
69
+ * @type {Date}
70
+ */
71
+ this.lastDeathAt = new Date(skyblock_year_0 + data.m.last_death * 1000);
72
+ /**
73
+ * Experience
74
+ * @type {number}
75
+ */
76
+ this.experience = data.m.leveling?.experience ?? 0;
77
+ /**
78
+ * Heart of the Mountain - MiningSkill
79
+ * @type {number}
80
+ */
81
+ this.hotm = getLevelByXp(data.m.mining_core?.experience, 'hotm', 7);
82
+ /**
83
+ * Trophy fish amount of rewards
84
+ * @type {number}
85
+ */
86
+ this.trophyFish = getTrophyFishRank(data.m.trophy_fish?.rewards.length ?? 0);
87
+ /**
88
+ * The highest magical power **Not current one**
89
+ * @type {number}
90
+ */
91
+ this.highestMagicalPower = data.m.accessory_bag_storage?.highest_magical_power ?? 0;
92
+ /**
93
+ * Equipped armor
94
+ * @return {Promise<SkyblockMemberArmor>}
95
+ */
96
+ this.getArmor = async () => {
97
+ const base64 = data.m.inv_armor;
98
+ const decoded = await decode(base64.data);
99
+ const armor = {
100
+ helmet: decoded[3].id ? new SkyblockInventoryItem(decoded[3]) : null,
101
+ chestplate: decoded[2].id ? new SkyblockInventoryItem(decoded[2]) : null,
102
+ leggings: decoded[1].id ? new SkyblockInventoryItem(decoded[1]) : null,
103
+ boots: decoded[0].id ? new SkyblockInventoryItem(decoded[0]) : null
104
+ };
105
+ return armor;
106
+ };
107
+ /**
108
+ * Wardrobe contents
109
+ * @return {Promise<SkyblockMemberItem[]>}
110
+ */
111
+ this.getWardrobe = async () => {
112
+ const base64 = data.m?.wardrobe_contents?.data;
113
+ if (!base64) return [];
114
+ const decoded = await decode(base64);
115
+ const armor = decoded.filter((item) => Object.keys(item).length !== 0).map((item) => new SkyblockInventoryItem(item));
116
+ return armor;
117
+ };
118
+ /**
119
+ * Collected fairy souls
120
+ * @type {number}
121
+ */
122
+ this.fairySouls = data.m.fairy_souls_collected || 0;
123
+ /**
124
+ * Amount of fairy soul exchanges
125
+ * @type {number}
126
+ */
127
+ this.fairyExchanges = data.m.fairyExchanges || 0;
128
+ /**
129
+ * Skyblock member skills
130
+ * @type {SkyblockMemberSkills}
131
+ */
132
+ this.skills = getSkills(data.m);
133
+ /**
134
+ * Bestiary of the user
135
+ * @type {object}
136
+ */
137
+ this.bestiary = getBestiaryLevel(data.m);
138
+ /**
139
+ * Skyblock member slayer
140
+ * @type {SkyblockMemberSlayer|null}
141
+ */
142
+ this.slayer = getSlayer(data.m);
143
+ /**
144
+ * Skyblock member dungeons
145
+ * @type {SkyblockMemberDungeons|null}
146
+ */
147
+ this.dungeons = getDungeons(data.m);
148
+ /**
149
+ * Skyblock member collections
150
+ * @type {object}
151
+ */
152
+ this.collections = data.m.collection ? data.m.collection : null;
153
+ /**
154
+ * Skyblock member enderchest
155
+ * @return {Promise<SkyblockInventoryItem[]>}
156
+ */
157
+ this.getEnderChest = async () => {
158
+ const chest = data.m.ender_chest_contents;
159
+ if (!chest) return [];
160
+
161
+ try {
162
+ const enderChest = await decode(chest.data);
163
+
164
+ const edited = [];
165
+ for (let i = 0; i < enderChest.length; i++) {
166
+ if (!enderChest[i].id) {
167
+ continue;
168
+ }
169
+ edited.push(new SkyblockInventoryItem(enderChest[i]));
170
+ }
171
+ return edited;
172
+ } catch (e) {
173
+ return e;
174
+ }
175
+ };
176
+ /**
177
+ * Skyblock member inventory
178
+ * @return {Promise<SkyblockInventoryItem[]>}
179
+ */
180
+ this.getInventory = async () => {
181
+ let inventory = data.m.inv_contents;
182
+ if (!inventory) return [];
183
+
184
+ try {
185
+ inventory = await decode(inventory.data);
186
+ const edited = [];
187
+ for (let i = 0; i < inventory.length; i++) {
188
+ if (!inventory[i].id) {
189
+ continue;
190
+ }
191
+ edited.push(new SkyblockInventoryItem(inventory[i]));
192
+ }
193
+ return edited;
194
+ } catch (e) {
195
+ return e;
196
+ }
197
+ };
198
+ /**
199
+ * Skyblock coins in purse
200
+ * @type {number}
201
+ */
202
+ this.purse = data.m.coin_purse || 0;
203
+ /**
204
+ * Skyblock member stats
205
+ * @type {SkyblockMemberStats}
206
+ */
207
+ this.stats = data.m.stats ? getMemberStats(data.m.stats) : null;
208
+ /**
209
+ * Skyblock pets
210
+ * @type {SkyblockPet[]}
211
+ */
212
+ this.pets = data.m.pets ? data.m.pets.map((pet) => new SkyblockPet(pet)) : [];
213
+ /**
214
+ * Skyblock jacob data
215
+ * @type {jacobData}
216
+ */
217
+ this.jacob = getJacobData(data);
218
+ /**
219
+ * Skyblock Member pet score
220
+ * @return {number}
221
+ */
222
+ this.getPetScore = () => {
223
+ const highestRarity = {};
224
+ for (const pet of data.m.pets) {
225
+ if (!(pet.type in highestRarity) || Constants.pet_score[pet.tier] > highestRarity[pet.type]) {
226
+ highestRarity[pet.type] = Constants.pet_score[pet.tier];
227
+ }
228
+ }
229
+
230
+ const highestLevel = {};
231
+ for (const pet of data.m.pets) {
232
+ const maxLevel = pet.type === 'GOLDEN_DRAGON' ? 200 : 100;
233
+ const petLevel = getPetLevel(pet.exp, pet.tier, maxLevel);
234
+
235
+ if (!(pet.type in highestLevel) || petLevel.level > highestLevel[pet.type]) {
236
+ if (petLevel.level < maxLevel) {
237
+ continue;
238
+ }
239
+
240
+ highestLevel[pet.type] = 1;
241
+ }
242
+ }
243
+
244
+ return Object.values(highestRarity).reduce((a, b) => a + b, 0) + Object.values(highestLevel).reduce((a, b) => a + b, 0);
245
+ };
246
+ }
247
+ /**
248
+ * UUID
249
+ * @return {string}
250
+ */
251
+ toString() {
252
+ return this.uuid;
253
+ }
254
+ }
255
+ // eslint-disable-next-line require-jsdoc
256
+ function getSkills(data) {
257
+ const skillsObject = {};
258
+ if (!objectPath.has(data, 'experience_skill_foraging')) {
259
+ if (data.player) {
260
+ for (const [skill, achievement] of Object.entries(skills_achievements)) {
261
+ skillsObject[skill] = getLevelByAchievement(data.player.achievements[achievement], skill);
262
+ }
263
+ skillsObject.usedAchievementApi = true;
264
+ return skillsObject;
265
+ }
266
+ return null;
267
+ }
268
+ for (const skill of skills) {
269
+ skillsObject[skill] = getLevelByXp(data[`experience_skill_${skill}`], skill, skill === 'farming' ? (data.jacob2 && data.jacob2.perks && data.jacob2.perks.farming_level_cap) || 0 : null);
270
+ }
271
+ if (data.player) skillsObject.usedAchievementApi = false;
272
+ return skillsObject;
273
+ }
274
+ // eslint-disable-next-line require-jsdoc
275
+ function formatBestiaryMobs(userProfile, mobs) {
276
+ const output = [];
277
+ for (const mob of mobs) {
278
+ const mobBracket = Constants.bestiaryBrackets[mob.bracket];
279
+
280
+ const totalKills = mob.mobs.reduce((acc, cur) => {
281
+ return acc + (userProfile.bestiary.kills[cur] ?? 0);
282
+ }, 0);
283
+
284
+ const maxKills = mob.cap;
285
+ const nextTierKills = mobBracket.find((tier) => totalKills < tier && tier <= maxKills);
286
+ const tier = nextTierKills ? mobBracket.indexOf(nextTierKills) : mobBracket.indexOf(maxKills) + 1;
287
+
288
+ output.push({
289
+ tier: tier
290
+ });
291
+ }
292
+
293
+ return output;
294
+ }
295
+
296
+ // eslint-disable-next-line require-jsdoc
297
+ function getBestiaryLevel(userProfile) {
298
+ try {
299
+ if (userProfile.bestiary?.kills === undefined) {
300
+ return null;
301
+ }
302
+
303
+ const output = {};
304
+ let tiersUnlocked = 0;
305
+ for (const [category, data] of Object.entries(Constants.bestiary)) {
306
+ const { mobs } = data;
307
+ output[category] = {};
308
+
309
+ if (category === 'fishing') {
310
+ for (const [key, value] of Object.entries(data)) {
311
+ output[category][key] = {
312
+ mobs: formatBestiaryMobs(userProfile, value.mobs)
313
+ };
314
+ tiersUnlocked += output[category][key].mobs.reduce((acc, cur) => acc + cur.tier, 0);
315
+ }
316
+ } else {
317
+ output[category].mobs = formatBestiaryMobs(userProfile, mobs);
318
+ tiersUnlocked += output[category].mobs.reduce((acc, cur) => acc + cur.tier, 0);
319
+ }
320
+ }
321
+
322
+ return tiersUnlocked / 10;
323
+ } catch (error) {
324
+ // eslint-disable-next-line no-console
325
+ console.log(error);
326
+ return null;
327
+ }
328
+ }
329
+
330
+ // eslint-disable-next-line require-jsdoc
331
+ function getSlayer(data) {
332
+ if (!objectPath.has(data, 'slayer_bosses')) {
333
+ return null;
334
+ }
335
+ return {
336
+ zombie: getSlayerLevel(data.slayer_bosses.zombie),
337
+ spider: getSlayerLevel(data.slayer_bosses.spider),
338
+ wolf: getSlayerLevel(data.slayer_bosses.wolf),
339
+ enderman: getSlayerLevel(data.slayer_bosses.enderman),
340
+ blaze: getSlayerLevel(data.slayer_bosses.blaze),
341
+ vampire: getSlayerLevel(data.slayer_bosses.vampire)
342
+ };
343
+ }
344
+ // eslint-disable-next-line require-jsdoc
345
+ function getDungeons(data) {
346
+ if (!objectPath.has(data, 'dungeons')) {
347
+ return null;
348
+ }
349
+ return {
350
+ types: {
351
+ catacombs: getLevelByXp(data.dungeons.dungeon_types.catacombs ? data.dungeons.dungeon_types.catacombs.experience : null, 'dungeons')
352
+ },
353
+ classes: {
354
+ healer: getLevelByXp(data.dungeons.player_classes.healer ? data.dungeons.player_classes.healer.experience : null, 'dungeons'),
355
+ mage: getLevelByXp(data.dungeons.player_classes.mage ? data.dungeons.player_classes.mage.experience : null, 'dungeons'),
356
+ berserk: getLevelByXp(data.dungeons.player_classes.berserk ? data.dungeons.player_classes.berserk.experience : null, 'dungeons'),
357
+ archer: getLevelByXp(data.dungeons.player_classes.archer ? data.dungeons.player_classes.archer.experience : null, 'dungeons'),
358
+ tank: getLevelByXp(data.dungeons.player_classes.tank ? data.dungeons.player_classes.tank.experience : null, 'dungeons')
359
+ }
360
+ };
361
+ }
362
+ // eslint-disable-next-line require-jsdoc
363
+ function getJacobData(data) {
364
+ if (!data.m.jacob2) {
365
+ return {
366
+ medals: {
367
+ bronze: 0,
368
+ silver: 0,
369
+ gold: 0
370
+ },
371
+ perks: {
372
+ doubleDrops: 0,
373
+ farmingLevelCap: 0
374
+ },
375
+ contests: {}
376
+ };
377
+ }
378
+ return {
379
+ medals: data.m.jacob2.medals_inv
380
+ ? { bronze: data.m.jacob2.medals_inv.bronze || 0, silver: data.m.jacob2.medals_inv.silver || 0, gold: data.m.jacob2.medals_inv.gold || 0 }
381
+ : { bronze: 0, silver: 0, gold: 0 },
382
+ perks: data.m.jacob2.perks ? { doubleDrops: data.m.jacob2.perks.doubleDrops || 0, farmingLevelCap: data.m.jacob2.perks.farmingLevelCap || 0 } : { doubleDrops: 0, farmingLevelCap: 0 },
383
+ contests: data.m.jacob2.contests || {}
384
+ };
385
+ }
386
+ // eslint-disable-next-line require-jsdoc
387
+ function getPetLevel(petExp, offsetRarity, maxLevel) {
388
+ const rarityOffset = Constants.pet_rarity_offset[offsetRarity];
389
+ const levels = Constants.pet_levels.slice(rarityOffset, rarityOffset + maxLevel - 1);
390
+
391
+ const xpMaxLevel = levels.reduce((a, b) => a + b, 0);
392
+ let xpTotal = 0;
393
+ let level = 1;
394
+
395
+ let xpForNext = Infinity;
396
+
397
+ for (let i = 0; i < maxLevel; i++) {
398
+ xpTotal += levels[i];
399
+
400
+ if (xpTotal > petExp) {
401
+ xpTotal -= levels[i];
402
+ break;
403
+ } else {
404
+ level++;
405
+ }
406
+ }
407
+
408
+ let xpCurrent = Math.floor(petExp - xpTotal);
409
+ let progress;
410
+
411
+ if (level < maxLevel) {
412
+ xpForNext = Math.ceil(levels[level - 1]);
413
+ progress = Math.max(0, Math.min(xpCurrent / xpForNext, 1));
414
+ } else {
415
+ level = maxLevel;
416
+ xpCurrent = petExp - levels[maxLevel - 1];
417
+ xpForNext = 0;
418
+ progress = 1;
419
+ }
420
+
421
+ return {
422
+ level,
423
+ xpCurrent,
424
+ xpForNext,
425
+ progress,
426
+ xpMaxLevel
427
+ };
428
+ }
429
+ /**
430
+ * @typedef {object} SkyblockMemberArmor Equipped armor
431
+ * @property {SkyblockInventoryItem|null} helmet Helmet
432
+ * @property {SkyblockInventoryItem|null} chestplate Chestplate
433
+ * @property {SkyblockInventoryItem|null} leggings Leggings
434
+ * @property {SkyblockInventoryItem|null} boots Boots
435
+ */
436
+ /**
437
+ * @typedef {object} SkyblockMemberSkills
438
+ * @property {SkyblockSkillLevel} farming Farming skill
439
+ * @property {SkyblockSkillLevel} mining Mining skill
440
+ * @property {SkyblockSkillLevel} combat Combat skill
441
+ * @property {SkyblockSkillLevel} foraging Foraging skills
442
+ * @property {SkyblockSkillLevel} fishing Fishing skill
443
+ * @property {SkyblockSkillLevel} enchanting Enchanting skill
444
+ * @property {SkyblockSkillLevel} alchemy Alchemy skill
445
+ * @property {SkyblockSkillLevel} taming Taming skill
446
+ * @property {SkyblockSkillLevel} carpentry Carpentry skill
447
+ * @property {SkyblockSkillLevel} runecrafting Runecrafting skill
448
+ */
449
+ /**
450
+ * @typedef {object} SkyblockSkillLevel
451
+ * There is list of skills: {@link SkyblockMemberSkills}. <br>
452
+ * Usage: `<SkyblockMember>.skills.farming.xp`.
453
+ *
454
+ * @property {number} xp Total XP
455
+ * @property {number} level Level
456
+ * @property {number} maxLevel Max level
457
+ * @property {number} xpCurrent Current XP
458
+ * @property {number} xpForNext XP for next level
459
+ * @property {number} progress Progress
460
+ */
461
+ /**
462
+ * @typedef {object} SkyblockMemberSlayer
463
+ * @property {SkyblockMemberSlayerLevel} zombie
464
+ * @property {SkyblockMemberSlayerLevel} spider
465
+ * @property {SkyblockMemberSlayerLevel} wolf
466
+ */
467
+ /**
468
+ * @typedef {object} SkyblockMemberSlayerLevel
469
+ * @property {number} xp Total XP
470
+ * @property {number} tier1 Tier 1
471
+ * @property {number} tier2 Tier 2
472
+ * @property {number} tier3 Tier 3
473
+ * @property {number} tier4 Tier 4
474
+ * @property {number} level Level
475
+ */
476
+ /**
477
+ * @typedef {object} SkyblockMemberDungeons
478
+ * @property {object} types Dungeons types
479
+ * @property {object} classes Dungeons classes
480
+ */
481
+ /**
482
+ * @typedef {object} SkyblockMemberDungeonsTypes
483
+ * @property {SkyblockSkillLevel} catacombs
484
+ */
485
+ /**
486
+ * @typedef {object} SkyblockMemberDungeonsClasses
487
+ * @property {SkyblockSkillLevel} healer Healer class
488
+ * @property {SkyblockSkillLevel} mage Mage class
489
+ * @property {SkyblockSkillLevel} berserk Berserk class
490
+ * @property {SkyblockSkillLevel} archer Archer class
491
+ * @property {SkyblockSkillLevel} tank Tank class
492
+ */
493
+ /**
494
+ * @typedef {object} SkyblockMemberStats
495
+ * @property {number|undefined} auctionsBids
496
+ * @property {number|undefined} auctionsBoughtCommon
497
+ * @property {number|undefined} auctionsBoughtEpic
498
+ * @property {number|undefined} auctionsBoughtLegendary
499
+ * @property {number|undefined} auctionsBoughtRare
500
+ * @property {number|undefined} auctionsBoughtSpecial
501
+ * @property {number|undefined} auctionsBoughtUncommon
502
+ * @property {number|undefined} auctionsCompleted
503
+ * @property {number|undefined} auctionsCreated
504
+ * @property {number|undefined} auctionsFees
505
+ * @property {number|undefined} auctionsGoldEarned
506
+ * @property {number|undefined} auctionsGoldSpent
507
+ * @property {number|undefined} auctionsHighestBid
508
+ * @property {number|undefined} auctionsNoBids
509
+ * @property {number|undefined} auctionsSoldCommon
510
+ * @property {number|undefined} auctionsSoldEpic
511
+ * @property {number|undefined} auctionsSoldLegendary
512
+ * @property {number|undefined} auctionsSoldRare
513
+ * @property {number|undefined} auctionsSoldSpecial
514
+ * @property {number|undefined} auctionsSoldUncommon
515
+ * @property {number|undefined} auctionsWon
516
+ * @property {number|undefined} chickenRaceBestTime_2
517
+ * @property {number|undefined} deaths
518
+ * @property {number|undefined} deathsBlaze
519
+ * @property {number|undefined} deathsCactus
520
+ * @property {number|undefined} deathsCatfish
521
+ * @property {number|undefined} deathsCorruptedProtector
522
+ * @property {number|undefined} deathsCryptDreadlord
523
+ * @property {number|undefined} deathsCryptLurker
524
+ * @property {number|undefined} deathsCryptSouleater
525
+ * @property {number|undefined} deathsDiamondGuy
526
+ * @property {number|undefined} deathsDiamondSkeleton
527
+ * @property {number|undefined} deathsDiamondZombie
528
+ * @property {number|undefined} deathsDungeonRespawningSkeleton
529
+ * @property {number|undefined} deathsEmeraldSlime
530
+ * @property {number|undefined} deathsEnderman
531
+ * @property {number|undefined} deathsEndermite
532
+ * @property {number|undefined} deathsFall
533
+ * @property {number|undefined} deathsFire
534
+ * @property {number|undefined} deathsFireballMagmaCube
535
+ * @property {number|undefined} deathsGaiaConstruct
536
+ * @property {number|undefined} deathsGeneratorMagmaCube
537
+ * @property {number|undefined} deathsGeneratorSlime
538
+ * @property {number|undefined} deathsHowlingSpirit
539
+ * @property {number|undefined} deathsKingMidas
540
+ * @property {number|undefined} deathsLapisZombie
541
+ * @property {number|undefined} deathsLiquidHotMagma
542
+ * @property {number|undefined} deathsLividClone
543
+ * @property {number|undefined} deathsLostAdventurer
544
+ * @property {number|undefined} deathsMagmaCube
545
+ * @property {number|undefined} deathsMagmaCubeBoss
546
+ * @property {number|undefined} deathsObsidianWither
547
+ * @property {number|undefined} deathsOldDragon
548
+ * @property {number|undefined} deathsOldWolf
549
+ * @property {number|undefined} deathsPlayer
550
+ * @property {number|undefined} deathsProfessor
551
+ * @property {number|undefined} deathsProfessorGuardianSummon
552
+ * @property {number|undefined} deathsProfessorMageGuardian
553
+ * @property {number|undefined} deathsProtectorDragon
554
+ * @property {number|undefined} deathsRandomSlime
555
+ * @property {number|undefined} deathsRedstonePigman
556
+ * @property {number|undefined} deathsRevenantZombie
557
+ * @property {number|undefined} deathsRuinWolf
558
+ * @property {number|undefined} deathsSadanStatue
559
+ * @property {number|undefined} deathsScaredSkeleton
560
+ * @property {number|undefined} deathsScarf
561
+ * @property {number|undefined} deathsScarfMage
562
+ * @property {number|undefined} deathsScarfWarrior
563
+ * @property {number|undefined} deathsSeaGuardian
564
+ * @property {number|undefined} deathsShadowAssassin
565
+ * @property {number|undefined} deathsSkeleton
566
+ * @property {number|undefined} deathsSkeletonEmperor
567
+ * @property {number|undefined} deathsSkeletonGrunt
568
+ * @property {number|undefined} deathsSkeletonMaster
569
+ * @property {number|undefined} deathsSkeletonSoldier
570
+ * @property {number|undefined} deathsSkeletor
571
+ * @property {number|undefined} deathsSniperSkeleton
572
+ * @property {number|undefined} deathsSoulOfTheAlpha
573
+ * @property {number|undefined} deathsSpider
574
+ * @property {number|undefined} deathsSpiderJockey
575
+ * @property {number|undefined} deathsSpiritBat
576
+ * @property {number|undefined} deathsSpiritRabbit
577
+ * @property {number|undefined} deathsStrongDragon
578
+ * @property {number|undefined} deathsSuffocation
579
+ * @property {number|undefined} deathsSuperiorDragon
580
+ * @property {number|undefined} deathsTarantulaSpider
581
+ * @property {number|undefined} deathsTentaclees
582
+ * @property {number|undefined} deathsTrap
583
+ * @property {number|undefined} deathsUnburriedZombie
584
+ * @property {number|undefined} deathsUnknown
585
+ * @property {number|undefined} deathsUnstableDragon
586
+ * @property {number|undefined} deathsVoid
587
+ * @property {number|undefined} deathsVoraciousSpider
588
+ * @property {number|undefined} deathsWatcher
589
+ * @property {number|undefined} deathsWatcherSummonUndead
590
+ * @property {number|undefined} deathsWeaverSpider
591
+ * @property {number|undefined} deathsWiseDragon
592
+ * @property {number|undefined} deathsWitherSkeleton
593
+ * @property {number|undefined} deathsWolf
594
+ * @property {number|undefined} deathsYoungDragon
595
+ * @property {number|undefined} deathsZealotEnderman
596
+ * @property {number|undefined} deathsZombie
597
+ * @property {number|undefined} deathsZombieDeep
598
+ * @property {number|undefined} deathsZombieGrunt
599
+ * @property {number|undefined} deathsZombieSoldier
600
+ * @property {number|undefined} dungeonHubCrystalCoreAnythingNoReturnBestTime
601
+ * @property {number|undefined} dungeonHubCrystalCoreAnythingWithReturnBestTime
602
+ * @property {number|undefined} dungeonHubCrystalCoreNoAbilitiesNoReturnBestTime
603
+ * @property {number|undefined} dungeonHubCrystalCoreNoPearlsNoReturnBestTime
604
+ * @property {number|undefined} dungeonHubCrystalCoreNoPearlsWithReturnBestTime
605
+ * @property {number|undefined} dungeonHubCrystalCoreNothingNoReturnBestTime
606
+ * @property {number|undefined} dungeonHubGiantMushroomAnythingNoReturnBestTime
607
+ * @property {number|undefined} dungeonHubGiantMushroomNoAbilitiesNoReturnBestTime
608
+ * @property {number|undefined} dungeonHubGiantMushroomNoPearlsNoReturnBestTime
609
+ * @property {number|undefined} dungeonHubGiantMushroomNothingNoReturnBestTime
610
+ * @property {number|undefined} dungeonHubPrecursorRuinsAnythingNoReturnBestTime
611
+ * @property {number|undefined} dungeonHubPrecursorRuinsNoAbilitiesNoReturnBestTime
612
+ * @property {number|undefined} dungeonHubPrecursorRuinsNoPearlsNoReturnBestTime
613
+ * @property {number|undefined} dungeonHubPrecursorRuinsNothingNoReturnBestTime
614
+ * @property {number|undefined} endRaceBestTime
615
+ * @property {number|undefined} enderCrystalsDestroyed
616
+ * @property {number|undefined} foragingRaceBestTime
617
+ * @property {number|undefined} giftsGiven
618
+ * @property {number|undefined} giftsReceived
619
+ * @property {number|undefined} highestCritDamage
620
+ * @property {number|undefined} highestCriticalDamage
621
+ * @property {number|undefined} itemsFished
622
+ * @property {number|undefined} itemsFishedLargeTreasure
623
+ * @property {number|undefined} itemsFishedNormal
624
+ * @property {number|undefined} itemsFishedTreasure
625
+ * @property {number|undefined} kills
626
+ * @property {number|undefined} killsBatPinata
627
+ * @property {number|undefined} killsBatSpooky
628
+ * @property {number|undefined} killsBattyWitch
629
+ * @property {number|undefined} killsBlaze
630
+ * @property {number|undefined} killsBlazeHigherOrLower
631
+ * @property {number|undefined} killsBlueShark
632
+ * @property {number|undefined} killsBonzoSummonUndead
633
+ * @property {number|undefined} killsBroodMotherCaveSpider
634
+ * @property {number|undefined} killsBroodMotherSpider
635
+ * @property {number|undefined} killsCarrotKing
636
+ * @property {number|undefined} killsCatfish
637
+ * @property {number|undefined} killsCaveSpider
638
+ * @property {number|undefined} killsCellarSpider
639
+ * @property {number|undefined} killsChicken
640
+ * @property {number|undefined} killsChickenDeep
641
+ * @property {number|undefined} killsCorruptedProtector
642
+ * @property {number|undefined} killsCow
643
+ * @property {number|undefined} killsCreeper
644
+ * @property {number|undefined} killsCryptDreadlord
645
+ * @property {number|undefined} killsCryptLurker
646
+ * @property {number|undefined} killsCryptSouleater
647
+ * @property {number|undefined} killsCryptTankZombie
648
+ * @property {number|undefined} killsCryptUndead
649
+ * @property {number|undefined} killsCryptUndeadAlexander
650
+ * @property {number|undefined} killsCryptUndeadApunch
651
+ * @property {number|undefined} killsCryptUndeadBernhard
652
+ * @property {number|undefined} killsCryptUndeadChristian
653
+ * @property {number|undefined} killsCryptUndeadCodenameB
654
+ * @property {number|undefined} killsCryptUndeadConnorlinfoot
655
+ * @property {number|undefined} killsCryptUndeadDctr
656
+ * @property {number|undefined} killsCryptUndeadFriedrich
657
+ * @property {number|undefined} killsCryptUndeadJayavarmen
658
+ * @property {number|undefined} killsCryptUndeadLikaos
659
+ * @property {number|undefined} killsCryptUndeadMarius
660
+ * @property {number|undefined} killsCryptUndeadNicholas
661
+ * @property {number|undefined} killsCryptUndeadNitroholic_
662
+ * @property {number|undefined} killsCryptUndeadPieter
663
+ * @property {number|undefined} killsCryptUndeadRelenter
664
+ * @property {number|undefined} killsCryptUndeadSfarnham
665
+ * @property {number|undefined} killsCryptUndeadValentin
666
+ * @property {number|undefined} killsCryptWitherskeleton
667
+ * @property {number|undefined} killsDasherSpider
668
+ * @property {number|undefined} killsDeepSeaProtector
669
+ * @property {number|undefined} killsDiamondGuy
670
+ * @property {number|undefined} killsDiamondSkeleton
671
+ * @property {number|undefined} killsDiamondZombie
672
+ * @property {number|undefined} killsDungeonRespawningSkeleton
673
+ * @property {number|undefined} killsDungeonRespawningSkeletonSkull
674
+ * @property {number|undefined} killsDungeonSecretBat
675
+ * @property {number|undefined} killsEmeraldSlime
676
+ * @property {number|undefined} killsEnderman
677
+ * @property {number|undefined} killsEndermite
678
+ * @property {number|undefined} killsFireballMagmaCube
679
+ * @property {number|undefined} killsForestIslandBat
680
+ * @property {number|undefined} killsFrostyTheSnowman
681
+ * @property {number|undefined} killsFrozenSteve
682
+ * @property {number|undefined} killsGaiaConstruct
683
+ * @property {number|undefined} killsGeneratorGhast
684
+ * @property {number|undefined} killsGeneratorMagmaCube
685
+ * @property {number|undefined} killsGeneratorSlime
686
+ * @property {number|undefined} killsGhast
687
+ * @property {number|undefined} killsGuardianDefender
688
+ * @property {number|undefined} killsGuardianEmperor
689
+ * @property {number|undefined} killsHorsemanBat
690
+ * @property {number|undefined} killsHorsemanHorse
691
+ * @property {number|undefined} killsHorsemanZombie
692
+ * @property {number|undefined} killsHowlingSpirit
693
+ * @property {number|undefined} killsInvisibleCreeper
694
+ * @property {number|undefined} killsJockeyShotSilverfish
695
+ * @property {number|undefined} killsJockeySkeleton
696
+ * @property {number|undefined} killsKingMidas
697
+ * @property {number|undefined} killsLapisZombie
698
+ * @property {number|undefined} killsLiquidHotMagma
699
+ * @property {number|undefined} killsLonelySpider
700
+ * @property {number|undefined} killsLostAdventurer
701
+ * @property {number|undefined} killsMagmaCube
702
+ * @property {number|undefined} killsMagmaCubeBoss
703
+ * @property {number|undefined} killsMinosHunter
704
+ * @property {number|undefined} killsMinotaur
705
+ * @property {number|undefined} killsNightRespawningSkeleton
706
+ * @property {number|undefined} killsNightSquid
707
+ * @property {number|undefined} killsNurseShark
708
+ * @property {number|undefined} killsObsidianWither
709
+ * @property {number|undefined} killsOldWolf
710
+ * @property {number|undefined} killsPackSpirit
711
+ * @property {number|undefined} killsParasite
712
+ * @property {number|undefined} killsPhantomSpirit
713
+ * @property {number|undefined} killsPig
714
+ * @property {number|undefined} killsPigman
715
+ * @property {number|undefined} killsPlayer
716
+ * @property {number|undefined} killsPondSquid
717
+ * @property {number|undefined} killsProfessorGuardianSummon
718
+ * @property {number|undefined} killsProtectorDragon
719
+ * @property {number|undefined} killsRabbit
720
+ * @property {number|undefined} killsRandomSlime
721
+ * @property {number|undefined} killsRedstonePigman
722
+ * @property {number|undefined} killsRespawningSkeleton
723
+ * @property {number|undefined} killsRevenantZombie
724
+ * @property {number|undefined} killsRuinWolf
725
+ * @property {number|undefined} killsScaredSkeleton
726
+ * @property {number|undefined} killsScarfArcher
727
+ * @property {number|undefined} killsScarfMage
728
+ * @property {number|undefined} killsScarfPriest
729
+ * @property {number|undefined} killsScarfWarrior
730
+ * @property {number|undefined} killsScaryJerry
731
+ * @property {number|undefined} killsSeaArcher
732
+ * @property {number|undefined} killsSeaGuardian
733
+ * @property {number|undefined} killsSeaLeech
734
+ * @property {number|undefined} killsSeaWalker
735
+ * @property {number|undefined} killsSeaWitch
736
+ * @property {number|undefined} killsShadowAssassin
737
+ * @property {number|undefined} killsSheep
738
+ * @property {number|undefined} killsSiameseLynx
739
+ * @property {number|undefined} killsSkeleton
740
+ * @property {number|undefined} killsSkeletonEmperor
741
+ * @property {number|undefined} killsSkeletonGrunt
742
+ * @property {number|undefined} killsSkeletonMaster
743
+ * @property {number|undefined} killsSkeletonSoldier
744
+ * @property {number|undefined} killsSkeletor
745
+ * @property {number|undefined} killsSlime
746
+ * @property {number|undefined} killsSniperSkeleton
747
+ * @property {number|undefined} killsSoulOfTheAlpha
748
+ * @property {number|undefined} killsSpider
749
+ * @property {number|undefined} killsSpiderJockey
750
+ * @property {number|undefined} killsSpiritBat
751
+ * @property {number|undefined} killsSpiritBull
752
+ * @property {number|undefined} killsSpiritChicken
753
+ * @property {number|undefined} killsSpiritMiniboss
754
+ * @property {number|undefined} killsSpiritRabbit
755
+ * @property {number|undefined} killsSpiritSheep
756
+ * @property {number|undefined} killsSpiritWolf
757
+ * @property {number|undefined} killsSplitterSpider
758
+ * @property {number|undefined} killsSplitterSpiderSilverfish
759
+ * @property {number|undefined} killsStrongDragon
760
+ * @property {number|undefined} killsSuperArcher
761
+ * @property {number|undefined} killsSuperTankZombie
762
+ * @property {number|undefined} killsTarantulaSpider
763
+ * @property {number|undefined} killsTentaclees
764
+ * @property {number|undefined} killsTigerShark
765
+ * @property {number|undefined} killsTrickOrTreater
766
+ * @property {number|undefined} killsUnburriedZombie
767
+ * @property {number|undefined} killsVoraciousSpider
768
+ * @property {number|undefined} killsWatcher
769
+ * @property {number|undefined} killsWatcherBonzo
770
+ * @property {number|undefined} killsWatcherSummonUndead
771
+ * @property {number|undefined} killsWaterHydra
772
+ * @property {number|undefined} killsWeaverSpider
773
+ * @property {number|undefined} killsWitch
774
+ * @property {number|undefined} killsWitchBat
775
+ * @property {number|undefined} killsWitherGourd
776
+ * @property {number|undefined} killsWitherSkeleton
777
+ * @property {number|undefined} killsWraith
778
+ * @property {number|undefined} killsZealotEnderman
779
+ * @property {number|undefined} killsZombie
780
+ * @property {number|undefined} killsZombieDeep
781
+ * @property {number|undefined} killsZombieGrunt
782
+ * @property {number|undefined} killsZombieKnight
783
+ * @property {number|undefined} killsZombieSoldier
784
+ * @property {number|undefined} killsZombieVillager
785
+ * @property {number|undefined} mostWinterCannonballsHit
786
+ * @property {number|undefined} mostWinterDamageDealt
787
+ * @property {number|undefined} mostWinterMagmaDamageDealt
788
+ * @property {number|undefined} mostWinterSnowballsHit
789
+ * @property {number|undefined} mythosBurrowsChainsComplete
790
+ * @property {number|undefined} mythosBurrowsChainsCompleteCommon
791
+ * @property {number|undefined} mythosBurrowsChainsCompleteRare
792
+ * @property {number|undefined} mythosBurrowsChainsCompleteNull
793
+ * @property {number|undefined} mythosBurrowsDugCombat
794
+ * @property {number|undefined} mythosBurrowsDugCombatCommon
795
+ * @property {number|undefined} mythosBurrowsDugCombatRare
796
+ * @property {number|undefined} mythosBurrowsDugCombatNull
797
+ * @property {number|undefined} mythosBurrowsDugNext
798
+ * @property {number|undefined} mythosBurrowsDugNextCommon
799
+ * @property {number|undefined} mythosBurrowsDugNextRare
800
+ * @property {number|undefined} mythosBurrowsDugNextNull
801
+ * @property {number|undefined} mythosBurrowsDugTreasure
802
+ * @property {number|undefined} mythosBurrowsDugTreasureCommon
803
+ * @property {number|undefined} mythosBurrowsDugTreasureRare
804
+ * @property {number|undefined} mythosBurrowsDugTreasureNull
805
+ * @property {number|undefined} mythosKills
806
+ * @property {number|undefined} petMilestoneOresMined
807
+ * @property {number|undefined} petMilestoneSeaCreaturesKilled
808
+ */
809
+ /**
810
+ * @typedef {object} jacobData
811
+ * @property {object} medals Medals
812
+ * @property {number} medals.bronze Bronze medals
813
+ * @property {number} medals.silver Silver medals
814
+ * @property {number} medals.gold Gold medals
815
+ * @property {object} perks Perks
816
+ * @property {number} perks.doubleDrops Double drops
817
+ * @property {number} perks.farmingLevelCap Farming level cap
818
+ * @property {object} contests Contests
819
+ */
820
+ module.exports = SkyblockMember;