hypixel-api-reborn 10.0.0 → 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 +27 -15
  3. package/package.json +60 -58
  4. package/src/API/getAPIStatus.js +8 -8
  5. package/src/API/getBoosters.js +6 -6
  6. package/src/API/getGameCounts.js +6 -6
  7. package/src/API/getGuild.js +18 -18
  8. package/src/API/getLeaderboards.js +13 -13
  9. package/src/API/getPlayer.js +22 -27
  10. package/src/API/getRecentGames.js +18 -18
  11. package/src/API/getServerInfo.js +66 -77
  12. package/src/API/getStatus.js +8 -8
  13. package/src/API/getWatchdogStats.js +6 -6
  14. package/src/API/index.js +19 -23
  15. package/src/API/skyblock/getEndedSkyblockAuctions.js +10 -10
  16. package/src/API/skyblock/getSkyblockAuctions.js +64 -64
  17. package/src/API/skyblock/getSkyblockAuctionsByPlayer.js +11 -11
  18. package/src/API/skyblock/getSkyblockBazaar.js +10 -10
  19. package/src/API/skyblock/getSkyblockMember.js +28 -25
  20. package/src/API/skyblock/getSkyblockNews.js +6 -6
  21. package/src/API/skyblock/getSkyblockProfiles.js +44 -41
  22. package/src/Client.js +406 -450
  23. package/src/Errors.js +44 -39
  24. package/src/Private/defaultCache.js +77 -78
  25. package/src/Private/rateLimit.js +79 -98
  26. package/src/Private/requests.js +65 -54
  27. package/src/Private/updater.js +45 -45
  28. package/src/Private/uuidCache.js +37 -33
  29. package/src/Private/validate.js +97 -97
  30. package/src/index.js +82 -83
  31. package/src/structures/APIIncident.js +78 -78
  32. package/src/structures/APIStatus.js +47 -47
  33. package/src/structures/Boosters/Booster.js +83 -87
  34. package/src/structures/Color.js +129 -129
  35. package/src/structures/Game.js +164 -160
  36. package/src/structures/GameCounts.js +151 -151
  37. package/src/structures/Guild/Guild.js +204 -218
  38. package/src/structures/Guild/GuildMember.js +66 -66
  39. package/src/structures/Guild/GuildRank.js +48 -48
  40. package/src/structures/ItemBytes.js +33 -36
  41. package/src/structures/Leaderboard.js +31 -31
  42. package/src/structures/MiniGames/Arcade.js +567 -569
  43. package/src/structures/MiniGames/ArenaBrawl.js +52 -56
  44. package/src/structures/MiniGames/BedWars.js +423 -351
  45. package/src/structures/MiniGames/BlitzSurvivalGames.js +172 -148
  46. package/src/structures/MiniGames/BuildBattle.js +53 -53
  47. package/src/structures/MiniGames/CopsAndCrims.js +90 -90
  48. package/src/structures/MiniGames/Duels.js +694 -630
  49. package/src/structures/MiniGames/MegaWalls.js +137 -137
  50. package/src/structures/MiniGames/MurderMystery.js +93 -93
  51. package/src/structures/MiniGames/Paintball.js +67 -67
  52. package/src/structures/MiniGames/Pit.js +19 -19
  53. package/src/structures/MiniGames/Quakecraft.js +101 -101
  54. package/src/structures/MiniGames/SkyWars.js +508 -559
  55. package/src/structures/MiniGames/SmashHeroes.js +144 -151
  56. package/src/structures/MiniGames/SpeedUHC.js +115 -57
  57. package/src/structures/MiniGames/TNTGames.js +116 -116
  58. package/src/structures/MiniGames/TurboKartRacers.js +201 -176
  59. package/src/structures/MiniGames/UHC.js +164 -143
  60. package/src/structures/MiniGames/VampireZ.js +60 -60
  61. package/src/structures/MiniGames/Walls.js +52 -52
  62. package/src/structures/MiniGames/Warlords.js +62 -62
  63. package/src/structures/MiniGames/WoolWars.js +123 -0
  64. package/src/structures/Pet.js +96 -97
  65. package/src/structures/Pets.js +64 -64
  66. package/src/structures/Player.js +433 -449
  67. package/src/structures/PlayerCosmetics.js +100 -95
  68. package/src/structures/RecentGame.js +57 -57
  69. package/src/structures/ServerInfo.js +78 -78
  70. package/src/structures/SkyBlock/Auctions/Auction.js +104 -104
  71. package/src/structures/SkyBlock/Auctions/AuctionInfo.js +54 -54
  72. package/src/structures/SkyBlock/Auctions/BaseAuction.js +45 -45
  73. package/src/structures/SkyBlock/Auctions/Bid.js +48 -48
  74. package/src/structures/SkyBlock/Auctions/PartialAuction.js +25 -25
  75. package/src/structures/SkyBlock/Bazzar/Order.js +38 -38
  76. package/src/structures/SkyBlock/Bazzar/Product.js +53 -53
  77. package/src/structures/SkyBlock/News/SkyblockNews.js +60 -68
  78. package/src/structures/SkyBlock/SkyblockInventoryItem.js +124 -130
  79. package/src/structures/SkyBlock/SkyblockMember.js +820 -687
  80. package/src/structures/SkyBlock/SkyblockPet.js +71 -71
  81. package/src/structures/SkyBlock/SkyblockProfile.js +60 -60
  82. package/src/structures/Status.js +41 -41
  83. package/src/structures/Watchdog/Stats.js +36 -36
  84. package/src/utils/Constants.js +2789 -809
  85. package/src/utils/SkyblockUtils.js +208 -164
  86. package/src/utils/arrayTools.js +4 -4
  87. package/src/utils/divide.js +5 -5
  88. package/src/utils/guildExp.js +57 -67
  89. package/src/utils/index.js +13 -13
  90. package/src/utils/isGuildID.js +3 -3
  91. package/src/utils/isUUID.js +5 -5
  92. package/src/utils/oscillation.js +15 -23
  93. package/src/utils/removeSnakeCase.js +22 -35
  94. package/src/utils/rgbToHexColor.js +8 -8
  95. package/src/utils/romanize.js +11 -13
  96. package/src/utils/toIGN.js +20 -20
  97. package/src/utils/toUuid.js +19 -19
  98. package/src/utils/varInt.js +17 -21
  99. package/typings/index.d.ts +3532 -2644
  100. package/src/API/getFriends.js +0 -14
  101. package/src/API/getKeyInfo.js +0 -10
  102. package/src/API/getRankedSkyWars.js +0 -11
  103. package/src/structures/Friend.js +0 -38
  104. package/src/structures/KeyInfo.js +0 -42
  105. package/src/structures/MiniGames/SkyWarsRanked.js +0 -45
@@ -1,687 +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.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
- * 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
- * Wardrobe contents
89
- * @return {Promise<SkyblockMemberItem[]>}
90
- */
91
- this.getWardrobe = async () => {
92
- const base64 = data.m?.wardrobe_contents?.data;
93
- if (!base64) return [];
94
- const decoded = await decode(base64);
95
- const armor = decoded.filter((item) => Object.keys(item).length !== 0)
96
- .map((item) => new SkyblockInventoryItem(item));
97
- return armor;
98
- };
99
- /**
100
- * Collected fairy souls
101
- * @type {number}
102
- */
103
- this.fairySouls = data.m.fairy_souls_collected || 0;
104
- /**
105
- * Amount of fairy soul exchanges
106
- * @type {number}
107
- */
108
- this.fairyExchanges = data.m.fairyExchanges || 0;
109
- /**
110
- * Skyblock member skills
111
- * @type {SkyblockMemberSkills}
112
- */
113
- this.skills = getSkills(data.m);
114
- /**
115
- * Skyblock member slayer
116
- * @type {SkyblockMemberSlayer|null}
117
- */
118
- this.slayer = getSlayer(data.m);
119
- /**
120
- * Skyblock member dungeons
121
- * @type {SkyblockMemberDungeons|null}
122
- */
123
- this.dungeons = getDungeons(data.m);
124
- /**
125
- * Skyblock member collections
126
- * @type {object}
127
- */
128
- this.collections = data.m.collection ? data.m.collection : null;
129
- /**
130
- * Skyblock member enderchest
131
- * @return {Promise<SkyblockInventoryItem[]>}
132
- */
133
- this.getEnderChest = async () => {
134
- const chest = data.m.ender_chest_contents;
135
- if (!chest) return [];
136
-
137
- try {
138
- const enderChest = await decode(chest.data);
139
-
140
- const edited = [];
141
- for (let i = 0; i < enderChest.length; i++) {
142
- if (!enderChest[i].id) {
143
- continue;
144
- }
145
- edited.push(new SkyblockInventoryItem(enderChest[i]));
146
- }
147
- return edited;
148
- } catch (e) {
149
- return e;
150
- }
151
- };
152
- /**
153
- * Skyblock member inventory
154
- * @return {Promise<SkyblockInventoryItem[]>}
155
- */
156
- this.getInventory = async () => {
157
- let inventory = data.m.inv_contents;
158
- if (!inventory) return [];
159
-
160
- try {
161
- inventory = await decode(inventory.data);
162
- const edited = [];
163
- for (let i = 0; i < inventory.length; i++) {
164
- if (!inventory[i].id) {
165
- continue;
166
- }
167
- edited.push(new SkyblockInventoryItem(inventory[i]));
168
- }
169
- return edited;
170
- } catch (e) {
171
- return e;
172
- }
173
- };
174
- /**
175
- * Skyblock coins in purse
176
- * @type {number}
177
- */
178
- this.purse = data.m.coin_purse || 0;
179
- /**
180
- * Skyblock member stats
181
- * @type {SkyblockMemberStats}
182
- */
183
- this.stats = data.m.stats ? single(data.m.stats) : null;
184
- /**
185
- * Skyblock pets
186
- * @type {SkyblockPet[]}
187
- */
188
- this.pets = data.m.pets ? data.m.pets.map((pet) => new SkyblockPet(pet)) : [];
189
- /**
190
- * Skyblock jacob data
191
- * @type {jacobData}
192
- */
193
- this.jacob = getJacobData(data);
194
- }
195
- /**
196
- * Skyblock Member pet score
197
- * @return {number}
198
- */
199
- getPetScore() {
200
- return this.pets.reduce((acc, cur) => acc + (cur.petScore || 0), 0);
201
- }
202
- /**
203
- * UUID
204
- * @return {string}
205
- */
206
- toString() {
207
- return this.uuid;
208
- }
209
- }
210
- /**
211
- * @param {object} data
212
- * @return {object}
213
- */
214
- function getSkills(data) {
215
- const skillsObject = {};
216
- if (!objectPath.has(data, 'experience_skill_foraging')) {
217
- if (data.player) {
218
- for (const [skill, achievement] of Object.entries(skills_achievements)) {
219
- skillsObject[skill] = getLevelByAchievement(data.player.achievements[achievement], skill);
220
- }
221
- skillsObject.usedAchievementApi = true;
222
- return skillsObject;
223
- }
224
- return null;
225
- }
226
- for (const skill of skills) {
227
- skillsObject[skill] = getLevelByXp(data[`experience_skill_${skill}`], skill, skill === 'farming' ? (data.jacob2 && data.jacob2.perks && data.jacob2.perks.farming_level_cap) || 0 : null);
228
- }
229
- if (data.player) skillsObject.usedAchievementApi = false;
230
- return skillsObject;
231
- }
232
- /**
233
- * @param {object} data
234
- * @return {object}
235
- */
236
- function getSlayer(data) {
237
- if (!objectPath.has(data, 'slayer_bosses')) {
238
- return null;
239
- }
240
- return {
241
- zombie: getSlayerLevel(data.slayer_bosses.zombie),
242
- spider: getSlayerLevel(data.slayer_bosses.spider),
243
- wolf: getSlayerLevel(data.slayer_bosses.wolf)
244
- };
245
- }
246
- /**
247
- * @param {object} data
248
- * @return {object}
249
- */
250
- function getDungeons(data) {
251
- if (!objectPath.has(data, 'dungeons')) {
252
- return null;
253
- }
254
- return {
255
- types: {
256
- catacombs: getLevelByXp(data.dungeons.dungeon_types.catacombs ? data.dungeons.dungeon_types.catacombs.experience : null, 'dungeons')
257
- },
258
- classes: {
259
- healer: getLevelByXp(data.dungeons.player_classes.healer ? data.dungeons.player_classes.healer.experience : null, 'dungeons'),
260
- mage: getLevelByXp(data.dungeons.player_classes.mage ? data.dungeons.player_classes.mage.experience : null, 'dungeons'),
261
- berserk: getLevelByXp(data.dungeons.player_classes.berserk ? data.dungeons.player_classes.berserk.experience : null, 'dungeons'),
262
- archer: getLevelByXp(data.dungeons.player_classes.archer ? data.dungeons.player_classes.archer.experience : null, 'dungeons'),
263
- tank: getLevelByXp(data.dungeons.player_classes.tank ? data.dungeons.player_classes.tank.experience : null, 'dungeons')
264
- }
265
- };
266
- }
267
- /**
268
- * @param {object} data
269
- * @return {jacobData}
270
- */
271
- function getJacobData(data) {
272
- if (!data.m.jacob2) {
273
- return {
274
- medals: {
275
- bronze: 0,
276
- silver: 0,
277
- gold: 0
278
- },
279
- perks: {
280
- doubleDrops: 0,
281
- farmingLevelCap: 0
282
- },
283
- contests: {}
284
- };
285
- }
286
- return {
287
- medals: data.m.jacob2.medals_inv ?
288
- { bronze: data.m.jacob2.medals_inv.bronze || 0, silver: data.m.jacob2.medals_inv.silver || 0, gold: data.m.jacob2.medals_inv.gold || 0 } :
289
- { bronze: 0, silver: 0, gold: 0 },
290
- perks: data.m.jacob2.perks ?
291
- { doubleDrops: data.m.jacob2.perks.doubleDrops || 0, farmingLevelCap: data.m.jacob2.perks.farmingLevelCap || 0 } :
292
- { doubleDrops: 0, farmingLevelCap: 0 },
293
- contests: data.m.jacob2.contests || {}
294
- };
295
- }
296
- /**
297
- * @typedef {object} SkyblockMemberArmor Equipped armor
298
- * @property {SkyblockInventoryItem|null} helmet Helmet
299
- * @property {SkyblockInventoryItem|null} chestplate Chestplate
300
- * @property {SkyblockInventoryItem|null} leggings Leggings
301
- * @property {SkyblockInventoryItem|null} boots Boots
302
- */
303
- /**
304
- * @typedef {object} SkyblockMemberSkills
305
- * @property {SkyblockSkillLevel} farming Farming skill
306
- * @property {SkyblockSkillLevel} mining Mining skill
307
- * @property {SkyblockSkillLevel} combat Combat skill
308
- * @property {SkyblockSkillLevel} foraging Foraging skills
309
- * @property {SkyblockSkillLevel} fishing Fishing skill
310
- * @property {SkyblockSkillLevel} enchanting Enchanting skill
311
- * @property {SkyblockSkillLevel} alchemy Alchemy skill
312
- * @property {SkyblockSkillLevel} taming Taming skill
313
- * @property {SkyblockSkillLevel} carpentry Carpentry skill
314
- * @property {SkyblockSkillLevel} runecrafting Runecrafting skill
315
- */
316
- /**
317
- * @typedef {object} SkyblockSkillLevel
318
- * There is list of skills: {@link SkyblockMemberSkills}. <br>
319
- * Usage: `<SkyblockMember>.skills.farming.xp`.
320
- *
321
- * @property {number} xp Total XP
322
- * @property {number} level Level
323
- * @property {number} maxLevel Max level
324
- * @property {number} xpCurrent Current XP
325
- * @property {number} xpForNext XP for next level
326
- * @property {number} progress Progress
327
- */
328
- /**
329
- * @typedef {object} SkyblockMemberSlayer
330
- * @property {SkyblockMemberSlayerLevel} zombie
331
- * @property {SkyblockMemberSlayerLevel} spider
332
- * @property {SkyblockMemberSlayerLevel} wolf
333
- */
334
- /**
335
- * @typedef {object} SkyblockMemberSlayerLevel
336
- * @property {number} xp Total XP
337
- * @property {number} tier1 Tier 1
338
- * @property {number} tier2 Tier 2
339
- * @property {number} tier3 Tier 3
340
- * @property {number} tier4 Tier 4
341
- * @property {number} level Level
342
- */
343
- /**
344
- * @typedef {object} SkyblockMemberDungeons
345
- * @property {object} types Dungeons types
346
- * @property {object} classes Dungeons classes
347
- */
348
- /**
349
- * @typedef {object} SkyblockMemberDungeonsTypes
350
- * @property {SkyblockSkillLevel} catacombs
351
- */
352
- /**
353
- * @typedef {object} SkyblockMemberDungeonsClasses
354
- * @property {SkyblockSkillLevel} healer Healer class
355
- * @property {SkyblockSkillLevel} mage Mage class
356
- * @property {SkyblockSkillLevel} berserk Berserk class
357
- * @property {SkyblockSkillLevel} archer Archer class
358
- * @property {SkyblockSkillLevel} tank Tank class
359
- */
360
- /**
361
- * @typedef {object} SkyblockMemberStats
362
- * @property {number|undefined} auctionsBids
363
- * @property {number|undefined} auctionsBoughtCommon
364
- * @property {number|undefined} auctionsBoughtEpic
365
- * @property {number|undefined} auctionsBoughtLegendary
366
- * @property {number|undefined} auctionsBoughtRare
367
- * @property {number|undefined} auctionsBoughtSpecial
368
- * @property {number|undefined} auctionsBoughtUncommon
369
- * @property {number|undefined} auctionsCompleted
370
- * @property {number|undefined} auctionsCreated
371
- * @property {number|undefined} auctionsFees
372
- * @property {number|undefined} auctionsGoldEarned
373
- * @property {number|undefined} auctionsGoldSpent
374
- * @property {number|undefined} auctionsHighestBid
375
- * @property {number|undefined} auctionsNoBids
376
- * @property {number|undefined} auctionsSoldCommon
377
- * @property {number|undefined} auctionsSoldEpic
378
- * @property {number|undefined} auctionsSoldLegendary
379
- * @property {number|undefined} auctionsSoldRare
380
- * @property {number|undefined} auctionsSoldSpecial
381
- * @property {number|undefined} auctionsSoldUncommon
382
- * @property {number|undefined} auctionsWon
383
- * @property {number|undefined} chickenRaceBestTime_2
384
- * @property {number|undefined} deaths
385
- * @property {number|undefined} deathsBlaze
386
- * @property {number|undefined} deathsCactus
387
- * @property {number|undefined} deathsCatfish
388
- * @property {number|undefined} deathsCorruptedProtector
389
- * @property {number|undefined} deathsCryptDreadlord
390
- * @property {number|undefined} deathsCryptLurker
391
- * @property {number|undefined} deathsCryptSouleater
392
- * @property {number|undefined} deathsDiamondGuy
393
- * @property {number|undefined} deathsDiamondSkeleton
394
- * @property {number|undefined} deathsDiamondZombie
395
- * @property {number|undefined} deathsDungeonRespawningSkeleton
396
- * @property {number|undefined} deathsEmeraldSlime
397
- * @property {number|undefined} deathsEnderman
398
- * @property {number|undefined} deathsEndermite
399
- * @property {number|undefined} deathsFall
400
- * @property {number|undefined} deathsFire
401
- * @property {number|undefined} deathsFireballMagmaCube
402
- * @property {number|undefined} deathsGaiaConstruct
403
- * @property {number|undefined} deathsGeneratorMagmaCube
404
- * @property {number|undefined} deathsGeneratorSlime
405
- * @property {number|undefined} deathsHowlingSpirit
406
- * @property {number|undefined} deathsKingMidas
407
- * @property {number|undefined} deathsLapisZombie
408
- * @property {number|undefined} deathsLiquidHotMagma
409
- * @property {number|undefined} deathsLividClone
410
- * @property {number|undefined} deathsLostAdventurer
411
- * @property {number|undefined} deathsMagmaCube
412
- * @property {number|undefined} deathsMagmaCubeBoss
413
- * @property {number|undefined} deathsObsidianWither
414
- * @property {number|undefined} deathsOldDragon
415
- * @property {number|undefined} deathsOldWolf
416
- * @property {number|undefined} deathsPlayer
417
- * @property {number|undefined} deathsProfessor
418
- * @property {number|undefined} deathsProfessorGuardianSummon
419
- * @property {number|undefined} deathsProfessorMageGuardian
420
- * @property {number|undefined} deathsProtectorDragon
421
- * @property {number|undefined} deathsRandomSlime
422
- * @property {number|undefined} deathsRedstonePigman
423
- * @property {number|undefined} deathsRevenantZombie
424
- * @property {number|undefined} deathsRuinWolf
425
- * @property {number|undefined} deathsSadanStatue
426
- * @property {number|undefined} deathsScaredSkeleton
427
- * @property {number|undefined} deathsScarf
428
- * @property {number|undefined} deathsScarfMage
429
- * @property {number|undefined} deathsScarfWarrior
430
- * @property {number|undefined} deathsSeaGuardian
431
- * @property {number|undefined} deathsShadowAssassin
432
- * @property {number|undefined} deathsSkeleton
433
- * @property {number|undefined} deathsSkeletonEmperor
434
- * @property {number|undefined} deathsSkeletonGrunt
435
- * @property {number|undefined} deathsSkeletonMaster
436
- * @property {number|undefined} deathsSkeletonSoldier
437
- * @property {number|undefined} deathsSkeletor
438
- * @property {number|undefined} deathsSniperSkeleton
439
- * @property {number|undefined} deathsSoulOfTheAlpha
440
- * @property {number|undefined} deathsSpider
441
- * @property {number|undefined} deathsSpiderJockey
442
- * @property {number|undefined} deathsSpiritBat
443
- * @property {number|undefined} deathsSpiritRabbit
444
- * @property {number|undefined} deathsStrongDragon
445
- * @property {number|undefined} deathsSuffocation
446
- * @property {number|undefined} deathsSuperiorDragon
447
- * @property {number|undefined} deathsTarantulaSpider
448
- * @property {number|undefined} deathsTentaclees
449
- * @property {number|undefined} deathsTrap
450
- * @property {number|undefined} deathsUnburriedZombie
451
- * @property {number|undefined} deathsUnknown
452
- * @property {number|undefined} deathsUnstableDragon
453
- * @property {number|undefined} deathsVoid
454
- * @property {number|undefined} deathsVoraciousSpider
455
- * @property {number|undefined} deathsWatcher
456
- * @property {number|undefined} deathsWatcherSummonUndead
457
- * @property {number|undefined} deathsWeaverSpider
458
- * @property {number|undefined} deathsWiseDragon
459
- * @property {number|undefined} deathsWitherSkeleton
460
- * @property {number|undefined} deathsWolf
461
- * @property {number|undefined} deathsYoungDragon
462
- * @property {number|undefined} deathsZealotEnderman
463
- * @property {number|undefined} deathsZombie
464
- * @property {number|undefined} deathsZombieDeep
465
- * @property {number|undefined} deathsZombieGrunt
466
- * @property {number|undefined} deathsZombieSoldier
467
- * @property {number|undefined} dungeonHubCrystalCoreAnythingNoReturnBestTime
468
- * @property {number|undefined} dungeonHubCrystalCoreAnythingWithReturnBestTime
469
- * @property {number|undefined} dungeonHubCrystalCoreNoAbilitiesNoReturnBestTime
470
- * @property {number|undefined} dungeonHubCrystalCoreNoPearlsNoReturnBestTime
471
- * @property {number|undefined} dungeonHubCrystalCoreNoPearlsWithReturnBestTime
472
- * @property {number|undefined} dungeonHubCrystalCoreNothingNoReturnBestTime
473
- * @property {number|undefined} dungeonHubGiantMushroomAnythingNoReturnBestTime
474
- * @property {number|undefined} dungeonHubGiantMushroomNoAbilitiesNoReturnBestTime
475
- * @property {number|undefined} dungeonHubGiantMushroomNoPearlsNoReturnBestTime
476
- * @property {number|undefined} dungeonHubGiantMushroomNothingNoReturnBestTime
477
- * @property {number|undefined} dungeonHubPrecursorRuinsAnythingNoReturnBestTime
478
- * @property {number|undefined} dungeonHubPrecursorRuinsNoAbilitiesNoReturnBestTime
479
- * @property {number|undefined} dungeonHubPrecursorRuinsNoPearlsNoReturnBestTime
480
- * @property {number|undefined} dungeonHubPrecursorRuinsNothingNoReturnBestTime
481
- * @property {number|undefined} endRaceBestTime
482
- * @property {number|undefined} enderCrystalsDestroyed
483
- * @property {number|undefined} foragingRaceBestTime
484
- * @property {number|undefined} giftsGiven
485
- * @property {number|undefined} giftsReceived
486
- * @property {number|undefined} highestCritDamage
487
- * @property {number|undefined} highestCriticalDamage
488
- * @property {number|undefined} itemsFished
489
- * @property {number|undefined} itemsFishedLargeTreasure
490
- * @property {number|undefined} itemsFishedNormal
491
- * @property {number|undefined} itemsFishedTreasure
492
- * @property {number|undefined} kills
493
- * @property {number|undefined} killsBatPinata
494
- * @property {number|undefined} killsBatSpooky
495
- * @property {number|undefined} killsBattyWitch
496
- * @property {number|undefined} killsBlaze
497
- * @property {number|undefined} killsBlazeHigherOrLower
498
- * @property {number|undefined} killsBlueShark
499
- * @property {number|undefined} killsBonzoSummonUndead
500
- * @property {number|undefined} killsBroodMotherCaveSpider
501
- * @property {number|undefined} killsBroodMotherSpider
502
- * @property {number|undefined} killsCarrotKing
503
- * @property {number|undefined} killsCatfish
504
- * @property {number|undefined} killsCaveSpider
505
- * @property {number|undefined} killsCellarSpider
506
- * @property {number|undefined} killsChicken
507
- * @property {number|undefined} killsChickenDeep
508
- * @property {number|undefined} killsCorruptedProtector
509
- * @property {number|undefined} killsCow
510
- * @property {number|undefined} killsCreeper
511
- * @property {number|undefined} killsCryptDreadlord
512
- * @property {number|undefined} killsCryptLurker
513
- * @property {number|undefined} killsCryptSouleater
514
- * @property {number|undefined} killsCryptTankZombie
515
- * @property {number|undefined} killsCryptUndead
516
- * @property {number|undefined} killsCryptUndeadAlexander
517
- * @property {number|undefined} killsCryptUndeadApunch
518
- * @property {number|undefined} killsCryptUndeadBernhard
519
- * @property {number|undefined} killsCryptUndeadChristian
520
- * @property {number|undefined} killsCryptUndeadCodenameB
521
- * @property {number|undefined} killsCryptUndeadConnorlinfoot
522
- * @property {number|undefined} killsCryptUndeadDctr
523
- * @property {number|undefined} killsCryptUndeadFriedrich
524
- * @property {number|undefined} killsCryptUndeadJayavarmen
525
- * @property {number|undefined} killsCryptUndeadLikaos
526
- * @property {number|undefined} killsCryptUndeadMarius
527
- * @property {number|undefined} killsCryptUndeadNicholas
528
- * @property {number|undefined} killsCryptUndeadNitroholic_
529
- * @property {number|undefined} killsCryptUndeadPieter
530
- * @property {number|undefined} killsCryptUndeadRelenter
531
- * @property {number|undefined} killsCryptUndeadSfarnham
532
- * @property {number|undefined} killsCryptUndeadValentin
533
- * @property {number|undefined} killsCryptWitherskeleton
534
- * @property {number|undefined} killsDasherSpider
535
- * @property {number|undefined} killsDeepSeaProtector
536
- * @property {number|undefined} killsDiamondGuy
537
- * @property {number|undefined} killsDiamondSkeleton
538
- * @property {number|undefined} killsDiamondZombie
539
- * @property {number|undefined} killsDungeonRespawningSkeleton
540
- * @property {number|undefined} killsDungeonRespawningSkeletonSkull
541
- * @property {number|undefined} killsDungeonSecretBat
542
- * @property {number|undefined} killsEmeraldSlime
543
- * @property {number|undefined} killsEnderman
544
- * @property {number|undefined} killsEndermite
545
- * @property {number|undefined} killsFireballMagmaCube
546
- * @property {number|undefined} killsForestIslandBat
547
- * @property {number|undefined} killsFrostyTheSnowman
548
- * @property {number|undefined} killsFrozenSteve
549
- * @property {number|undefined} killsGaiaConstruct
550
- * @property {number|undefined} killsGeneratorGhast
551
- * @property {number|undefined} killsGeneratorMagmaCube
552
- * @property {number|undefined} killsGeneratorSlime
553
- * @property {number|undefined} killsGhast
554
- * @property {number|undefined} killsGuardianDefender
555
- * @property {number|undefined} killsGuardianEmperor
556
- * @property {number|undefined} killsHorsemanBat
557
- * @property {number|undefined} killsHorsemanHorse
558
- * @property {number|undefined} killsHorsemanZombie
559
- * @property {number|undefined} killsHowlingSpirit
560
- * @property {number|undefined} killsInvisibleCreeper
561
- * @property {number|undefined} killsJockeyShotSilverfish
562
- * @property {number|undefined} killsJockeySkeleton
563
- * @property {number|undefined} killsKingMidas
564
- * @property {number|undefined} killsLapisZombie
565
- * @property {number|undefined} killsLiquidHotMagma
566
- * @property {number|undefined} killsLonelySpider
567
- * @property {number|undefined} killsLostAdventurer
568
- * @property {number|undefined} killsMagmaCube
569
- * @property {number|undefined} killsMagmaCubeBoss
570
- * @property {number|undefined} killsMinosHunter
571
- * @property {number|undefined} killsMinotaur
572
- * @property {number|undefined} killsNightRespawningSkeleton
573
- * @property {number|undefined} killsNightSquid
574
- * @property {number|undefined} killsNurseShark
575
- * @property {number|undefined} killsObsidianWither
576
- * @property {number|undefined} killsOldWolf
577
- * @property {number|undefined} killsPackSpirit
578
- * @property {number|undefined} killsParasite
579
- * @property {number|undefined} killsPhantomSpirit
580
- * @property {number|undefined} killsPig
581
- * @property {number|undefined} killsPigman
582
- * @property {number|undefined} killsPlayer
583
- * @property {number|undefined} killsPondSquid
584
- * @property {number|undefined} killsProfessorGuardianSummon
585
- * @property {number|undefined} killsProtectorDragon
586
- * @property {number|undefined} killsRabbit
587
- * @property {number|undefined} killsRandomSlime
588
- * @property {number|undefined} killsRedstonePigman
589
- * @property {number|undefined} killsRespawningSkeleton
590
- * @property {number|undefined} killsRevenantZombie
591
- * @property {number|undefined} killsRuinWolf
592
- * @property {number|undefined} killsScaredSkeleton
593
- * @property {number|undefined} killsScarfArcher
594
- * @property {number|undefined} killsScarfMage
595
- * @property {number|undefined} killsScarfPriest
596
- * @property {number|undefined} killsScarfWarrior
597
- * @property {number|undefined} killsScaryJerry
598
- * @property {number|undefined} killsSeaArcher
599
- * @property {number|undefined} killsSeaGuardian
600
- * @property {number|undefined} killsSeaLeech
601
- * @property {number|undefined} killsSeaWalker
602
- * @property {number|undefined} killsSeaWitch
603
- * @property {number|undefined} killsShadowAssassin
604
- * @property {number|undefined} killsSheep
605
- * @property {number|undefined} killsSiameseLynx
606
- * @property {number|undefined} killsSkeleton
607
- * @property {number|undefined} killsSkeletonEmperor
608
- * @property {number|undefined} killsSkeletonGrunt
609
- * @property {number|undefined} killsSkeletonMaster
610
- * @property {number|undefined} killsSkeletonSoldier
611
- * @property {number|undefined} killsSkeletor
612
- * @property {number|undefined} killsSlime
613
- * @property {number|undefined} killsSniperSkeleton
614
- * @property {number|undefined} killsSoulOfTheAlpha
615
- * @property {number|undefined} killsSpider
616
- * @property {number|undefined} killsSpiderJockey
617
- * @property {number|undefined} killsSpiritBat
618
- * @property {number|undefined} killsSpiritBull
619
- * @property {number|undefined} killsSpiritChicken
620
- * @property {number|undefined} killsSpiritMiniboss
621
- * @property {number|undefined} killsSpiritRabbit
622
- * @property {number|undefined} killsSpiritSheep
623
- * @property {number|undefined} killsSpiritWolf
624
- * @property {number|undefined} killsSplitterSpider
625
- * @property {number|undefined} killsSplitterSpiderSilverfish
626
- * @property {number|undefined} killsStrongDragon
627
- * @property {number|undefined} killsSuperArcher
628
- * @property {number|undefined} killsSuperTankZombie
629
- * @property {number|undefined} killsTarantulaSpider
630
- * @property {number|undefined} killsTentaclees
631
- * @property {number|undefined} killsTigerShark
632
- * @property {number|undefined} killsTrickOrTreater
633
- * @property {number|undefined} killsUnburriedZombie
634
- * @property {number|undefined} killsVoraciousSpider
635
- * @property {number|undefined} killsWatcher
636
- * @property {number|undefined} killsWatcherBonzo
637
- * @property {number|undefined} killsWatcherSummonUndead
638
- * @property {number|undefined} killsWaterHydra
639
- * @property {number|undefined} killsWeaverSpider
640
- * @property {number|undefined} killsWitch
641
- * @property {number|undefined} killsWitchBat
642
- * @property {number|undefined} killsWitherGourd
643
- * @property {number|undefined} killsWitherSkeleton
644
- * @property {number|undefined} killsWraith
645
- * @property {number|undefined} killsZealotEnderman
646
- * @property {number|undefined} killsZombie
647
- * @property {number|undefined} killsZombieDeep
648
- * @property {number|undefined} killsZombieGrunt
649
- * @property {number|undefined} killsZombieKnight
650
- * @property {number|undefined} killsZombieSoldier
651
- * @property {number|undefined} killsZombieVillager
652
- * @property {number|undefined} mostWinterCannonballsHit
653
- * @property {number|undefined} mostWinterDamageDealt
654
- * @property {number|undefined} mostWinterMagmaDamageDealt
655
- * @property {number|undefined} mostWinterSnowballsHit
656
- * @property {number|undefined} mythosBurrowsChainsComplete
657
- * @property {number|undefined} mythosBurrowsChainsCompleteCommon
658
- * @property {number|undefined} mythosBurrowsChainsCompleteRare
659
- * @property {number|undefined} mythosBurrowsChainsCompleteNull
660
- * @property {number|undefined} mythosBurrowsDugCombat
661
- * @property {number|undefined} mythosBurrowsDugCombatCommon
662
- * @property {number|undefined} mythosBurrowsDugCombatRare
663
- * @property {number|undefined} mythosBurrowsDugCombatNull
664
- * @property {number|undefined} mythosBurrowsDugNext
665
- * @property {number|undefined} mythosBurrowsDugNextCommon
666
- * @property {number|undefined} mythosBurrowsDugNextRare
667
- * @property {number|undefined} mythosBurrowsDugNextNull
668
- * @property {number|undefined} mythosBurrowsDugTreasure
669
- * @property {number|undefined} mythosBurrowsDugTreasureCommon
670
- * @property {number|undefined} mythosBurrowsDugTreasureRare
671
- * @property {number|undefined} mythosBurrowsDugTreasureNull
672
- * @property {number|undefined} mythosKills
673
- * @property {number|undefined} petMilestoneOresMined
674
- * @property {number|undefined} petMilestoneSeaCreaturesKilled
675
- */
676
- /**
677
- * @typedef {object} jacobData
678
- * @property {object} medals Medals
679
- * @property {number} medals.bronze Bronze medals
680
- * @property {number} medals.silver Silver medals
681
- * @property {number} medals.gold Gold medals
682
- * @property {object} perks Perks
683
- * @property {number} perks.doubleDrops Double drops
684
- * @property {number} perks.farmingLevelCap Farming level cap
685
- * @property {object} contests Contests
686
- */
687
- 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;