@breezil/hypixel-parsers 1.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 (179) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +235 -0
  3. package/dist/arcade.d.ts +560 -0
  4. package/dist/arcade.d.ts.map +1 -0
  5. package/dist/arcade.js +619 -0
  6. package/dist/arcade.js.map +1 -0
  7. package/dist/arenabrawl.d.ts +56 -0
  8. package/dist/arenabrawl.d.ts.map +1 -0
  9. package/dist/arenabrawl.js +107 -0
  10. package/dist/arenabrawl.js.map +1 -0
  11. package/dist/bedwars.d.ts +747 -0
  12. package/dist/bedwars.d.ts.map +1 -0
  13. package/dist/bedwars.js +844 -0
  14. package/dist/bedwars.js.map +1 -0
  15. package/dist/blitz.d.ts +105 -0
  16. package/dist/blitz.d.ts.map +1 -0
  17. package/dist/blitz.js +259 -0
  18. package/dist/blitz.js.map +1 -0
  19. package/dist/buildbattle.d.ts +54 -0
  20. package/dist/buildbattle.d.ts.map +1 -0
  21. package/dist/buildbattle.js +92 -0
  22. package/dist/buildbattle.js.map +1 -0
  23. package/dist/common.d.ts +11 -0
  24. package/dist/common.d.ts.map +1 -0
  25. package/dist/common.js +34 -0
  26. package/dist/common.js.map +1 -0
  27. package/dist/copsandcrims.d.ts +201 -0
  28. package/dist/copsandcrims.d.ts.map +1 -0
  29. package/dist/copsandcrims.js +269 -0
  30. package/dist/copsandcrims.js.map +1 -0
  31. package/dist/duels.d.ts +358 -0
  32. package/dist/duels.d.ts.map +1 -0
  33. package/dist/duels.js +570 -0
  34. package/dist/duels.js.map +1 -0
  35. package/dist/guild.d.ts +49 -0
  36. package/dist/guild.d.ts.map +1 -0
  37. package/dist/guild.js +95 -0
  38. package/dist/guild.js.map +1 -0
  39. package/dist/housing.d.ts +16 -0
  40. package/dist/housing.d.ts.map +1 -0
  41. package/dist/housing.js +34 -0
  42. package/dist/housing.js.map +1 -0
  43. package/dist/index.d.ts +50 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +66 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/megawalls.d.ts +363 -0
  48. package/dist/megawalls.d.ts.map +1 -0
  49. package/dist/megawalls.js +684 -0
  50. package/dist/megawalls.js.map +1 -0
  51. package/dist/murdermystery.d.ts +293 -0
  52. package/dist/murdermystery.d.ts.map +1 -0
  53. package/dist/murdermystery.js +349 -0
  54. package/dist/murdermystery.js.map +1 -0
  55. package/dist/nbt.d.ts +37 -0
  56. package/dist/nbt.d.ts.map +1 -0
  57. package/dist/nbt.js +133 -0
  58. package/dist/nbt.js.map +1 -0
  59. package/dist/paintball.d.ts +52 -0
  60. package/dist/paintball.d.ts.map +1 -0
  61. package/dist/paintball.js +79 -0
  62. package/dist/paintball.js.map +1 -0
  63. package/dist/pit.d.ts +181 -0
  64. package/dist/pit.d.ts.map +1 -0
  65. package/dist/pit.js +262 -0
  66. package/dist/pit.js.map +1 -0
  67. package/dist/player.d.ts +338 -0
  68. package/dist/player.d.ts.map +1 -0
  69. package/dist/player.js +521 -0
  70. package/dist/player.js.map +1 -0
  71. package/dist/quakecraft.d.ts +75 -0
  72. package/dist/quakecraft.d.ts.map +1 -0
  73. package/dist/quakecraft.js +99 -0
  74. package/dist/quakecraft.js.map +1 -0
  75. package/dist/recentgames.d.ts +10 -0
  76. package/dist/recentgames.d.ts.map +1 -0
  77. package/dist/recentgames.js +27 -0
  78. package/dist/recentgames.js.map +1 -0
  79. package/dist/resources-achievements.d.ts +29 -0
  80. package/dist/resources-achievements.d.ts.map +1 -0
  81. package/dist/resources-achievements.js +67 -0
  82. package/dist/resources-achievements.js.map +1 -0
  83. package/dist/resources-challenges.d.ts +12 -0
  84. package/dist/resources-challenges.d.ts.map +1 -0
  85. package/dist/resources-challenges.js +36 -0
  86. package/dist/resources-challenges.js.map +1 -0
  87. package/dist/resources-games.d.ts +10 -0
  88. package/dist/resources-games.d.ts.map +1 -0
  89. package/dist/resources-games.js +28 -0
  90. package/dist/resources-games.js.map +1 -0
  91. package/dist/resources-guild-achievements.d.ts +23 -0
  92. package/dist/resources-guild-achievements.d.ts.map +1 -0
  93. package/dist/resources-guild-achievements.js +56 -0
  94. package/dist/resources-guild-achievements.js.map +1 -0
  95. package/dist/resources-quests.d.ts +23 -0
  96. package/dist/resources-quests.d.ts.map +1 -0
  97. package/dist/resources-quests.js +53 -0
  98. package/dist/resources-quests.js.map +1 -0
  99. package/dist/resources-vanity.d.ts +19 -0
  100. package/dist/resources-vanity.d.ts.map +1 -0
  101. package/dist/resources-vanity.js +33 -0
  102. package/dist/resources-vanity.js.map +1 -0
  103. package/dist/skyblock-auctions.d.ts +50 -0
  104. package/dist/skyblock-auctions.d.ts.map +1 -0
  105. package/dist/skyblock-auctions.js +90 -0
  106. package/dist/skyblock-auctions.js.map +1 -0
  107. package/dist/skyblock-bazaar.d.ts +25 -0
  108. package/dist/skyblock-bazaar.d.ts.map +1 -0
  109. package/dist/skyblock-bazaar.js +54 -0
  110. package/dist/skyblock-bazaar.js.map +1 -0
  111. package/dist/skyblock-bingo.d.ts +8 -0
  112. package/dist/skyblock-bingo.d.ts.map +1 -0
  113. package/dist/skyblock-bingo.js +19 -0
  114. package/dist/skyblock-bingo.js.map +1 -0
  115. package/dist/skyblock-items.d.ts +150 -0
  116. package/dist/skyblock-items.d.ts.map +1 -0
  117. package/dist/skyblock-items.js +247 -0
  118. package/dist/skyblock-items.js.map +1 -0
  119. package/dist/skyblock-misc.d.ts +91 -0
  120. package/dist/skyblock-misc.d.ts.map +1 -0
  121. package/dist/skyblock-misc.js +159 -0
  122. package/dist/skyblock-misc.js.map +1 -0
  123. package/dist/skyblock-museum.d.ts +24 -0
  124. package/dist/skyblock-museum.d.ts.map +1 -0
  125. package/dist/skyblock-museum.js +51 -0
  126. package/dist/skyblock-museum.js.map +1 -0
  127. package/dist/skyblock-news.d.ts +12 -0
  128. package/dist/skyblock-news.d.ts.map +1 -0
  129. package/dist/skyblock-news.js +25 -0
  130. package/dist/skyblock-news.js.map +1 -0
  131. package/dist/skyblock-resources.d.ts +94 -0
  132. package/dist/skyblock-resources.d.ts.map +1 -0
  133. package/dist/skyblock-resources.js +175 -0
  134. package/dist/skyblock-resources.js.map +1 -0
  135. package/dist/skyblock.d.ts +972 -0
  136. package/dist/skyblock.d.ts.map +1 -0
  137. package/dist/skyblock.js +1371 -0
  138. package/dist/skyblock.js.map +1 -0
  139. package/dist/skywars.d.ts +319 -0
  140. package/dist/skywars.d.ts.map +1 -0
  141. package/dist/skywars.js +611 -0
  142. package/dist/skywars.js.map +1 -0
  143. package/dist/smashheroes.d.ts +126 -0
  144. package/dist/smashheroes.d.ts.map +1 -0
  145. package/dist/smashheroes.js +206 -0
  146. package/dist/smashheroes.js.map +1 -0
  147. package/dist/static.d.ts +42 -0
  148. package/dist/static.d.ts.map +1 -0
  149. package/dist/static.js +106 -0
  150. package/dist/static.js.map +1 -0
  151. package/dist/status.d.ts +9 -0
  152. package/dist/status.d.ts.map +1 -0
  153. package/dist/status.js +18 -0
  154. package/dist/status.js.map +1 -0
  155. package/dist/tntgames.d.ts +189 -0
  156. package/dist/tntgames.d.ts.map +1 -0
  157. package/dist/tntgames.js +283 -0
  158. package/dist/tntgames.js.map +1 -0
  159. package/dist/turbokartracers.d.ts +85 -0
  160. package/dist/turbokartracers.d.ts.map +1 -0
  161. package/dist/turbokartracers.js +165 -0
  162. package/dist/turbokartracers.js.map +1 -0
  163. package/dist/uhc.d.ts +55 -0
  164. package/dist/uhc.d.ts.map +1 -0
  165. package/dist/uhc.js +94 -0
  166. package/dist/uhc.js.map +1 -0
  167. package/dist/vampirez.d.ts +75 -0
  168. package/dist/vampirez.d.ts.map +1 -0
  169. package/dist/vampirez.js +104 -0
  170. package/dist/vampirez.js.map +1 -0
  171. package/dist/walls.d.ts +96 -0
  172. package/dist/walls.d.ts.map +1 -0
  173. package/dist/walls.js +122 -0
  174. package/dist/walls.js.map +1 -0
  175. package/dist/warlords.d.ts +229 -0
  176. package/dist/warlords.d.ts.map +1 -0
  177. package/dist/warlords.js +309 -0
  178. package/dist/warlords.js.map +1 -0
  179. package/package.json +55 -0
@@ -0,0 +1,1371 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseSkyBlockProfile = parseSkyBlockProfile;
4
+ exports.parseSkyBlockProfiles = parseSkyBlockProfiles;
5
+ const common_1 = require("./common");
6
+ const nbt_1 = require("./nbt");
7
+ const SKILL_KEYS = {
8
+ farming: "SKILL_FARMING",
9
+ mining: "SKILL_MINING",
10
+ combat: "SKILL_COMBAT",
11
+ foraging: "SKILL_FORAGING",
12
+ fishing: "SKILL_FISHING",
13
+ enchanting: "SKILL_ENCHANTING",
14
+ alchemy: "SKILL_ALCHEMY",
15
+ carpentry: "SKILL_CARPENTRY",
16
+ runecrafting: "SKILL_RUNECRAFTING",
17
+ social: "SKILL_SOCIAL",
18
+ taming: "SKILL_TAMING",
19
+ hunting: "SKILL_HUNTING",
20
+ };
21
+ const SLAYER_NAMES = [
22
+ "zombie",
23
+ "spider",
24
+ "wolf",
25
+ "enderman",
26
+ "blaze",
27
+ "vampire",
28
+ ];
29
+ const DUNGEON_CLASS_NAMES = [
30
+ "healer",
31
+ "berserk",
32
+ "mage",
33
+ "archer",
34
+ "tank",
35
+ ];
36
+ function stringArray(source, key) {
37
+ const value = source[key];
38
+ return Array.isArray(value)
39
+ ? value.filter((entry) => typeof entry === "string")
40
+ : [];
41
+ }
42
+ function objectArray(source, key) {
43
+ const value = source[key];
44
+ if (!Array.isArray(value)) {
45
+ return [];
46
+ }
47
+ return value.filter((entry) => typeof entry === "object" && entry !== null && !Array.isArray(entry));
48
+ }
49
+ function numberArray(source, key) {
50
+ const value = source[key];
51
+ return Array.isArray(value)
52
+ ? value.filter((entry) => typeof entry === "number")
53
+ : [];
54
+ }
55
+ function numberRecord(source) {
56
+ const result = {};
57
+ for (const key of Object.keys(source)) {
58
+ const value = source[key];
59
+ if (typeof value === "number") {
60
+ result[key] = value;
61
+ }
62
+ }
63
+ return result;
64
+ }
65
+ function booleanRecord(source) {
66
+ const result = {};
67
+ for (const key of Object.keys(source)) {
68
+ result[key] = source[key] === true;
69
+ }
70
+ return result;
71
+ }
72
+ function stringRecord(source) {
73
+ const result = {};
74
+ for (const key of Object.keys(source)) {
75
+ const value = source[key];
76
+ if (typeof value === "string") {
77
+ result[key] = value;
78
+ }
79
+ }
80
+ return result;
81
+ }
82
+ function numberBooleanRecord(source) {
83
+ const result = {};
84
+ for (const key of Object.keys(source)) {
85
+ const value = source[key];
86
+ if (typeof value === "number" || typeof value === "boolean") {
87
+ result[key] = value;
88
+ }
89
+ }
90
+ return result;
91
+ }
92
+ function scalarRecord(source) {
93
+ const result = {};
94
+ for (const key of Object.keys(source)) {
95
+ const value = source[key];
96
+ if (typeof value === "number" ||
97
+ typeof value === "string" ||
98
+ typeof value === "boolean") {
99
+ result[key] = value;
100
+ }
101
+ }
102
+ return result;
103
+ }
104
+ function raceRecord(source) {
105
+ const result = {};
106
+ for (const key of Object.keys(source)) {
107
+ const value = source[key];
108
+ if (typeof value === "number") {
109
+ result[key] = value;
110
+ }
111
+ else if (typeof value === "object" &&
112
+ value !== null &&
113
+ !Array.isArray(value)) {
114
+ result[key] = numberRecord(value);
115
+ }
116
+ }
117
+ return result;
118
+ }
119
+ function recordOf(source, parse) {
120
+ const result = {};
121
+ for (const key of Object.keys(source)) {
122
+ result[key] = parse((0, common_1.obj)(source, key));
123
+ }
124
+ return result;
125
+ }
126
+ function stringArrayRecord(source) {
127
+ const result = {};
128
+ for (const key of Object.keys(source)) {
129
+ const value = source[key];
130
+ result[key] = Array.isArray(value)
131
+ ? value.filter((entry) => typeof entry === "string")
132
+ : [];
133
+ }
134
+ return result;
135
+ }
136
+ function decodeInventory(node) {
137
+ const data = node.data;
138
+ if (typeof data !== "string" || data.length === 0) {
139
+ return null;
140
+ }
141
+ return { type: (0, common_1.num)(node, "type"), items: (0, nbt_1.decodeItemBytes)(data) };
142
+ }
143
+ function inventory(parent, key) {
144
+ return decodeInventory((0, common_1.obj)(parent, key));
145
+ }
146
+ function inventoryRecord(source) {
147
+ const result = {};
148
+ for (const key of Object.keys(source)) {
149
+ const decoded = decodeInventory((0, common_1.obj)(source, key));
150
+ if (decoded !== null) {
151
+ result[key] = decoded;
152
+ }
153
+ }
154
+ return result;
155
+ }
156
+ function parseToolkit(toolkit) {
157
+ const inUseRaw = (0, common_1.obj)(toolkit, "IN_USE");
158
+ const inUse = {};
159
+ for (const key of Object.keys(inUseRaw)) {
160
+ inUse[key] = booleanRecord((0, common_1.obj)(inUseRaw, key));
161
+ }
162
+ const tools = {};
163
+ for (const key of Object.keys(toolkit)) {
164
+ if (key === "IN_USE" || key === "IS_UNLOCKED") {
165
+ continue;
166
+ }
167
+ const value = toolkit[key];
168
+ if (Array.isArray(value)) {
169
+ tools[key] = value
170
+ .filter((entry) => typeof entry === "object" &&
171
+ entry !== null &&
172
+ !Array.isArray(entry))
173
+ .map((entry) => ({
174
+ type: (0, common_1.num)(entry, "type"),
175
+ data: (0, common_1.str)(entry, "data"),
176
+ }));
177
+ }
178
+ }
179
+ return { isUnlocked: (0, common_1.bool)(toolkit, "IS_UNLOCKED"), inUse, tools };
180
+ }
181
+ function parseCurrencies(member) {
182
+ const currencies = (0, common_1.obj)(member, "currencies");
183
+ const essence = (0, common_1.obj)(currencies, "essence");
184
+ return {
185
+ coinPurse: (0, common_1.num)(currencies, "coin_purse"),
186
+ motesPurse: (0, common_1.num)(currencies, "motes_purse"),
187
+ essences: {
188
+ wither: (0, common_1.num)((0, common_1.obj)(essence, "WITHER"), "current"),
189
+ dragon: (0, common_1.num)((0, common_1.obj)(essence, "DRAGON"), "current"),
190
+ spider: (0, common_1.num)((0, common_1.obj)(essence, "SPIDER"), "current"),
191
+ undead: (0, common_1.num)((0, common_1.obj)(essence, "UNDEAD"), "current"),
192
+ diamond: (0, common_1.num)((0, common_1.obj)(essence, "DIAMOND"), "current"),
193
+ gold: (0, common_1.num)((0, common_1.obj)(essence, "GOLD"), "current"),
194
+ ice: (0, common_1.num)((0, common_1.obj)(essence, "ICE"), "current"),
195
+ crimson: (0, common_1.num)((0, common_1.obj)(essence, "CRIMSON"), "current"),
196
+ },
197
+ };
198
+ }
199
+ function parseFairySouls(member) {
200
+ const fairySoul = (0, common_1.obj)(member, "fairy_soul");
201
+ return {
202
+ exchanges: (0, common_1.num)(fairySoul, "fairy_exchanges"),
203
+ collected: (0, common_1.num)(fairySoul, "total_collected"),
204
+ unspent: (0, common_1.num)(fairySoul, "unspent_souls"),
205
+ };
206
+ }
207
+ function parseLeveling(member) {
208
+ const leveling = (0, common_1.obj)(member, "leveling");
209
+ return {
210
+ experience: (0, common_1.num)(leveling, "experience"),
211
+ highestPetScore: (0, common_1.num)(leveling, "highest_pet_score"),
212
+ miningFiestaOresMined: (0, common_1.num)(leveling, "mining_fiesta_ores_mined"),
213
+ fishingFestivalSharksKilled: (0, common_1.num)(leveling, "fishing_festival_sharks_killed"),
214
+ taskSort: (0, common_1.str)(leveling, "task_sort"),
215
+ selectedSymbol: (0, common_1.str)(leveling, "selected_symbol"),
216
+ bopBonus: (0, common_1.str)(leveling, "bop_bonus"),
217
+ claimedTalisman: (0, common_1.bool)(leveling, "claimed_talisman"),
218
+ migrated: (0, common_1.bool)(leveling, "migrated"),
219
+ migratedCompletions2: (0, common_1.bool)(leveling, "migrated_completions_2"),
220
+ completedTasks: stringArray(leveling, "completed_tasks"),
221
+ lastViewedTasks: stringArray(leveling, "last_viewed_tasks"),
222
+ emblemUnlocks: stringArray(leveling, "emblem_unlocks"),
223
+ categoryExpanded: (0, common_1.bool)(leveling, "category_expanded"),
224
+ completions: numberRecord((0, common_1.obj)(leveling, "completions")),
225
+ };
226
+ }
227
+ function parseProfileStats(member) {
228
+ const profile = (0, common_1.obj)(member, "profile");
229
+ const coopInvitation = profile.coop_invitation;
230
+ return {
231
+ firstJoin: (0, common_1.date)(profile, "first_join"),
232
+ personalBankUpgrade: (0, common_1.num)(profile, "personal_bank_upgrade"),
233
+ bankAccount: (0, common_1.num)(profile, "bank_account"),
234
+ hasCookieBuff: (0, common_1.bool)(profile, "cookie_buff_active"),
235
+ coopInvitation: typeof coopInvitation === "object" &&
236
+ coopInvitation !== null &&
237
+ !Array.isArray(coopInvitation)
238
+ ? {
239
+ timestamp: (0, common_1.num)(coopInvitation, "timestamp"),
240
+ invitedBy: (0, common_1.str)(coopInvitation, "invited_by"),
241
+ confirmed: (0, common_1.bool)(coopInvitation, "confirmed"),
242
+ confirmedTimestamp: (0, common_1.num)(coopInvitation, "confirmed_timestamp"),
243
+ }
244
+ : null,
245
+ };
246
+ }
247
+ function parseItemData(member) {
248
+ const itemData = (0, common_1.obj)(member, "item_data");
249
+ return {
250
+ soulflow: (0, common_1.num)(itemData, "soulflow"),
251
+ favoriteArrow: (0, common_1.str)(itemData, "favorite_arrow"),
252
+ teleporterPillConsumed: (0, common_1.bool)(itemData, "teleporter_pill_consumed"),
253
+ };
254
+ }
255
+ function parseSkillExperience(experience) {
256
+ return {
257
+ farming: (0, common_1.num)(experience, SKILL_KEYS.farming),
258
+ mining: (0, common_1.num)(experience, SKILL_KEYS.mining),
259
+ combat: (0, common_1.num)(experience, SKILL_KEYS.combat),
260
+ foraging: (0, common_1.num)(experience, SKILL_KEYS.foraging),
261
+ fishing: (0, common_1.num)(experience, SKILL_KEYS.fishing),
262
+ enchanting: (0, common_1.num)(experience, SKILL_KEYS.enchanting),
263
+ alchemy: (0, common_1.num)(experience, SKILL_KEYS.alchemy),
264
+ carpentry: (0, common_1.num)(experience, SKILL_KEYS.carpentry),
265
+ runecrafting: (0, common_1.num)(experience, SKILL_KEYS.runecrafting),
266
+ social: (0, common_1.num)(experience, SKILL_KEYS.social),
267
+ taming: (0, common_1.num)(experience, SKILL_KEYS.taming),
268
+ hunting: (0, common_1.num)(experience, SKILL_KEYS.hunting),
269
+ };
270
+ }
271
+ function parseSlayerBoss(boss) {
272
+ return {
273
+ xp: (0, common_1.num)(boss, "xp"),
274
+ bossKillsTier0: (0, common_1.num)(boss, "boss_kills_tier_0"),
275
+ bossKillsTier1: (0, common_1.num)(boss, "boss_kills_tier_1"),
276
+ bossKillsTier2: (0, common_1.num)(boss, "boss_kills_tier_2"),
277
+ bossKillsTier3: (0, common_1.num)(boss, "boss_kills_tier_3"),
278
+ bossKillsTier4: (0, common_1.num)(boss, "boss_kills_tier_4"),
279
+ bossAttemptsTier1: (0, common_1.num)(boss, "boss_attempts_tier_1"),
280
+ bossAttemptsTier2: (0, common_1.num)(boss, "boss_attempts_tier_2"),
281
+ bossAttemptsTier3: (0, common_1.num)(boss, "boss_attempts_tier_3"),
282
+ bossAttemptsTier4: (0, common_1.num)(boss, "boss_attempts_tier_4"),
283
+ claimedLevels: booleanRecord((0, common_1.obj)(boss, "claimed_levels")),
284
+ };
285
+ }
286
+ function parseSlayerQuest(quest) {
287
+ return {
288
+ type: (0, common_1.str)(quest, "type"),
289
+ tier: (0, common_1.num)(quest, "tier"),
290
+ startTimestamp: (0, common_1.num)(quest, "start_timestamp"),
291
+ completionState: (0, common_1.num)(quest, "completion_state"),
292
+ usedArmor: (0, common_1.bool)(quest, "used_armor"),
293
+ solo: (0, common_1.bool)(quest, "solo"),
294
+ combatXp: (0, common_1.num)(quest, "combat_xp"),
295
+ recentMobKills: objectArray(quest, "recent_mob_kills").map((kill) => ({
296
+ xp: (0, common_1.num)(kill, "xp"),
297
+ timestamp: (0, common_1.num)(kill, "timestamp"),
298
+ })),
299
+ lastKilledMobIsland: (0, common_1.str)(quest, "last_killed_mob_island"),
300
+ xpOnLastFollowerSpawn: (0, common_1.num)(quest, "xp_on_last_follower_spawn"),
301
+ spawnTimestamp: (0, common_1.num)(quest, "spawn_timestamp"),
302
+ };
303
+ }
304
+ function parseSlayers(member) {
305
+ const slayer = (0, common_1.obj)(member, "slayer");
306
+ const bosses = (0, common_1.obj)(slayer, "slayer_bosses");
307
+ const parsed = {};
308
+ for (const name of SLAYER_NAMES) {
309
+ parsed[name] = parseSlayerBoss((0, common_1.obj)(bosses, name));
310
+ }
311
+ const quest = slayer.slayer_quest;
312
+ return {
313
+ activeQuest: typeof quest === "object" && quest !== null && !Array.isArray(quest)
314
+ ? parseSlayerQuest(quest)
315
+ : null,
316
+ bosses: parsed,
317
+ };
318
+ }
319
+ function parseDungeonRun(run) {
320
+ return {
321
+ timestamp: (0, common_1.num)(run, "timestamp"),
322
+ scoreExploration: (0, common_1.num)(run, "score_exploration"),
323
+ scoreSpeed: (0, common_1.num)(run, "score_speed"),
324
+ scoreSkill: (0, common_1.num)(run, "score_skill"),
325
+ scoreBonus: (0, common_1.num)(run, "score_bonus"),
326
+ dungeonClass: (0, common_1.str)(run, "dungeon_class"),
327
+ teammates: stringArray(run, "teammates"),
328
+ elapsedTime: (0, common_1.num)(run, "elapsed_time"),
329
+ damageDealt: (0, common_1.num)(run, "damage_dealt"),
330
+ deaths: (0, common_1.num)(run, "deaths"),
331
+ mobsKilled: (0, common_1.num)(run, "mobs_killed"),
332
+ secretsFound: (0, common_1.num)(run, "secrets_found"),
333
+ damageMitigated: (0, common_1.num)(run, "damage_mitigated"),
334
+ allyHealing: (0, common_1.num)(run, "ally_healing"),
335
+ };
336
+ }
337
+ function parseDungeonMode(mode) {
338
+ const rawBestRuns = (0, common_1.obj)(mode, "best_runs");
339
+ const bestRuns = {};
340
+ for (const floor of Object.keys(rawBestRuns)) {
341
+ bestRuns[floor] = objectArray(rawBestRuns, floor).map(parseDungeonRun);
342
+ }
343
+ return {
344
+ experience: (0, common_1.num)(mode, "experience"),
345
+ highestTierCompleted: (0, common_1.num)(mode, "highest_tier_completed"),
346
+ timesPlayed: numberRecord((0, common_1.obj)(mode, "times_played")),
347
+ tierCompletions: numberRecord((0, common_1.obj)(mode, "tier_completions")),
348
+ milestoneCompletions: numberRecord((0, common_1.obj)(mode, "milestone_completions")),
349
+ bestScore: numberRecord((0, common_1.obj)(mode, "best_score")),
350
+ mobsKilled: numberRecord((0, common_1.obj)(mode, "mobs_killed")),
351
+ mostMobsKilled: numberRecord((0, common_1.obj)(mode, "most_mobs_killed")),
352
+ mostDamageBerserk: numberRecord((0, common_1.obj)(mode, "most_damage_berserk")),
353
+ mostDamageMage: numberRecord((0, common_1.obj)(mode, "most_damage_mage")),
354
+ mostDamageHealer: numberRecord((0, common_1.obj)(mode, "most_damage_healer")),
355
+ mostDamageTank: numberRecord((0, common_1.obj)(mode, "most_damage_tank")),
356
+ mostDamageArcher: numberRecord((0, common_1.obj)(mode, "most_damage_archer")),
357
+ mostHealingDealt: numberRecord((0, common_1.obj)(mode, "most_healing")),
358
+ watcherKills: numberRecord((0, common_1.obj)(mode, "watcher_kills")),
359
+ fastestTime: numberRecord((0, common_1.obj)(mode, "fastest_time")),
360
+ fastestTimeS: numberRecord((0, common_1.obj)(mode, "fastest_time_s")),
361
+ fastestTimeSPlus: numberRecord((0, common_1.obj)(mode, "fastest_time_s_plus")),
362
+ bestRuns,
363
+ };
364
+ }
365
+ function parseTreasureRun(run) {
366
+ return {
367
+ runId: (0, common_1.str)(run, "run_id"),
368
+ completionTimestamp: (0, common_1.num)(run, "completion_ts"),
369
+ type: (0, common_1.str)(run, "type"),
370
+ dungeonTier: (0, common_1.num)(run, "dungeon_tier"),
371
+ participants: objectArray(run, "participants").map((participant) => ({
372
+ playerUuid: (0, common_1.str)(participant, "player_uuid"),
373
+ displayName: (0, common_1.str)(participant, "display_name"),
374
+ classMilestone: (0, common_1.num)(participant, "class_milestone"),
375
+ })),
376
+ };
377
+ }
378
+ function parseTreasureChest(chest) {
379
+ const rewards = (0, common_1.obj)(chest, "rewards");
380
+ return {
381
+ runId: (0, common_1.str)(chest, "run_id"),
382
+ chestId: (0, common_1.str)(chest, "chest_id"),
383
+ treasureType: (0, common_1.str)(chest, "treasure_type"),
384
+ quality: (0, common_1.num)(chest, "quality"),
385
+ shinyEligible: (0, common_1.bool)(chest, "shiny_eligible"),
386
+ paid: (0, common_1.bool)(chest, "paid"),
387
+ rerolls: (0, common_1.num)(chest, "rerolls"),
388
+ rewards: stringArray(rewards, "rewards"),
389
+ rolledRngMeterRandomly: (0, common_1.bool)(rewards, "rolled_rng_meter_randomly"),
390
+ };
391
+ }
392
+ function parseDungeons(member) {
393
+ const dungeons = (0, common_1.obj)(member, "dungeons");
394
+ const dungeonTypes = (0, common_1.obj)(dungeons, "dungeon_types");
395
+ const playerClasses = (0, common_1.obj)(dungeons, "player_classes");
396
+ const dailyRuns = (0, common_1.obj)(dungeons, "daily_runs");
397
+ const raceSettings = (0, common_1.obj)(dungeons, "dungeon_hub_race_settings");
398
+ const treasures = (0, common_1.obj)(dungeons, "treasures");
399
+ const classExperience = {};
400
+ for (const name of DUNGEON_CLASS_NAMES) {
401
+ classExperience[name] = {
402
+ experience: (0, common_1.num)((0, common_1.obj)(playerClasses, name), "experience"),
403
+ };
404
+ }
405
+ return {
406
+ catacombs: parseDungeonMode((0, common_1.obj)(dungeonTypes, "catacombs")),
407
+ masterCatacombs: parseDungeonMode((0, common_1.obj)(dungeonTypes, "master_catacombs")),
408
+ selectedClass: (0, common_1.str)(dungeons, "selected_dungeon_class"),
409
+ classExperience,
410
+ secrets: (0, common_1.num)(dungeons, "secrets"),
411
+ lastDungeonRun: (0, common_1.str)(dungeons, "last_dungeon_run"),
412
+ dungeonsBlahBlah: stringArray(dungeons, "dungeons_blah_blah"),
413
+ hubRaceSettings: {
414
+ selectedRace: (0, common_1.str)(raceSettings, "selected_race"),
415
+ selectedSetting: (0, common_1.str)(raceSettings, "selected_setting"),
416
+ runback: (0, common_1.bool)(raceSettings, "runback"),
417
+ },
418
+ dailyRuns: {
419
+ currentDayStamp: (0, common_1.num)(dailyRuns, "current_day_stamp"),
420
+ completedRunsCount: (0, common_1.num)(dailyRuns, "completed_runs_count"),
421
+ },
422
+ unlockedJournals: stringArray((0, common_1.obj)(dungeons, "dungeon_journal"), "unlocked_journals"),
423
+ treasures: {
424
+ runs: objectArray(treasures, "runs").map(parseTreasureRun),
425
+ chests: objectArray(treasures, "chests").map(parseTreasureChest),
426
+ },
427
+ };
428
+ }
429
+ function parsePlayerData(member) {
430
+ const playerData = (0, common_1.obj)(member, "player_data");
431
+ const experience = (0, common_1.obj)(playerData, "experience");
432
+ return {
433
+ deaths: (0, common_1.num)(playerData, "death_count"),
434
+ lastDeath: (0, common_1.num)(playerData, "last_death"),
435
+ reaperPeppersEaten: (0, common_1.num)(playerData, "reaper_peppers_eaten"),
436
+ fishingTreasureCaught: (0, common_1.num)(playerData, "fishing_treasure_caught"),
437
+ fastestTargetPractice: (0, common_1.num)(playerData, "fastest_target_practice"),
438
+ visitedZones: stringArray(playerData, "visited_zones"),
439
+ visitedModes: stringArray(playerData, "visited_modes"),
440
+ achievementSpawnedIslandTypes: stringArray(playerData, "achievement_spawned_island_types"),
441
+ unlockedCollectionTiers: stringArray(playerData, "unlocked_coll_tiers"),
442
+ craftedGenerators: stringArray(playerData, "crafted_generators"),
443
+ pausedEffects: stringArray(playerData, "paused_effects"),
444
+ disabledPotionEffects: stringArray(playerData, "disabled_potion_effects"),
445
+ activeEffects: objectArray(playerData, "active_effects").map((effect) => ({
446
+ effect: (0, common_1.str)(effect, "effect"),
447
+ level: (0, common_1.num)(effect, "level"),
448
+ modifiers: objectArray(effect, "modifiers").map((modifier) => ({
449
+ key: (0, common_1.str)(modifier, "key"),
450
+ amp: (0, common_1.num)(modifier, "amp"),
451
+ })),
452
+ ticksRemaining: (0, common_1.num)(effect, "ticks_remaining"),
453
+ infinite: (0, common_1.bool)(effect, "infinite"),
454
+ })),
455
+ temporaryStatBuffs: objectArray(playerData, "temp_stat_buffs").map((buff) => ({
456
+ stat: (0, common_1.num)(buff, "stat"),
457
+ key: (0, common_1.str)(buff, "key"),
458
+ amount: (0, common_1.num)(buff, "amount"),
459
+ expireAt: (0, common_1.num)(buff, "expire_at"),
460
+ })),
461
+ perks: numberRecord((0, common_1.obj)(playerData, "perks")),
462
+ gardenChips: numberRecord((0, common_1.obj)(playerData, "garden_chips")),
463
+ skillExperience: parseSkillExperience(experience),
464
+ experience: numberRecord(experience),
465
+ };
466
+ }
467
+ function parsePlayerStats(member) {
468
+ const playerStats = (0, common_1.obj)(member, "player_stats");
469
+ const auctions = (0, common_1.obj)(playerStats, "auctions");
470
+ const candy = (0, common_1.obj)(playerStats, "candy_collected");
471
+ const gifts = (0, common_1.obj)(playerStats, "gifts");
472
+ const mythos = (0, common_1.obj)(playerStats, "mythos");
473
+ const winter = (0, common_1.obj)(playerStats, "winter");
474
+ const endIsland = (0, common_1.obj)(playerStats, "end_island");
475
+ const dragonFight = (0, common_1.obj)(endIsland, "dragon_fight");
476
+ const spooky = (0, common_1.obj)(playerStats, "spooky");
477
+ const festivals = {};
478
+ for (const key of Object.keys(candy)) {
479
+ if (key.startsWith("spooky_festival_")) {
480
+ const festival = (0, common_1.obj)(candy, key);
481
+ festivals[key] = {
482
+ greenCandy: (0, common_1.num)(festival, "green_candy"),
483
+ purpleCandy: (0, common_1.num)(festival, "purple_candy"),
484
+ };
485
+ }
486
+ }
487
+ return {
488
+ highestDamage: (0, common_1.num)(playerStats, "highest_damage"),
489
+ highestCriticalDamage: (0, common_1.num)(playerStats, "highest_critical_damage"),
490
+ glowingMushroomsBroken: (0, common_1.num)(playerStats, "glowing_mushrooms_broken"),
491
+ seaCreatureKills: (0, common_1.num)(playerStats, "sea_creature_kills"),
492
+ kills: numberRecord((0, common_1.obj)(playerStats, "kills")),
493
+ deaths: numberRecord((0, common_1.obj)(playerStats, "deaths")),
494
+ itemsFished: numberRecord((0, common_1.obj)(playerStats, "items_fished")),
495
+ auctions: {
496
+ bids: (0, common_1.num)(auctions, "bids"),
497
+ highestBid: (0, common_1.num)(auctions, "highest_bid"),
498
+ won: (0, common_1.num)(auctions, "won"),
499
+ goldSpent: (0, common_1.num)(auctions, "gold_spent"),
500
+ created: (0, common_1.num)(auctions, "created"),
501
+ fees: (0, common_1.num)(auctions, "fees"),
502
+ completed: (0, common_1.num)(auctions, "completed"),
503
+ goldEarned: (0, common_1.num)(auctions, "gold_earned"),
504
+ noBids: (0, common_1.num)(auctions, "no_bids"),
505
+ totalBought: numberRecord((0, common_1.obj)(auctions, "total_bought")),
506
+ totalSold: numberRecord((0, common_1.obj)(auctions, "total_sold")),
507
+ },
508
+ candyCollected: {
509
+ total: (0, common_1.num)(candy, "total"),
510
+ greenCandy: (0, common_1.num)(candy, "green_candy"),
511
+ purpleCandy: (0, common_1.num)(candy, "purple_candy"),
512
+ festivals,
513
+ },
514
+ gifts: {
515
+ totalReceived: (0, common_1.num)(gifts, "total_received"),
516
+ totalGiven: (0, common_1.num)(gifts, "total_given"),
517
+ },
518
+ mythos: {
519
+ kills: (0, common_1.num)(mythos, "kills"),
520
+ burrowsDugNext: numberRecord((0, common_1.obj)(mythos, "burrows_dug_next")),
521
+ burrowsDugCombat: numberRecord((0, common_1.obj)(mythos, "burrows_dug_combat")),
522
+ burrowsDugTreasure: numberRecord((0, common_1.obj)(mythos, "burrows_dug_treasure")),
523
+ burrowsChainsComplete: numberRecord((0, common_1.obj)(mythos, "burrows_chains_complete")),
524
+ },
525
+ winter: {
526
+ mostSnowballsHit: (0, common_1.num)(winter, "most_snowballs_hit"),
527
+ mostDamageDealt: (0, common_1.num)(winter, "most_damage_dealt"),
528
+ mostMagmaDamageDealt: (0, common_1.num)(winter, "most_magma_damage_dealt"),
529
+ mostCannonballsHit: (0, common_1.num)(winter, "most_cannonballs_hit"),
530
+ },
531
+ endIsland: {
532
+ summoningEyesCollected: (0, common_1.num)(endIsland, "summoning_eyes_collected"),
533
+ specialZealotLootCollected: (0, common_1.num)(endIsland, "special_zealot_loot_collected"),
534
+ dragonFight: {
535
+ enderCrystalsDestroyed: (0, common_1.num)(dragonFight, "ender_crystals_destroyed"),
536
+ mostDamage: numberRecord((0, common_1.obj)(dragonFight, "most_damage")),
537
+ highestRank: numberRecord((0, common_1.obj)(dragonFight, "highest_rank")),
538
+ fastestKill: numberRecord((0, common_1.obj)(dragonFight, "fastest_kill")),
539
+ amountSummoned: numberRecord((0, common_1.obj)(dragonFight, "amount_summoned")),
540
+ summoningEyesContributed: numberRecord((0, common_1.obj)(dragonFight, "summoning_eyes_contributed")),
541
+ },
542
+ },
543
+ spooky: {
544
+ batsSpawned: numberRecord((0, common_1.obj)(spooky, "bats_spawned")),
545
+ },
546
+ rift: raceRecord((0, common_1.obj)(playerStats, "rift")),
547
+ shardCombatHunts: (0, common_1.num)(playerStats, "shard_combat_hunts"),
548
+ shardFishingHunts: (0, common_1.num)(playerStats, "shard_fishing_hunts"),
549
+ shardTrapHunts: (0, common_1.num)(playerStats, "shard_trap_hunts"),
550
+ shardForestHunts: (0, common_1.num)(playerStats, "shard_forest_hunts"),
551
+ shardSaltHunts: (0, common_1.num)(playerStats, "shard_salt_hunts"),
552
+ uniqueShards: (0, common_1.num)(playerStats, "unique_shards"),
553
+ races: raceRecord((0, common_1.obj)(playerStats, "races")),
554
+ pets: numberRecord((0, common_1.obj)(playerStats, "pets")),
555
+ };
556
+ }
557
+ function parseJacobContests(member) {
558
+ const jacob = (0, common_1.obj)(member, "jacobs_contest");
559
+ const perks = (0, common_1.obj)(jacob, "perks");
560
+ return {
561
+ medalsInventory: numberRecord((0, common_1.obj)(jacob, "medals_inv")),
562
+ perks: {
563
+ doubleDrops: (0, common_1.num)(perks, "double_drops"),
564
+ farmingLevelCap: (0, common_1.num)(perks, "farming_level_cap"),
565
+ personalBests: (0, common_1.bool)(perks, "personal_bests"),
566
+ },
567
+ uniqueBrackets: stringArrayRecord((0, common_1.obj)(jacob, "unique_brackets")),
568
+ personalBests: numberRecord((0, common_1.obj)(jacob, "personal_bests")),
569
+ talkedToJacob: (0, common_1.bool)(jacob, "talked"),
570
+ migration: (0, common_1.bool)(jacob, "migration"),
571
+ contests: recordOf((0, common_1.obj)(jacob, "contests"), (contest) => ({
572
+ collected: (0, common_1.num)(contest, "collected"),
573
+ claimedRewards: (0, common_1.bool)(contest, "claimed_rewards"),
574
+ claimedPosition: (0, common_1.num)(contest, "claimed_position"),
575
+ claimedParticipants: (0, common_1.num)(contest, "claimed_participants"),
576
+ claimedMedal: (0, common_1.str)(contest, "claimed_medal"),
577
+ })),
578
+ };
579
+ }
580
+ function parseTuningSlots(tuning) {
581
+ const result = {};
582
+ for (const key of Object.keys(tuning)) {
583
+ if (key.startsWith("slot_")) {
584
+ result[key] = numberRecord((0, common_1.obj)(tuning, key));
585
+ }
586
+ }
587
+ return result;
588
+ }
589
+ function parseAccessoryBag(member) {
590
+ const storage = (0, common_1.obj)(member, "accessory_bag_storage");
591
+ const tuning = (0, common_1.obj)(storage, "tuning");
592
+ const selectedPower = storage.selected_power;
593
+ return {
594
+ selectedPower: typeof selectedPower === "string" ? selectedPower : null,
595
+ unlockedPowers: stringArray(storage, "unlocked_powers"),
596
+ bagUpgradesPurchased: (0, common_1.num)(storage, "bag_upgrades_purchased"),
597
+ highestMagicalPower: (0, common_1.num)(storage, "highest_magical_power"),
598
+ highestUnlockedTuningSlot: (0, common_1.num)(tuning, "highest_unlocked_slot"),
599
+ tuningSlots: parseTuningSlots(tuning),
600
+ };
601
+ }
602
+ function parseBestiary(member) {
603
+ const bestiary = (0, common_1.obj)(member, "bestiary");
604
+ return {
605
+ migration: (0, common_1.bool)(bestiary, "migration"),
606
+ migratedStats: (0, common_1.bool)(bestiary, "migrated_stats"),
607
+ lastClaimedMilestone: (0, common_1.num)((0, common_1.obj)(bestiary, "milestone"), "last_claimed_milestone"),
608
+ maxKillsVisible: (0, common_1.bool)((0, common_1.obj)(bestiary, "miscellaneous"), "max_kills_visible"),
609
+ kills: numberRecord((0, common_1.obj)(bestiary, "kills")),
610
+ deaths: numberRecord((0, common_1.obj)(bestiary, "deaths")),
611
+ };
612
+ }
613
+ function parseGarden(member) {
614
+ const garden = (0, common_1.obj)(member, "garden_player_data");
615
+ return {
616
+ copper: (0, common_1.num)(garden, "copper"),
617
+ larvaConsumed: (0, common_1.num)(garden, "larva_consumed"),
618
+ analyzedGreenhouseCrops: stringArray(garden, "analyzed_greenhouse_crops"),
619
+ discoveredGreenhouseCrops: stringArray(garden, "discovered_greenhouse_crops"),
620
+ farmingToolkit: parseToolkit((0, common_1.obj)(garden, "farming_toolkit")),
621
+ };
622
+ }
623
+ function parseMiningBiomes(biomes) {
624
+ const precursor = (0, common_1.obj)(biomes, "precursor");
625
+ const dwarven = (0, common_1.obj)(biomes, "dwarven");
626
+ const goblin = (0, common_1.obj)(biomes, "goblin");
627
+ return {
628
+ precursor: { partsDelivered: stringArray(precursor, "parts_delivered") },
629
+ dwarven: { statuesPlaced: stringRecord((0, common_1.obj)(dwarven, "statues_placed")) },
630
+ goblin: {
631
+ kingQuestActive: (0, common_1.bool)(goblin, "king_quest_active"),
632
+ kingQuestsCompleted: (0, common_1.num)(goblin, "king_quests_completed"),
633
+ },
634
+ };
635
+ }
636
+ function parseMiningCore(member) {
637
+ const miningCore = (0, common_1.obj)(member, "mining_core");
638
+ return {
639
+ experience: (0, common_1.num)(miningCore, "experience"),
640
+ tokens: (0, common_1.num)(miningCore, "tokens"),
641
+ tokensSpent: (0, common_1.num)(miningCore, "tokens_spent"),
642
+ receivedFreeTier: (0, common_1.bool)(miningCore, "received_free_tier"),
643
+ powderMithril: (0, common_1.num)(miningCore, "powder_mithril"),
644
+ powderMithrilTotal: (0, common_1.num)(miningCore, "powder_mithril_total"),
645
+ powderSpentMithril: (0, common_1.num)(miningCore, "powder_spent_mithril"),
646
+ powderGemstone: (0, common_1.num)(miningCore, "powder_gemstone"),
647
+ powderGemstoneTotal: (0, common_1.num)(miningCore, "powder_gemstone_total"),
648
+ powderSpentGemstone: (0, common_1.num)(miningCore, "powder_spent_gemstone"),
649
+ powderGlacite: (0, common_1.num)(miningCore, "powder_glacite"),
650
+ powderGlaciteTotal: (0, common_1.num)(miningCore, "powder_glacite_total"),
651
+ powderSpentGlacite: (0, common_1.num)(miningCore, "powder_spent_glacite"),
652
+ selectedPickaxeAbility: (0, common_1.str)(miningCore, "selected_pickaxe_ability"),
653
+ dailyEffect: (0, common_1.str)(miningCore, "current_daily_effect"),
654
+ dailyEffectLastChanged: (0, common_1.num)(miningCore, "current_daily_effect_last_changed"),
655
+ retroactiveTier2Token: (0, common_1.bool)(miningCore, "retroactive_tier2_token"),
656
+ dailyOresMined: (0, common_1.num)(miningCore, "daily_ores_mined"),
657
+ dailyOresMinedDay: (0, common_1.num)(miningCore, "daily_ores_mined_day"),
658
+ dailyOresMinedMithrilOre: (0, common_1.num)(miningCore, "daily_ores_mined_mithril_ore"),
659
+ dailyOresMinedDayMithrilOre: (0, common_1.num)(miningCore, "daily_ores_mined_day_mithril_ore"),
660
+ dailyOresMinedGemstone: (0, common_1.num)(miningCore, "daily_ores_mined_gemstone"),
661
+ dailyOresMinedDayGemstone: (0, common_1.num)(miningCore, "daily_ores_mined_day_gemstone"),
662
+ dailyOresMinedGlacite: (0, common_1.num)(miningCore, "daily_ores_mined_glacite"),
663
+ dailyOresMinedDayGlacite: (0, common_1.num)(miningCore, "daily_ores_mined_day_glacite"),
664
+ greaterMinesLastAccess: (0, common_1.num)(miningCore, "greater_mines_last_access"),
665
+ nodes: numberBooleanRecord((0, common_1.obj)(miningCore, "nodes")),
666
+ crystals: recordOf((0, common_1.obj)(miningCore, "crystals"), (crystal) => ({
667
+ state: (0, common_1.str)(crystal, "state"),
668
+ totalPlaced: (0, common_1.num)(crystal, "total_placed"),
669
+ totalFound: (0, common_1.num)(crystal, "total_found"),
670
+ })),
671
+ biomes: parseMiningBiomes((0, common_1.obj)(miningCore, "biomes")),
672
+ };
673
+ }
674
+ function parseForge(member) {
675
+ const forge = (0, common_1.obj)(member, "forge");
676
+ return {
677
+ forgeProcesses: recordOf((0, common_1.obj)(forge, "forge_processes"), (slots) => recordOf(slots, (process) => ({
678
+ type: (0, common_1.str)(process, "type"),
679
+ id: (0, common_1.str)(process, "id"),
680
+ startTime: (0, common_1.num)(process, "startTime"),
681
+ slot: (0, common_1.num)(process, "slot"),
682
+ notified: (0, common_1.bool)(process, "notified"),
683
+ oldItem: typeof process.oldItem === "string" ? process.oldItem : null,
684
+ }))),
685
+ };
686
+ }
687
+ function parseGlacitePlayerData(member) {
688
+ const glacite = (0, common_1.obj)(member, "glacite_player_data");
689
+ return {
690
+ fossilsDonated: stringArray(glacite, "fossils_donated"),
691
+ fossilDust: (0, common_1.num)(glacite, "fossil_dust"),
692
+ corpsesLooted: numberRecord((0, common_1.obj)(glacite, "corpses_looted")),
693
+ mineshaftsEntered: (0, common_1.num)(glacite, "mineshafts_entered"),
694
+ };
695
+ }
696
+ function parsePet(pet) {
697
+ const uuid = pet.uuid;
698
+ const uniqueId = pet.uniqueId;
699
+ const heldItem = pet.heldItem;
700
+ const heldItemUuid = pet.heldItemUuid;
701
+ const skin = pet.skin;
702
+ return {
703
+ uuid: typeof uuid === "string" ? uuid : null,
704
+ uniqueId: typeof uniqueId === "string" ? uniqueId : null,
705
+ type: (0, common_1.str)(pet, "type"),
706
+ experience: (0, common_1.num)(pet, "exp"),
707
+ active: (0, common_1.bool)(pet, "active"),
708
+ tier: (0, common_1.str)(pet, "tier"),
709
+ heldItem: typeof heldItem === "string" ? heldItem : null,
710
+ heldItemUuid: typeof heldItemUuid === "string" ? heldItemUuid : null,
711
+ candyUsed: (0, common_1.num)(pet, "candyUsed"),
712
+ soulbound: (0, common_1.bool)(pet, "petSoulbound"),
713
+ skin: typeof skin === "string" ? skin : null,
714
+ extra: numberRecord((0, common_1.obj)(pet, "extra")),
715
+ };
716
+ }
717
+ function parseAutopetRule(rule) {
718
+ return {
719
+ uuid: (0, common_1.str)(rule, "uuid"),
720
+ id: (0, common_1.str)(rule, "id"),
721
+ name: (0, common_1.str)(rule, "name"),
722
+ uniqueId: (0, common_1.str)(rule, "uniqueId"),
723
+ exceptions: objectArray(rule, "exceptions").map((exception) => ({
724
+ id: (0, common_1.str)(exception, "id"),
725
+ data: scalarRecord((0, common_1.obj)(exception, "data")),
726
+ })),
727
+ disabled: (0, common_1.bool)(rule, "disabled"),
728
+ data: scalarRecord((0, common_1.obj)(rule, "data")),
729
+ };
730
+ }
731
+ function parsePets(member) {
732
+ const petsData = (0, common_1.obj)(member, "pets_data");
733
+ const petCare = (0, common_1.obj)(petsData, "pet_care");
734
+ const autopet = (0, common_1.obj)(petsData, "autopet");
735
+ return {
736
+ pets: objectArray(petsData, "pets").map(parsePet),
737
+ coinsSpentOnPetCare: (0, common_1.num)(petCare, "coins_spent"),
738
+ sacrificedPetTypes: stringArray(petCare, "pet_types_sacrificed"),
739
+ autopetRulesLimit: (0, common_1.num)(autopet, "rules_limit"),
740
+ autopetRules: objectArray(autopet, "rules").map(parseAutopetRule),
741
+ autopetMigrated: (0, common_1.bool)(autopet, "migrated"),
742
+ autopetMigrated2: (0, common_1.bool)(autopet, "migrated_2"),
743
+ };
744
+ }
745
+ function parseChocolateFactory(member) {
746
+ const easter = (0, common_1.obj)((0, common_1.obj)(member, "events"), "easter");
747
+ const timeTower = (0, common_1.obj)(easter, "time_tower");
748
+ const hitmen = (0, common_1.obj)(easter, "rabbit_hitmen");
749
+ const shop = (0, common_1.obj)(easter, "shop");
750
+ const rabbits = (0, common_1.obj)(easter, "rabbits");
751
+ const collectedEggs = (0, common_1.obj)(rabbits, "collected_eggs");
752
+ const found = {};
753
+ for (const key of Object.keys(rabbits)) {
754
+ if (key === "collected_eggs" || key === "collected_locations") {
755
+ continue;
756
+ }
757
+ const value = rabbits[key];
758
+ if (typeof value === "number") {
759
+ found[key] = value;
760
+ }
761
+ }
762
+ return {
763
+ chocolate: (0, common_1.num)(easter, "chocolate"),
764
+ chocolateSincePrestige: (0, common_1.num)(easter, "chocolate_since_prestige"),
765
+ totalChocolate: (0, common_1.num)(easter, "total_chocolate"),
766
+ prestigeLevel: (0, common_1.num)(easter, "chocolate_level"),
767
+ barnCapacityLevel: (0, common_1.num)(easter, "rabbit_barn_capacity_level"),
768
+ supremeChocolateBars: (0, common_1.num)(easter, "supreme_chocolate_bars"),
769
+ refinedDarkCacaoTruffles: (0, common_1.num)(easter, "refined_dark_cacao_truffles"),
770
+ rabbitSort: (0, common_1.str)(easter, "rabbit_sort"),
771
+ rabbitFilter: (0, common_1.str)(easter, "rabbit_filter"),
772
+ lastViewed: (0, common_1.num)(easter, "last_viewed_chocolate_factory"),
773
+ employees: numberRecord((0, common_1.obj)(easter, "employees")),
774
+ upgrades: {
775
+ clickUpgrades: (0, common_1.num)(easter, "click_upgrades"),
776
+ chocolateMultiplierUpgrades: (0, common_1.num)(easter, "chocolate_multiplier_upgrades"),
777
+ rabbitRarityUpgrades: (0, common_1.num)(easter, "rabbit_rarity_upgrades"),
778
+ },
779
+ timeTower: {
780
+ charges: (0, common_1.num)(timeTower, "charges"),
781
+ level: (0, common_1.num)(timeTower, "level"),
782
+ activationTime: (0, common_1.num)(timeTower, "activation_time"),
783
+ lastChargeTime: (0, common_1.num)(timeTower, "last_charge_time"),
784
+ },
785
+ rabbitHitmen: {
786
+ rabbitHitmenSlots: (0, common_1.num)(hitmen, "rabbit_hitmen_slots"),
787
+ missedUncollectedEggs: (0, common_1.num)(hitmen, "missed_uncollected_eggs"),
788
+ eggSlotCooldownMark: (0, common_1.num)(hitmen, "egg_slot_cooldown_mark"),
789
+ eggSlotCooldownSum: (0, common_1.num)(hitmen, "egg_slot_cooldown_sum"),
790
+ },
791
+ rabbits: {
792
+ collectedEggs: {
793
+ breakfast: (0, common_1.num)(collectedEggs, "breakfast"),
794
+ lunch: (0, common_1.num)(collectedEggs, "lunch"),
795
+ dinner: (0, common_1.num)(collectedEggs, "dinner"),
796
+ brunch: (0, common_1.num)(collectedEggs, "brunch"),
797
+ dejeuner: (0, common_1.num)(collectedEggs, "dejeuner"),
798
+ supper: (0, common_1.num)(collectedEggs, "supper"),
799
+ },
800
+ collectedLocations: stringArrayRecord((0, common_1.obj)(rabbits, "collected_locations")),
801
+ found,
802
+ },
803
+ shop: {
804
+ year: (0, common_1.num)(shop, "year"),
805
+ rabbits: stringArray(shop, "rabbits"),
806
+ chocolateSpent: (0, common_1.num)(shop, "chocolate_spent"),
807
+ cocoaFortuneUpgrades: (0, common_1.num)(shop, "cocoa_fortune_upgrades"),
808
+ rabbitsPurchased: stringArray(shop, "rabbits_purchased"),
809
+ },
810
+ };
811
+ }
812
+ function parseAbiphone(abiphone) {
813
+ return {
814
+ contactData: recordOf((0, common_1.obj)(abiphone, "contact_data"), (contact) => ({
815
+ talkedTo: (0, common_1.bool)(contact, "talked_to"),
816
+ completedQuest: (0, common_1.bool)(contact, "completed_quest"),
817
+ incomingCallsCount: (0, common_1.num)(contact, "incoming_calls_count"),
818
+ lastCallIncoming: (0, common_1.num)(contact, "last_call_incoming"),
819
+ })),
820
+ activeContacts: stringArray(abiphone, "active_contacts"),
821
+ selectedRingtone: (0, common_1.str)(abiphone, "selected_ringtone"),
822
+ selectedSort: (0, common_1.str)(abiphone, "selected_sort"),
823
+ games: numberRecord((0, common_1.obj)(abiphone, "games")),
824
+ operatorChip: numberRecord((0, common_1.obj)(abiphone, "operator_chip")),
825
+ trioContactAddons: (0, common_1.num)(abiphone, "trio_contact_addons"),
826
+ hasUsedSiriusPersonalPhoneNumberItem: (0, common_1.bool)(abiphone, "has_used_sirius_personal_phone_number_item"),
827
+ lastDyeCalledYear: (0, common_1.num)(abiphone, "last_dye_called_year"),
828
+ };
829
+ }
830
+ function parseKuudraPartyFinder(partyFinder) {
831
+ const search = (0, common_1.obj)(partyFinder, "search_settings");
832
+ const builder = (0, common_1.obj)(partyFinder, "group_builder");
833
+ return {
834
+ searchTier: (0, common_1.str)(search, "tier"),
835
+ groupBuildTier: (0, common_1.str)(builder, "tier"),
836
+ groupBuildNote: (0, common_1.str)(builder, "note"),
837
+ groupBuildRequiredCombatLevel: (0, common_1.num)(builder, "combat_level_required"),
838
+ };
839
+ }
840
+ function parseCrimsonIsleQuests(quests) {
841
+ const chickenQuest = (0, common_1.obj)(quests, "chicken_quest");
842
+ return {
843
+ questData: recordOf((0, common_1.obj)(quests, "quest_data"), (entry) => ({
844
+ status: (0, common_1.str)(entry, "status"),
845
+ progress: (0, common_1.num)(entry, "progress"),
846
+ completedAt: (0, common_1.num)(entry, "completed_at"),
847
+ })),
848
+ minibossKills: booleanRecord((0, common_1.obj)(quests, "miniboss_data")),
849
+ minibossDaily: scalarRecord((0, common_1.obj)(quests, "miniboss_daily")),
850
+ kuudraBossDaily: scalarRecord((0, common_1.obj)(quests, "kuuda_boss_daily")),
851
+ questRewards: scalarRecord((0, common_1.obj)(quests, "quest_rewards")),
852
+ alchemistQuest: scalarRecord((0, common_1.obj)(quests, "alchemist_quest")),
853
+ rulenor: scalarRecord((0, common_1.obj)(quests, "rulenor")),
854
+ chickenQuest: {
855
+ start: (0, common_1.bool)(chickenQuest, "chicken_quest_start"),
856
+ progress: (0, common_1.num)(chickenQuest, "chicken_quest_progress"),
857
+ collected: stringArray(chickenQuest, "chicken_quest_collected"),
858
+ },
859
+ pomtairQuest: scalarRecord((0, common_1.obj)(quests, "pomtair_quest")),
860
+ suusQuest: scalarRecord((0, common_1.obj)(quests, "suus_quest")),
861
+ pabloQuest: scalarRecord((0, common_1.obj)(quests, "pablo_quest")),
862
+ duelTrainingQuest: scalarRecord((0, common_1.obj)(quests, "duel_training_quest")),
863
+ sirihQuest: scalarRecord((0, common_1.obj)(quests, "sirih_quest")),
864
+ edelisQuest: scalarRecord((0, common_1.obj)(quests, "edelis_quest")),
865
+ mollimQuest: scalarRecord((0, common_1.obj)(quests, "mollim_quest")),
866
+ aranyaQuest: scalarRecord((0, common_1.obj)(quests, "aranya_quest")),
867
+ lastReset: (0, common_1.num)(quests, "last_reset"),
868
+ paidBruuh: (0, common_1.bool)(quests, "paid_bruuh"),
869
+ chickenQuestHandedIn: (0, common_1.num)(quests, "chicken_quest_handed_in"),
870
+ foundKuudraBook: (0, common_1.bool)(quests, "found_kuudra_book"),
871
+ foundKuudraLeggings: (0, common_1.bool)(quests, "found_kuudra_leggings"),
872
+ foundKuudraBoots: (0, common_1.bool)(quests, "found_kuudra_boots"),
873
+ foundKuudraChestplate: (0, common_1.bool)(quests, "found_kuudra_chestplate"),
874
+ lastKuudraRelic: (0, common_1.num)(quests, "last_kuudra_relic"),
875
+ kuudraLoremaster: (0, common_1.bool)(quests, "kuudra_loremaster"),
876
+ };
877
+ }
878
+ function parseCrimsonIsle(member) {
879
+ const isle = (0, common_1.obj)(member, "nether_island_player_data");
880
+ const matriarch = (0, common_1.obj)(isle, "matriarch");
881
+ return {
882
+ selectedFaction: (0, common_1.str)(isle, "selected_faction"),
883
+ magesReputation: (0, common_1.num)(isle, "mages_reputation"),
884
+ magesReputationHighest: (0, common_1.num)(isle, "mages_reputation_highest"),
885
+ barbariansReputation: (0, common_1.num)(isle, "barbarians_reputation"),
886
+ barbariansReputationHighest: (0, common_1.num)(isle, "barbarians_reputation_highest"),
887
+ lastMinibossesKilled: stringArray(isle, "last_minibosses_killed"),
888
+ kuudraCompletedTiers: numberRecord((0, common_1.obj)(isle, "kuudra_completed_tiers")),
889
+ kuudraPartyFinder: parseKuudraPartyFinder((0, common_1.obj)(isle, "kuudra_party_finder")),
890
+ dojo: numberRecord((0, common_1.obj)(isle, "dojo")),
891
+ abiphone: parseAbiphone((0, common_1.obj)(isle, "abiphone")),
892
+ matriarch: {
893
+ pearlsCollected: (0, common_1.num)(matriarch, "pearls_collected"),
894
+ lastAttempt: (0, common_1.num)(matriarch, "last_attempt"),
895
+ recentRefreshes: numberArray(matriarch, "recent_refreshes"),
896
+ },
897
+ quests: parseCrimsonIsleQuests((0, common_1.obj)(isle, "quests")),
898
+ };
899
+ }
900
+ function parseTrophyFish(member) {
901
+ const trophyFish = (0, common_1.obj)(member, "trophy_fish");
902
+ return {
903
+ rewards: numberArray(trophyFish, "rewards"),
904
+ totalCaught: (0, common_1.num)(trophyFish, "total_caught"),
905
+ lastCaught: (0, common_1.str)(trophyFish, "last_caught"),
906
+ catches: numberRecord(trophyFish),
907
+ };
908
+ }
909
+ function parseObjectives(member) {
910
+ const objectives = (0, common_1.obj)(member, "objectives");
911
+ const parsed = {};
912
+ for (const key of Object.keys(objectives)) {
913
+ if (key === "tutorial") {
914
+ continue;
915
+ }
916
+ const objective = (0, common_1.obj)(objectives, key);
917
+ parsed[key] = {
918
+ status: (0, common_1.str)(objective, "status"),
919
+ progress: (0, common_1.num)(objective, "progress"),
920
+ completedAt: (0, common_1.num)(objective, "completed_at"),
921
+ };
922
+ }
923
+ return {
924
+ tutorial: stringArray(objectives, "tutorial"),
925
+ objectives: parsed,
926
+ };
927
+ }
928
+ function parseQuests(member) {
929
+ const quests = (0, common_1.obj)(member, "quests");
930
+ const trapper = (0, common_1.obj)(quests, "trapper_quest");
931
+ return {
932
+ trapper: {
933
+ peltCount: (0, common_1.num)(trapper, "pelt_count"),
934
+ lastTaskTime: (0, common_1.num)(trapper, "last_task_time"),
935
+ },
936
+ };
937
+ }
938
+ function parseExperimentation(member) {
939
+ const experimentation = (0, common_1.obj)(member, "experimentation");
940
+ return {
941
+ claimsResets: (0, common_1.num)(experimentation, "claims_resets"),
942
+ claimsResetsTimestamp: (0, common_1.num)(experimentation, "claims_resets_timestamp"),
943
+ serumsDrank: (0, common_1.num)(experimentation, "serums_drank"),
944
+ claimedRetroactiveRng: (0, common_1.bool)(experimentation, "claimed_retroactive_rng"),
945
+ chargeTrackTimestamp: (0, common_1.num)(experimentation, "charge_track_timestamp"),
946
+ pairings: numberRecord((0, common_1.obj)(experimentation, "pairings")),
947
+ simon: numberRecord((0, common_1.obj)(experimentation, "simon")),
948
+ numbers: numberRecord((0, common_1.obj)(experimentation, "numbers")),
949
+ };
950
+ }
951
+ function parseRiftVillagePlaza(plaza) {
952
+ const murder = (0, common_1.obj)(plaza, "murder");
953
+ const barry = (0, common_1.obj)(plaza, "barry_center");
954
+ const cowboy = (0, common_1.obj)(plaza, "cowboy");
955
+ return {
956
+ murder: {
957
+ stepIndex: (0, common_1.num)(murder, "step_index"),
958
+ roomClues: stringArray(murder, "room_clues"),
959
+ stepIndexPt2: (0, common_1.num)(murder, "step_index_pt2"),
960
+ stepIndexPt3: (0, common_1.num)(murder, "step_index_pt3"),
961
+ },
962
+ barry: {
963
+ firstTalkToBarry: (0, common_1.bool)(barry, "first_talk_to_barry"),
964
+ convinced: stringArray(barry, "convinced"),
965
+ receivedReward: (0, common_1.bool)(barry, "received_reward"),
966
+ },
967
+ cowboy: {
968
+ stage: (0, common_1.num)(cowboy, "stage"),
969
+ hayEaten: (0, common_1.num)(cowboy, "hay_eaten"),
970
+ rabbitName: (0, common_1.str)(cowboy, "rabbit_name"),
971
+ },
972
+ barterBank: scalarRecord((0, common_1.obj)(plaza, "barter_bank")),
973
+ lonely: scalarRecord((0, common_1.obj)(plaza, "lonely")),
974
+ seraphine: scalarRecord((0, common_1.obj)(plaza, "seraphine")),
975
+ gotScammed: (0, common_1.bool)(plaza, "got_scammed"),
976
+ };
977
+ }
978
+ function parseRiftWestVillage(west) {
979
+ const crazyKloon = (0, common_1.obj)(west, "crazy_kloon");
980
+ const mirrorverse = (0, common_1.obj)(west, "mirrorverse");
981
+ const katHouse = (0, common_1.obj)(west, "kat_house");
982
+ const glyphs = (0, common_1.obj)(west, "glyphs");
983
+ return {
984
+ crazyKloon: {
985
+ selectedColors: stringRecord((0, common_1.obj)(crazyKloon, "selected_colors")),
986
+ talked: (0, common_1.bool)(crazyKloon, "talked"),
987
+ hackedTerminals: stringArray(crazyKloon, "hacked_terminals"),
988
+ questComplete: (0, common_1.bool)(crazyKloon, "quest_complete"),
989
+ },
990
+ mirrorverse: {
991
+ visitedRooms: stringArray(mirrorverse, "visited_rooms"),
992
+ upsideDownHard: (0, common_1.bool)(mirrorverse, "upside_down_hard"),
993
+ claimedChestItems: stringArray(mirrorverse, "claimed_chest_items"),
994
+ claimedReward: (0, common_1.bool)(mirrorverse, "claimed_reward"),
995
+ },
996
+ katHouse: {
997
+ binCollectedSilverfish: (0, common_1.num)(katHouse, "bin_collected_silverfish"),
998
+ binCollectedSpider: (0, common_1.num)(katHouse, "bin_collected_spider"),
999
+ binCollectedMosquito: (0, common_1.num)(katHouse, "bin_collected_mosquito"),
1000
+ },
1001
+ glyphs: {
1002
+ claimedWand: (0, common_1.bool)(glyphs, "claimed_wand"),
1003
+ currentGlyphDelivered: (0, common_1.bool)(glyphs, "current_glyph_delivered"),
1004
+ currentGlyphCompleted: (0, common_1.bool)(glyphs, "current_glyph_completed"),
1005
+ currentGlyph: (0, common_1.num)(glyphs, "current_glyph"),
1006
+ completed: (0, common_1.bool)(glyphs, "completed"),
1007
+ claimedBracelet: (0, common_1.bool)(glyphs, "claimed_bracelet"),
1008
+ },
1009
+ };
1010
+ }
1011
+ function parseRift(member) {
1012
+ const rift = (0, common_1.obj)(member, "rift");
1013
+ const riftInventory = (0, common_1.obj)(rift, "inventory");
1014
+ const access = (0, common_1.obj)(rift, "access");
1015
+ const witherCage = (0, common_1.obj)(rift, "wither_cage");
1016
+ const blackLagoon = (0, common_1.obj)(rift, "black_lagoon");
1017
+ const deadCats = (0, common_1.obj)(rift, "dead_cats");
1018
+ const wizardTower = (0, common_1.obj)(rift, "wizard_tower");
1019
+ const enigma = (0, common_1.obj)(rift, "enigma");
1020
+ const gallery = (0, common_1.obj)(rift, "gallery");
1021
+ const castle = (0, common_1.obj)(rift, "castle");
1022
+ const wyldWoods = (0, common_1.obj)(rift, "wyld_woods");
1023
+ const dreadFarm = (0, common_1.obj)(rift, "dreadfarm");
1024
+ return {
1025
+ access: {
1026
+ lastFree: (0, common_1.num)(access, "last_free"),
1027
+ chargeTrackTimestamp: (0, common_1.num)(access, "charge_track_timestamp"),
1028
+ },
1029
+ villagePlaza: parseRiftVillagePlaza((0, common_1.obj)(rift, "village_plaza")),
1030
+ witherCage: { killedEyes: stringArray(witherCage, "killed_eyes") },
1031
+ blackLagoon: {
1032
+ talkedToEdwin: (0, common_1.bool)(blackLagoon, "talked_to_edwin"),
1033
+ receivedSciencePaper: (0, common_1.bool)(blackLagoon, "received_science_paper"),
1034
+ deliveredSciencePaper: (0, common_1.bool)(blackLagoon, "delivered_science_paper"),
1035
+ completedStep: (0, common_1.num)(blackLagoon, "completed_step"),
1036
+ },
1037
+ deadCats: {
1038
+ talkedToJacquelle: (0, common_1.bool)(deadCats, "talked_to_jacquelle"),
1039
+ pickedUpDetector: (0, common_1.bool)(deadCats, "picked_up_detector"),
1040
+ foundCats: stringArray(deadCats, "found_cats"),
1041
+ unlockedPet: (0, common_1.bool)(deadCats, "unlocked_pet"),
1042
+ montezuma: parsePet((0, common_1.obj)(deadCats, "montezuma")),
1043
+ },
1044
+ wizardTower: {
1045
+ wizardQuestStep: (0, common_1.num)(wizardTower, "wizard_quest_step"),
1046
+ crumbsLaidOut: (0, common_1.num)(wizardTower, "crumbs_laid_out"),
1047
+ },
1048
+ enigma: {
1049
+ boughtCloak: (0, common_1.bool)(enigma, "bought_cloak"),
1050
+ foundSouls: stringArray(enigma, "found_souls"),
1051
+ claimedBonusIndex: (0, common_1.num)(enigma, "claimed_bonus_index"),
1052
+ },
1053
+ gallery: {
1054
+ eliseStep: (0, common_1.num)(gallery, "elise_step"),
1055
+ sentTrophyDialogues: stringArray(gallery, "sent_trophy_dialogues"),
1056
+ securedTrophies: objectArray(gallery, "secured_trophies").map((trophy) => ({
1057
+ type: (0, common_1.str)(trophy, "type"),
1058
+ timestamp: (0, common_1.num)(trophy, "timestamp"),
1059
+ visits: (0, common_1.num)(trophy, "visits"),
1060
+ })),
1061
+ },
1062
+ castle: {
1063
+ unlockedPathwaySkip: (0, common_1.bool)(castle, "unlocked_pathway_skip"),
1064
+ fairyStep: (0, common_1.num)(castle, "fairy_step"),
1065
+ },
1066
+ westVillage: parseRiftWestVillage((0, common_1.obj)(rift, "west_village")),
1067
+ wyldWoods: {
1068
+ siriusStartedQA: (0, common_1.bool)(wyldWoods, "sirius_started_q_a"),
1069
+ bughunterStep: (0, common_1.num)(wyldWoods, "bughunter_step"),
1070
+ siriusQAChainDone: (0, common_1.bool)(wyldWoods, "sirius_q_a_chain_done"),
1071
+ talkedThreebrothers: stringArray(wyldWoods, "talked_threebrothers"),
1072
+ siriusCompletedQA: (0, common_1.bool)(wyldWoods, "sirius_completed_q_a"),
1073
+ siriusClaimedDoubloon: (0, common_1.bool)(wyldWoods, "sirius_claimed_doubloon"),
1074
+ },
1075
+ dreadFarm: {
1076
+ shaniaStage: (0, common_1.num)(dreadFarm, "shania_stage"),
1077
+ caducousFeederUses: numberArray(dreadFarm, "caducous_feeder_uses"),
1078
+ },
1079
+ lifetimePurchasedBoundaries: stringArray(rift, "lifetime_purchased_boundaries"),
1080
+ inventory: inventory(riftInventory, "inv_contents"),
1081
+ enderChest: inventory(riftInventory, "ender_chest_contents"),
1082
+ enderChestPageIcons: Array.isArray(riftInventory.ender_chest_page_icons)
1083
+ ? riftInventory.ender_chest_page_icons.map((icon) => typeof icon === "object" && icon !== null && !Array.isArray(icon)
1084
+ ? decodeInventory(icon)
1085
+ : null)
1086
+ : [],
1087
+ armor: inventory(riftInventory, "inv_armor"),
1088
+ equipment: inventory(riftInventory, "equipment_contents"),
1089
+ };
1090
+ }
1091
+ function parseSkillTree(member) {
1092
+ const skillTree = (0, common_1.obj)(member, "skill_tree");
1093
+ const nodes = (0, common_1.obj)(skillTree, "nodes");
1094
+ const selectedAbility = (0, common_1.obj)(skillTree, "selected_ability");
1095
+ const tokensSpent = (0, common_1.obj)(skillTree, "tokens_spent");
1096
+ const experience = (0, common_1.obj)(skillTree, "experience");
1097
+ const lastReset = (0, common_1.obj)(skillTree, "last_reset");
1098
+ return {
1099
+ nodes: {
1100
+ mining: numberBooleanRecord((0, common_1.obj)(nodes, "mining")),
1101
+ foraging: numberBooleanRecord((0, common_1.obj)(nodes, "foraging")),
1102
+ },
1103
+ selectedAbility: {
1104
+ mining: (0, common_1.str)(selectedAbility, "mining"),
1105
+ foraging: (0, common_1.str)(selectedAbility, "foraging"),
1106
+ },
1107
+ tokensSpent: {
1108
+ mountain: (0, common_1.num)(tokensSpent, "mountain"),
1109
+ forest: (0, common_1.num)(tokensSpent, "forest"),
1110
+ },
1111
+ experience: {
1112
+ mining: (0, common_1.num)(experience, "mining"),
1113
+ foraging: (0, common_1.num)(experience, "foraging"),
1114
+ },
1115
+ lastReset: {
1116
+ mining: (0, common_1.num)(lastReset, "mining"),
1117
+ foraging: (0, common_1.num)(lastReset, "foraging"),
1118
+ },
1119
+ refundAbilityFree: (0, common_1.bool)(skillTree, "refund_ability_free"),
1120
+ };
1121
+ }
1122
+ function parseInventories(member) {
1123
+ const inventories = (0, common_1.obj)(member, "inventory");
1124
+ const sharedInventory = (0, common_1.obj)(member, "shared_inventory");
1125
+ const bagContents = (0, common_1.obj)(inventories, "bag_contents");
1126
+ return {
1127
+ inventory: inventory(inventories, "inv_contents"),
1128
+ armor: inventory(inventories, "inv_armor"),
1129
+ equipment: inventory(inventories, "equipment_contents"),
1130
+ enderChest: inventory(inventories, "ender_chest_contents"),
1131
+ personalVault: inventory(inventories, "personal_vault_contents"),
1132
+ wardrobe: inventory(inventories, "wardrobe_contents"),
1133
+ wardrobeEquippedSlot: (0, common_1.num)(inventories, "wardrobe_equipped_slot"),
1134
+ talismanBag: inventory(bagContents, "talisman_bag"),
1135
+ potionBag: inventory(bagContents, "potion_bag"),
1136
+ fishingBag: inventory(bagContents, "fishing_bag"),
1137
+ sacksBag: inventory(bagContents, "sacks_bag"),
1138
+ quiver: inventory(bagContents, "quiver"),
1139
+ candyInventory: inventory(sharedInventory, "candy_inventory_contents"),
1140
+ carnivalMaskInventory: inventory(sharedInventory, "carnival_mask_inventory_contents"),
1141
+ backpackContents: inventoryRecord((0, common_1.obj)(inventories, "backpack_contents")),
1142
+ backpackIcons: inventoryRecord((0, common_1.obj)(inventories, "backpack_icons")),
1143
+ sacksCounts: numberRecord((0, common_1.obj)(inventories, "sacks_counts")),
1144
+ };
1145
+ }
1146
+ function parseHarpSongs(harp) {
1147
+ const songs = {};
1148
+ for (const key of Object.keys(harp)) {
1149
+ if (key.startsWith("song_")) {
1150
+ const value = harp[key];
1151
+ if (typeof value === "number") {
1152
+ songs[key] = value;
1153
+ }
1154
+ }
1155
+ }
1156
+ return {
1157
+ selectedSong: (0, common_1.str)(harp, "selected_song"),
1158
+ selectedSongEpoch: (0, common_1.num)(harp, "selected_song_epoch"),
1159
+ claimedTalisman: (0, common_1.bool)(harp, "claimed_talisman"),
1160
+ songs,
1161
+ };
1162
+ }
1163
+ function parseForaging(member) {
1164
+ const foraging = (0, common_1.obj)(member, "foraging");
1165
+ const hinaTasks = (0, common_1.obj)((0, common_1.obj)(foraging, "hina"), "tasks");
1166
+ const treeGifts = (0, common_1.obj)(foraging, "tree_gifts");
1167
+ const gifts = {};
1168
+ for (const key of Object.keys(treeGifts)) {
1169
+ if (key === "milestone_tier_claimed") {
1170
+ continue;
1171
+ }
1172
+ const value = treeGifts[key];
1173
+ if (typeof value === "number") {
1174
+ gifts[key] = value;
1175
+ }
1176
+ }
1177
+ return {
1178
+ starlyn: {
1179
+ personalBests: numberRecord((0, common_1.obj)((0, common_1.obj)(foraging, "starlyn"), "personal_bests")),
1180
+ },
1181
+ fishFamily: stringArray(foraging, "fish_family"),
1182
+ hina: {
1183
+ tasks: {
1184
+ completedTasks: stringArray(hinaTasks, "completed_tasks"),
1185
+ taskProgress: numberRecord((0, common_1.obj)(hinaTasks, "task_progress")),
1186
+ claimedRewards: stringArray(hinaTasks, "claimed_rewards"),
1187
+ tierClaimed: (0, common_1.num)(hinaTasks, "tier_claimed"),
1188
+ },
1189
+ },
1190
+ treeGifts: {
1191
+ gifts,
1192
+ milestoneTierClaimed: numberRecord((0, common_1.obj)(treeGifts, "milestone_tier_claimed")),
1193
+ },
1194
+ songs: { harp: parseHarpSongs((0, common_1.obj)((0, common_1.obj)(foraging, "songs"), "harp")) },
1195
+ huntingToolkit: parseToolkit((0, common_1.obj)(foraging, "hunting_toolkit")),
1196
+ };
1197
+ }
1198
+ function parseForagingCore(member) {
1199
+ const core = (0, common_1.obj)(member, "foraging_core");
1200
+ return {
1201
+ dailyTreesCutDay: (0, common_1.num)(core, "daily_trees_cut_day"),
1202
+ dailyTreesCut: (0, common_1.num)(core, "daily_trees_cut"),
1203
+ dailyGifts: (0, common_1.num)(core, "daily_gifts"),
1204
+ dailyLogCutDay: (0, common_1.num)(core, "daily_log_cut_day"),
1205
+ dailyLogCut: stringArray(core, "daily_log_cut"),
1206
+ forestsWhispers: (0, common_1.num)(core, "forests_whispers"),
1207
+ forestsWhispersSpent: (0, common_1.num)(core, "forests_whispers_spent"),
1208
+ currentDailyEffect: (0, common_1.str)(core, "current_daily_effect"),
1209
+ currentDailyEffectLastChanged: (0, common_1.num)(core, "current_daily_effect_last_changed"),
1210
+ };
1211
+ }
1212
+ function parseShards(member) {
1213
+ const shards = (0, common_1.obj)(member, "shards");
1214
+ return {
1215
+ shardSort: (0, common_1.str)(shards, "shard_sort"),
1216
+ fusionResultSort: (0, common_1.str)(shards, "fusion_result_sort"),
1217
+ owned: objectArray(shards, "owned").map((entry) => ({
1218
+ type: (0, common_1.str)(entry, "type"),
1219
+ amountOwned: (0, common_1.num)(entry, "amount_owned"),
1220
+ captured: (0, common_1.num)(entry, "captured"),
1221
+ })),
1222
+ activeTraps: objectArray((0, common_1.obj)(shards, "traps"), "active_traps").map((trap) => ({
1223
+ trapItem: (0, common_1.str)(trap, "trap_item"),
1224
+ captureTime: (0, common_1.num)(trap, "capture_time"),
1225
+ mode: (0, common_1.str)(trap, "mode"),
1226
+ location: (0, common_1.str)(trap, "location"),
1227
+ placedAt: (0, common_1.num)(trap, "placed_at"),
1228
+ shard: (0, common_1.str)(trap, "shard"),
1229
+ captured: (0, common_1.bool)(trap, "captured"),
1230
+ uuid: (0, common_1.str)(trap, "uuid"),
1231
+ })),
1232
+ };
1233
+ }
1234
+ function parseLoadout(member) {
1235
+ const armorRaw = (0, common_1.obj)((0, common_1.obj)(member, "loadout"), "armor");
1236
+ const armor = {};
1237
+ for (const key of Object.keys(armorRaw)) {
1238
+ const set = (0, common_1.obj)(armorRaw, key);
1239
+ const pieces = {};
1240
+ for (const slot of Object.keys(set)) {
1241
+ if (slot === "id") {
1242
+ continue;
1243
+ }
1244
+ const decoded = decodeInventory((0, common_1.obj)(set, slot));
1245
+ if (decoded !== null) {
1246
+ pieces[slot] = decoded;
1247
+ }
1248
+ }
1249
+ armor[key] = { id: (0, common_1.num)(set, "id"), pieces };
1250
+ }
1251
+ return { armor };
1252
+ }
1253
+ function parseMember(member) {
1254
+ return {
1255
+ playerId: (0, common_1.str)(member, "player_id"),
1256
+ currencies: parseCurrencies(member),
1257
+ fairySouls: parseFairySouls(member),
1258
+ leveling: parseLeveling(member),
1259
+ profileStats: parseProfileStats(member),
1260
+ itemData: parseItemData(member),
1261
+ skillExperience: parseSkillExperience((0, common_1.obj)((0, common_1.obj)(member, "player_data"), "experience")),
1262
+ slayers: parseSlayers(member),
1263
+ dungeons: parseDungeons(member),
1264
+ playerData: parsePlayerData(member),
1265
+ playerStats: parsePlayerStats(member),
1266
+ collections: numberRecord((0, common_1.obj)(member, "collection")),
1267
+ jacobContests: parseJacobContests(member),
1268
+ accessoryBag: parseAccessoryBag(member),
1269
+ bestiary: parseBestiary(member),
1270
+ garden: parseGarden(member),
1271
+ miningCore: parseMiningCore(member),
1272
+ forge: parseForge(member),
1273
+ glacitePlayerData: parseGlacitePlayerData(member),
1274
+ pets: parsePets(member),
1275
+ chocolateFactory: parseChocolateFactory(member),
1276
+ crimsonIsle: parseCrimsonIsle(member),
1277
+ trophyFish: parseTrophyFish(member),
1278
+ objectives: parseObjectives(member),
1279
+ quests: parseQuests(member),
1280
+ experimentation: parseExperimentation(member),
1281
+ skillTree: parseSkillTree(member),
1282
+ rift: parseRift(member),
1283
+ inventories: parseInventories(member),
1284
+ foraging: parseForaging(member),
1285
+ foragingCore: parseForagingCore(member),
1286
+ shards: parseShards(member),
1287
+ winterPlayerData: {
1288
+ refinedJyrreUses: (0, common_1.num)((0, common_1.obj)(member, "winter_player_data"), "refined_jyrre_uses"),
1289
+ },
1290
+ temples: {
1291
+ unlockedTemples: stringArray((0, common_1.obj)(member, "temples"), "unlocked_temples"),
1292
+ },
1293
+ attributes: {
1294
+ stacks: numberRecord((0, common_1.obj)((0, common_1.obj)(member, "attributes"), "stacks")),
1295
+ },
1296
+ loadout: parseLoadout(member),
1297
+ };
1298
+ }
1299
+ function parseBanking(profile) {
1300
+ const banking = (0, common_1.obj)(profile, "banking");
1301
+ return {
1302
+ balance: (0, common_1.num)(banking, "balance"),
1303
+ transactions: objectArray(banking, "transactions").map((transaction) => ({
1304
+ amount: (0, common_1.num)(transaction, "amount"),
1305
+ timestamp: (0, common_1.num)(transaction, "timestamp"),
1306
+ action: (0, common_1.str)(transaction, "action"),
1307
+ initiatorName: (0, common_1.str)(transaction, "initiator_name"),
1308
+ })),
1309
+ };
1310
+ }
1311
+ function parseCommunityUpgrades(profile) {
1312
+ const communityUpgrades = (0, common_1.obj)(profile, "community_upgrades");
1313
+ const currentlyUpgrading = communityUpgrades.currently_upgrading;
1314
+ return {
1315
+ currentlyUpgrading: typeof currentlyUpgrading === "object" &&
1316
+ currentlyUpgrading !== null &&
1317
+ !Array.isArray(currentlyUpgrading)
1318
+ ? {
1319
+ upgrade: (0, common_1.str)(currentlyUpgrading, "upgrade"),
1320
+ newTier: (0, common_1.num)(currentlyUpgrading, "new_tier"),
1321
+ startedMs: (0, common_1.num)(currentlyUpgrading, "start_ms"),
1322
+ startedBy: (0, common_1.str)(currentlyUpgrading, "who_started"),
1323
+ }
1324
+ : null,
1325
+ upgradeStates: objectArray(communityUpgrades, "upgrade_states").map((state) => ({
1326
+ upgrade: (0, common_1.str)(state, "upgrade"),
1327
+ tier: (0, common_1.num)(state, "tier"),
1328
+ startedMs: (0, common_1.num)(state, "started_ms"),
1329
+ startedBy: (0, common_1.str)(state, "started_by"),
1330
+ claimedMs: (0, common_1.num)(state, "claimed_ms"),
1331
+ claimedBy: (0, common_1.str)(state, "claimed_by"),
1332
+ fastTracked: (0, common_1.bool)(state, "fasttracked"),
1333
+ })),
1334
+ };
1335
+ }
1336
+ /** Parses a SkyBlock profile (`/skyblock/profile`) into a typed object. */
1337
+ function parseSkyBlockProfile(profile, forUuid) {
1338
+ if (typeof profile !== "object" ||
1339
+ profile === null ||
1340
+ Array.isArray(profile)) {
1341
+ return null;
1342
+ }
1343
+ const rawMembers = (0, common_1.obj)(profile, "members");
1344
+ const members = {};
1345
+ for (const uuid of Object.keys(rawMembers)) {
1346
+ members[uuid] = parseMember((0, common_1.obj)(rawMembers, uuid));
1347
+ }
1348
+ const member = forUuid !== undefined ? (members[forUuid] ?? null) : null;
1349
+ return {
1350
+ id: (0, common_1.str)(profile, "profile_id"),
1351
+ cuteName: (0, common_1.str)(profile, "cute_name"),
1352
+ gameMode: (0, common_1.str)(profile, "game_mode"),
1353
+ selected: (0, common_1.bool)(profile, "selected"),
1354
+ createdAt: (0, common_1.date)(profile, "created_at"),
1355
+ banking: parseBanking(profile),
1356
+ communityUpgrades: parseCommunityUpgrades(profile),
1357
+ member,
1358
+ members,
1359
+ };
1360
+ }
1361
+ /** Parses a player's SkyBlock profiles (`/skyblock/profiles`) into a typed object. */
1362
+ function parseSkyBlockProfiles(data, forUuid) {
1363
+ const profiles = Array.isArray(data.profiles) ? data.profiles : [];
1364
+ return profiles
1365
+ .filter((profile) => typeof profile === "object" &&
1366
+ profile !== null &&
1367
+ !Array.isArray(profile))
1368
+ .map((profile) => parseSkyBlockProfile(profile, forUuid))
1369
+ .filter((profile) => profile !== null);
1370
+ }
1371
+ //# sourceMappingURL=skyblock.js.map