aboutsummaryrefslogtreecommitdiff
path: root/build/cleaners/skyblock
diff options
context:
space:
mode:
Diffstat (limited to 'build/cleaners/skyblock')
-rw-r--r--build/cleaners/skyblock/bank.js8
-rw-r--r--build/cleaners/skyblock/collections.js116
-rw-r--r--build/cleaners/skyblock/fairysouls.js7
-rw-r--r--build/cleaners/skyblock/inventory.js83
-rw-r--r--build/cleaners/skyblock/itemId.js57
-rw-r--r--build/cleaners/skyblock/member.js54
-rw-r--r--build/cleaners/skyblock/minions.js85
-rw-r--r--build/cleaners/skyblock/objectives.js12
-rw-r--r--build/cleaners/skyblock/profile.js64
-rw-r--r--build/cleaners/skyblock/profiles.js21
-rw-r--r--build/cleaners/skyblock/skills.js146
-rw-r--r--build/cleaners/skyblock/slayers.js60
-rw-r--r--build/cleaners/skyblock/stats.js91
-rw-r--r--build/cleaners/skyblock/zones.js23
14 files changed, 0 insertions, 827 deletions
diff --git a/build/cleaners/skyblock/bank.js b/build/cleaners/skyblock/bank.js
deleted file mode 100644
index fb08af5..0000000
--- a/build/cleaners/skyblock/bank.js
+++ /dev/null
@@ -1,8 +0,0 @@
-export function cleanBank(data) {
- return {
- balance: data?.banking?.balance ?? 0,
- // TODO: make transactions good
- // history: data?.banking?.transactions ?? []
- history: []
- };
-}
diff --git a/build/cleaners/skyblock/collections.js b/build/cleaners/skyblock/collections.js
deleted file mode 100644
index 4a5b34e..0000000
--- a/build/cleaners/skyblock/collections.js
+++ /dev/null
@@ -1,116 +0,0 @@
-import { cleanItemId } from './itemId.js';
-const COLLECTIONS = {
- 'farming': [
- 'wheat',
- 'carrot',
- 'potato',
- 'pumpkin',
- 'melon_slice',
- 'wheat_seeds',
- 'red_mushroom',
- 'cocoa_beans',
- 'cactus',
- 'sugar_cane',
- 'feather',
- 'leather',
- 'porkchop',
- 'chicken',
- 'mutton',
- 'rabbit',
- 'nether_wart'
- ],
- 'mining': [
- 'cobblestone',
- 'coal',
- 'iron_ingot',
- 'gold_ingot',
- 'diamond',
- 'lapis_lazuli',
- 'emerald',
- 'redstone',
- 'quartz',
- 'obsidian',
- 'glowstone_dust',
- 'gravel',
- 'ice',
- 'netherrack',
- 'sand',
- 'end_stone'
- ],
- 'combat': [
- 'rotten_flesh',
- 'bone',
- 'string',
- 'spider_eye',
- 'gunpowder',
- 'ender_pearl',
- 'ghast_tear',
- 'slime_ball',
- 'blaze_rod',
- 'magma_cream'
- ],
- 'foraging': [
- 'oak_log',
- 'spruce_log',
- 'birch_log',
- 'jungle_log',
- 'acacia_log',
- 'dark_oak_log'
- ],
- 'fishing': [
- 'cod',
- 'salmon',
- 'tropical_fish',
- 'pufferfish',
- 'prismarine_shard',
- 'prismarine_crystals',
- 'clay_ball',
- 'lily_pad',
- 'ink_sac',
- 'sponge'
- ],
- // no item should be here, but in case a new collection is added itll default to this
- 'unknown': []
-};
-// get a category name (farming) from a collection name (wheat)
-function getCategory(collectionName) {
- for (const categoryName in COLLECTIONS) {
- const categoryItems = COLLECTIONS[categoryName];
- if (categoryItems.includes(collectionName))
- return categoryName;
- }
-}
-export function cleanCollections(data) {
- // collection tiers show up like this: [ GRAVEL_3, GOLD_INGOT_2, MELON_-1, LOG_2:1_7, RAW_FISH:3_-1]
- // these tiers are the same for all players in a coop
- const playerCollectionTiersRaw = data?.unlocked_coll_tiers ?? [];
- const playerCollectionTiers = {};
- for (const collectionTierNameValueRaw of playerCollectionTiersRaw) {
- const [collectionTierNameRaw, collectionTierValueRaw] = collectionTierNameValueRaw.split(/_(?=-?\d+$)/);
- const collectionName = cleanItemId(collectionTierNameRaw);
- // ensure it's at least 0
- const collectionValue = Math.max(parseInt(collectionTierValueRaw), 0);
- // if the collection hasn't been checked yet, or the new value is higher than the old, replace it
- if (!playerCollectionTiers[collectionName] || collectionValue > playerCollectionTiers[collectionName])
- playerCollectionTiers[collectionName] = collectionValue;
- }
- // collection names show up like this: { LOG: 49789, LOG:2: 26219, MUSHROOM_COLLECTION: 2923}
- // these values are different for each player in a coop
- const playerCollectionXpsRaw = data?.collection ?? {};
- const playerCollections = [];
- for (const collectionNameRaw in playerCollectionXpsRaw) {
- const collectionXp = playerCollectionXpsRaw[collectionNameRaw];
- const collectionName = cleanItemId(collectionNameRaw);
- const collectionLevel = playerCollectionTiers[collectionName];
- const collectionCategory = getCategory(collectionName) ?? 'unknown';
- // in some very weird cases the collection level will be undefined, we should ignore these collections
- if (collectionLevel !== undefined)
- playerCollections.push({
- name: collectionName,
- xp: collectionXp,
- level: collectionLevel,
- category: collectionCategory
- });
- }
- return playerCollections;
-}
diff --git a/build/cleaners/skyblock/fairysouls.js b/build/cleaners/skyblock/fairysouls.js
deleted file mode 100644
index 8ec8078..0000000
--- a/build/cleaners/skyblock/fairysouls.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export function cleanFairySouls(data) {
- return {
- total: data?.fairy_souls_collected ?? 0,
- unexchanged: data?.fairy_souls ?? 0,
- exchanges: data?.fairy_exchanges ?? 0,
- };
-}
diff --git a/build/cleaners/skyblock/inventory.js b/build/cleaners/skyblock/inventory.js
deleted file mode 100644
index 714a302..0000000
--- a/build/cleaners/skyblock/inventory.js
+++ /dev/null
@@ -1,83 +0,0 @@
-// maybe todo?: create a fast replacement for prismarine-nbt
-import * as nbt from 'prismarine-nbt';
-function base64decode(base64) {
- return Buffer.from(base64, 'base64');
-}
-function cleanItem(rawItem) {
- // if the item doesn't have an id, it isn't an item
- if (rawItem.id === undefined)
- return null;
- const vanillaId = rawItem.id;
- const itemCount = rawItem.Count;
- const damageValue = rawItem.Damage;
- const itemTag = rawItem.tag;
- const extraAttributes = itemTag?.ExtraAttributes ?? {};
- let headId;
- if (vanillaId === 397) {
- const headDataBase64 = itemTag?.SkullOwner?.Properties?.textures?.[0]?.Value;
- if (headDataBase64) {
- const headData = JSON.parse(base64decode(headDataBase64).toString());
- const headDataUrl = headData?.textures?.SKIN?.url;
- if (headDataUrl) {
- const splitUrl = headDataUrl.split('/');
- headId = splitUrl[splitUrl.length - 1];
- }
- }
- }
- return {
- id: extraAttributes?.id ?? null,
- count: itemCount ?? 1,
- vanillaId: damageValue ? `${vanillaId}:${damageValue}` : vanillaId.toString(),
- display: {
- name: itemTag?.display?.Name ?? 'null',
- lore: itemTag?.display?.Lore ?? [],
- // if it has an ench value in the tag, then it should have an enchant glint effect
- glint: (itemTag?.ench ?? []).length > 0
- },
- reforge: extraAttributes?.modifier,
- enchantments: extraAttributes?.enchantments,
- anvil_uses: extraAttributes?.anvil_uses,
- timestamp: extraAttributes?.timestamp,
- head_texture: headId,
- };
-}
-function cleanItems(rawItems) {
- return rawItems.map(cleanItem);
-}
-export function cleanInventory(encodedNbt) {
- return new Promise(resolve => {
- const base64Data = base64decode(encodedNbt);
- nbt.parse(base64Data, false, (err, value) => {
- const simplifiedNbt = nbt.simplify(value);
- // do some basic cleaning on the items and return
- resolve(cleanItems(simplifiedNbt.i));
- });
- });
-}
-export const INVENTORIES = {
- armor: 'inv_armor',
- inventory: 'inv_contents',
- ender_chest: 'ender_chest_contents',
- talisman_bag: 'talisman_bag',
- potion_bag: 'potion_bag',
- fishing_bag: 'fishing_bag',
- quiver: 'quiver',
- trick_or_treat_bag: 'candy_inventory_contents',
- wardrobe: 'wardrobe_contents'
-};
-export async function cleanInventories(data) {
- const cleanInventories = {};
- for (const cleanInventoryName in INVENTORIES) {
- const hypixelInventoryName = INVENTORIES[cleanInventoryName];
- const encodedInventoryContents = data[hypixelInventoryName]?.data;
- let inventoryContents;
- if (encodedInventoryContents) {
- inventoryContents = await cleanInventory(encodedInventoryContents);
- if (cleanInventoryName === 'armor')
- // the armor is sent from boots to head, the opposite makes more sense
- inventoryContents.reverse();
- cleanInventories[cleanInventoryName] = inventoryContents;
- }
- }
- return cleanInventories;
-}
diff --git a/build/cleaners/skyblock/itemId.js b/build/cleaners/skyblock/itemId.js
deleted file mode 100644
index ea94771..0000000
--- a/build/cleaners/skyblock/itemId.js
+++ /dev/null
@@ -1,57 +0,0 @@
-// change weird item names to be more consistent with vanilla
-const ITEMS = {
- 'log': 'oak_log',
- 'log:1': 'spruce_log',
- 'log:2': 'birch_log',
- 'log:3': 'jungle_log',
- 'log_2': 'acacia_log',
- 'log_2:1': 'dark_oak_log',
- 'ink_sack': 'ink_sac',
- 'ink_sack:3': 'cocoa_beans',
- 'ink_sack:4': 'lapis_lazuli',
- 'cocoa': 'cocoa_beans',
- 'raw_fish': 'cod',
- 'raw_fish:1': 'salmon',
- 'raw_fish:2': 'tropical_fish',
- 'raw_fish:3': 'pufferfish',
- 'raw_salmon': 'salmon',
- 'cooked_fish': 'cooked_cod',
- 'seeds': 'wheat_seeds',
- 'sulphur': 'gunpowder',
- 'raw_chicken': 'chicken',
- 'pork': 'porkchop',
- 'potato_item': 'potato',
- 'carrot_item': 'carrot',
- 'mushroom_collection': 'red_mushroom',
- 'nether_stalk': 'nether_wart',
- 'water_lily': 'lily_pad',
- 'melon': 'melon_slice',
- 'ender_stone': 'end_stone',
- 'huge_mushroom_1': 'red_mushroom_block',
- 'huge_mushroom_2': 'brown_mushroom_block',
- 'iron_ingot': 'iron_ingot',
- 'iron': 'iron_ingot',
- 'gold': 'gold_ingot',
- 'endstone': 'end_stone',
- 'lapis_lazuli_block': 'lapis_block',
- 'snow_ball': 'snowball',
- 'raw_beef': 'beef',
- 'eye_of_ender': 'ender_eye',
- 'grilled_pork': 'cooked_porkchop',
- 'glistering_melon': 'glistering_melon_slice',
- 'cactus_green': 'green_dye',
- 'enchanted_lapis_lazuli': 'enchanted_lapis_lazuli',
- 'enchanted_potato': 'enchanted_potato',
- 'enchanted_birch_log': 'enchanted_birch_log',
- 'enchanted_gunpowder': 'enchanted_gunpowder',
- 'enchanted_raw_salmon': 'enchanted_salmon',
- 'enchanted_raw_chicken': 'enchanted_chicken',
- 'enchanted_water_lily': 'enchanted_lily_pad',
- 'enchanted_ink_sack': 'enchanted_ink_sac',
- 'enchanted_melon': 'enchanted_melon_slice',
- 'enchanted_glistering_melon': 'enchanted_glistering_melon_slice'
-};
-/** Clean an item with a weird name (log_2:1) and make it have a better name (dark_oak_log) */
-export function cleanItemId(itemId) {
- return ITEMS[itemId.toLowerCase()] ?? itemId.toLowerCase();
-}
diff --git a/build/cleaners/skyblock/member.js b/build/cleaners/skyblock/member.js
deleted file mode 100644
index 3a6a143..0000000
--- a/build/cleaners/skyblock/member.js
+++ /dev/null
@@ -1,54 +0,0 @@
-import { cleanCollections } from './collections.js';
-import { cleanInventories } from './inventory.js';
-import { cleanFairySouls } from './fairysouls.js';
-import { cleanObjectives } from './objectives.js';
-import { cleanProfileStats } from './stats.js';
-import { cleanMinions } from './minions.js';
-import { cleanSlayers } from './slayers.js';
-import { cleanVisitedZones } from './zones.js';
-import { cleanSkills } from './skills.js';
-import * as cached from '../../hypixelCached.js';
-import * as constants from '../../constants.js';
-export async function cleanSkyBlockProfileMemberResponseBasic(member) {
- const player = await cached.fetchPlayer(member.uuid);
- if (!player)
- return null;
- return {
- uuid: member.uuid,
- username: player.username,
- last_save: member.last_save / 1000,
- first_join: member.first_join / 1000,
- rank: player.rank
- };
-}
-/** Cleans up a member (from skyblock/profile) */
-export async function cleanSkyBlockProfileMemberResponse(member, included = undefined) {
- // profiles.members[]
- const inventoriesIncluded = included === undefined || included.includes('inventories');
- const player = await cached.fetchPlayer(member.uuid);
- if (!player)
- return null;
- const fairySouls = cleanFairySouls(member);
- const { max_fairy_souls: maxFairySouls } = await constants.fetchConstantValues();
- if (fairySouls.total > (maxFairySouls ?? 0))
- await constants.setConstantValues({ max_fairy_souls: fairySouls.total });
- return {
- uuid: member.uuid,
- username: player.username,
- last_save: member.last_save / 1000,
- first_join: member.first_join / 1000,
- rank: player.rank,
- purse: member.coin_purse,
- stats: cleanProfileStats(member),
- // this is used for leaderboards
- rawHypixelStats: member.stats ?? {},
- minions: await cleanMinions(member),
- fairy_souls: fairySouls,
- inventories: inventoriesIncluded ? await cleanInventories(member) : undefined,
- objectives: cleanObjectives(member),
- skills: await cleanSkills(member),
- visited_zones: await cleanVisitedZones(member),
- collections: cleanCollections(member),
- slayers: cleanSlayers(member)
- };
-}
diff --git a/build/cleaners/skyblock/minions.js b/build/cleaners/skyblock/minions.js
deleted file mode 100644
index 5c0bd9a..0000000
--- a/build/cleaners/skyblock/minions.js
+++ /dev/null
@@ -1,85 +0,0 @@
-import { maxMinion } from '../../hypixel.js';
-import * as constants from '../../constants.js';
-/**
- * Clean the minions provided by Hypixel
- * @param minionsRaw The minion data provided by the Hypixel API
- */
-export async function cleanMinions(member) {
- const minions = [];
- const processedMinionNames = new Set();
- for (const minionRaw of member?.crafted_generators ?? []) {
- // do some regex magic to get the minion name and level
- // examples of potential minion names: CLAY_11, PIG_1, MAGMA_CUBE_4
- const minionName = minionRaw.split(/_\d/)[0].toLowerCase();
- const minionLevel = parseInt(minionRaw.split(/\D*_/)[1]);
- let matchingMinion = minions.find(m => m.name === minionName);
- if (!matchingMinion) {
- // if the minion doesnt already exist in the minions array, then create it
- matchingMinion = {
- name: minionName,
- levels: new Array(maxMinion).fill(false)
- };
- minions.push(matchingMinion);
- }
- while (minionLevel > matchingMinion.levels.length)
- // if hypixel increases the minion level, this will increase with it
- matchingMinion.levels.push(false);
- // set the minion at that level to true
- matchingMinion.levels[minionLevel - 1] = true;
- processedMinionNames.add(minionName);
- }
- const allMinionNames = new Set(await constants.fetchMinions());
- for (const minionName of processedMinionNames) {
- if (!allMinionNames.has(minionName)) {
- constants.addMinions(Array.from(processedMinionNames));
- break;
- }
- }
- for (const minionName of allMinionNames) {
- if (!processedMinionNames.has(minionName)) {
- processedMinionNames.add(minionName);
- minions.push({
- name: minionName,
- levels: new Array(maxMinion).fill(false)
- });
- }
- }
- return minions.sort((a, b) => a.name > b.name ? 1 : (a.name < b.name ? -1 : 0));
-}
-/**
- * Combine multiple arrays of minions into one, useful when getting the minions for members
- * @param minions An array of arrays of minions
- */
-export function combineMinionArrays(minions) {
- const resultMinions = [];
- for (const memberMinions of minions) {
- for (const minion of memberMinions) {
- // this is a reference, so we can directly modify the attributes for matchingMinionReference
- // and they'll be in the resultMinions array
- const matchingMinionReference = resultMinions.find(m => m.name === minion.name);
- if (!matchingMinionReference) {
- // if the minion name isn't already in the array, add it!
- resultMinions.push(minion);
- }
- else {
- // This should never happen, but in case the length of `minion.levels` is longer than
- // `matchingMinionReference.levels`, then it should be extended to be equal length
- while (matchingMinionReference.levels.length < minion.levels.length)
- matchingMinionReference.levels.push(false);
- for (let i = 0; i < minion.levels.length; i++) {
- if (minion.levels[i])
- matchingMinionReference.levels[i] = true;
- }
- }
- }
- }
- return resultMinions;
-}
-export function countUniqueMinions(minions) {
- let uniqueMinions = 0;
- for (const minion of minions) {
- // find the number of times `true` is in the list and add it to uniqueMinions
- uniqueMinions += minion.levels.filter(x => x).length;
- }
- return uniqueMinions;
-}
diff --git a/build/cleaners/skyblock/objectives.js b/build/cleaners/skyblock/objectives.js
deleted file mode 100644
index 52e92db..0000000
--- a/build/cleaners/skyblock/objectives.js
+++ /dev/null
@@ -1,12 +0,0 @@
-export function cleanObjectives(data) {
- const rawObjectives = data?.objectives || {};
- const objectives = [];
- for (const rawObjectiveName in rawObjectives) {
- const rawObjectiveValue = rawObjectives[rawObjectiveName];
- objectives.push({
- name: rawObjectiveName,
- completed: rawObjectiveValue.status === 'COMPLETE',
- });
- }
- return objectives;
-}
diff --git a/build/cleaners/skyblock/profile.js b/build/cleaners/skyblock/profile.js
deleted file mode 100644
index 42e26b3..0000000
--- a/build/cleaners/skyblock/profile.js
+++ /dev/null
@@ -1,64 +0,0 @@
-import { cleanSkyBlockProfileMemberResponse, cleanSkyBlockProfileMemberResponseBasic } from './member.js';
-import { combineMinionArrays, countUniqueMinions } from './minions.js';
-import * as constants from '../../constants.js';
-import { cleanBank } from './bank.js';
-/** Return a `CleanProfile` instead of a `CleanFullProfile`, useful when we need to get members but don't want to waste much ram */
-export async function cleanSkyblockProfileResponseLighter(data) {
- // We use Promise.all so it can fetch all the usernames at once instead of waiting for the previous promise to complete
- const promises = [];
- for (const memberUUID in data.members) {
- const memberRaw = data.members[memberUUID];
- memberRaw.uuid = memberUUID;
- // we pass an empty array to make it not check stats
- promises.push(cleanSkyBlockProfileMemberResponseBasic(memberRaw));
- }
- const cleanedMembers = (await Promise.all(promises)).filter(m => m);
- return {
- uuid: data.profile_id,
- name: data.cute_name,
- members: cleanedMembers,
- };
-}
-/**
- * This function is somewhat costly and shouldn't be called often. Use cleanSkyblockProfileResponseLighter if you don't need all the data
- */
-export async function cleanSkyblockProfileResponse(data, options) {
- // We use Promise.all so it can fetch all the users at once instead of waiting for the previous promise to complete
- const promises = [];
- if (!data)
- return null;
- for (const memberUUID in data.members) {
- const memberRaw = data.members[memberUUID];
- memberRaw.uuid = memberUUID;
- promises.push(cleanSkyBlockProfileMemberResponse(memberRaw, [
- !options?.basic ? 'stats' : undefined,
- options?.mainMemberUuid === memberUUID ? 'inventories' : undefined
- ]));
- }
- const cleanedMembers = (await Promise.all(promises)).filter(m => m !== null && m !== undefined);
- if (options?.basic) {
- return {
- uuid: data.profile_id,
- name: data.cute_name,
- members: cleanedMembers,
- };
- }
- const memberMinions = [];
- for (const member of cleanedMembers) {
- memberMinions.push(member.minions);
- }
- const minions = combineMinionArrays(memberMinions);
- const { max_minions: maxUniqueMinions } = await constants.fetchConstantValues();
- const uniqueMinions = countUniqueMinions(minions);
- if (uniqueMinions > (maxUniqueMinions ?? 0))
- await constants.setConstantValues({ max_minions: uniqueMinions });
- // return more detailed info
- return {
- uuid: data.profile_id,
- name: data.cute_name,
- members: cleanedMembers,
- bank: cleanBank(data),
- minions: minions,
- minion_count: uniqueMinions
- };
-}
diff --git a/build/cleaners/skyblock/profiles.js b/build/cleaners/skyblock/profiles.js
deleted file mode 100644
index a85b1f3..0000000
--- a/build/cleaners/skyblock/profiles.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import { cleanSkyblockProfileResponse } from './profile.js';
-export function cleanPlayerSkyblockProfiles(rawProfiles) {
- let profiles = [];
- for (const profile of Object.values(rawProfiles ?? {})) {
- profiles.push({
- uuid: profile.profile_id,
- name: profile.cute_name
- });
- }
- return profiles;
-}
-/** Convert an array of raw profiles into clean profiles */
-export async function cleanSkyblockProfilesResponse(data) {
- const promises = [];
- for (const profile of data ?? []) {
- // let cleanedProfile = await cleanSkyblockProfileResponseLighter(profile)
- promises.push(cleanSkyblockProfileResponse(profile));
- }
- const cleanedProfiles = (await Promise.all(promises)).filter(p => p);
- return cleanedProfiles;
-}
diff --git a/build/cleaners/skyblock/skills.js b/build/cleaners/skyblock/skills.js
deleted file mode 100644
index e9b19f8..0000000
--- a/build/cleaners/skyblock/skills.js
+++ /dev/null
@@ -1,146 +0,0 @@
-// the highest level you can have in each skill
-// numbers taken from https://hypixel-skyblock.fandom.com/wiki/Skills
-const skillsMaxLevel = {
- farming: 60,
- mining: 60,
- combat: 60,
- foraging: 50,
- fishing: 50,
- enchanting: 60,
- alchemy: 50,
- taming: 50,
- dungeoneering: 50,
- carpentry: 50,
- runecrafting: 25,
- social: 25
-};
-const skillXpTable = [
- 50,
- 175,
- 375,
- 675,
- 1175,
- 1925,
- 2925,
- 4425,
- 6425,
- 9925,
- 14925,
- 22425,
- 32425,
- 47425,
- 67425,
- 97425,
- 147425,
- 222425,
- 322425,
- 522425,
- 822425,
- 1222425,
- 1722425,
- 2322425,
- 3022425,
- 3822425,
- 4722425,
- 5722425,
- 6822425,
- 8022425,
- 9322425,
- 10722425,
- 12222425,
- 13822425,
- 15522425,
- 17322425,
- 19222425,
- 21222425,
- 23322425,
- 25522425,
- 27822425,
- 30222425,
- 32722425,
- 35322425,
- 38072425,
- 40972425,
- 44072425,
- 47472425,
- 51172425,
- 55172425,
- 59472425,
- 64072425,
- 68972425,
- 74172425,
- 79672425,
- 85472425,
- 91572425,
- 97972425,
- 104672425,
- 111672425 // 60
-];
-const skillXpTableEasier = [
- 50,
- 150,
- 275,
- 435,
- 635,
- 885,
- 1200,
- 1600,
- 2100,
- 2725,
- 3510,
- 4510,
- 5760,
- 7325,
- 9325,
- 11825,
- 14950,
- 18950,
- 23950,
- 30200,
- 38050,
- 47850,
- 60100,
- 75400,
- 94450 // 25
-];
-// for skills that aren't in maxSkills, default to this
-const skillsDefaultMaxLevel = 50;
-/**
- * Get the skill level for the amount of total xp
- * @param xp The xp we're finding the level for
- * @param easierLevel Whether it should use the alternate leveling xp table (used for cosmetic skills and dungeoneering)
- */
-export function levelForSkillXp(xp, maxLevel) {
- const xpTable = (maxLevel <= 25 ? skillXpTableEasier : skillXpTable).slice(0, maxLevel);
- const skillLevel = [...xpTable].reverse().findIndex(levelXp => xp >= levelXp);
- return skillLevel === -1 ? 0 : xpTable.length - skillLevel;
-}
-export async function cleanSkills(data) {
- const skills = [];
- for (const item in data) {
- if (item.startsWith('experience_skill_')) {
- const skillName = item.substr('experience_skill_'.length);
- // the amount of total xp you have in this skill
- const skillXp = data[item];
- const skillMaxLevel = skillsMaxLevel[skillName] ?? skillsDefaultMaxLevel;
- const xpTable = (skillMaxLevel <= 25 ? skillXpTableEasier : skillXpTable).slice(0, skillMaxLevel);
- // the level you're at for this skill
- const skillLevel = levelForSkillXp(skillXp, skillMaxLevel);
- // the total xp required for the previous level
- const previousLevelXp = skillLevel >= 1 ? xpTable[skillLevel - 1] : 0;
- // the extra xp left over
- const skillLevelXp = skillXp - previousLevelXp;
- // the amount of extra xp required for this level
- const skillLevelXpRequired = xpTable[skillLevel] - previousLevelXp;
- skills.push({
- name: skillName,
- xp: skillXp,
- level: skillLevel,
- maxLevel: skillMaxLevel,
- levelXp: skillLevelXp,
- levelXpRequired: skillLevelXpRequired
- });
- }
- }
- return skills;
-}
diff --git a/build/cleaners/skyblock/slayers.js b/build/cleaners/skyblock/slayers.js
deleted file mode 100644
index 75894f7..0000000
--- a/build/cleaners/skyblock/slayers.js
+++ /dev/null
@@ -1,60 +0,0 @@
-export const slayerLevels = 5;
-const SLAYER_NAMES = {
- spider: 'tarantula',
- zombie: 'revenant',
- wolf: 'sven'
-};
-export function cleanSlayers(data) {
- const slayers = [];
- const slayersDataRaw = data?.slayer_bosses;
- let totalXp = 0;
- let totalKills = 0;
- for (const slayerNameRaw in slayersDataRaw) {
- const slayerDataRaw = slayersDataRaw[slayerNameRaw];
- // convert name provided by api (spider) to the real name (tarantula)
- const slayerName = SLAYER_NAMES[slayerNameRaw];
- const slayerXp = slayerDataRaw.xp ?? 0;
- let slayerKills = 0;
- const slayerTiers = [];
- for (const slayerDataKey in slayerDataRaw) {
- // if a key starts with boss_kills_tier_ (boss_kills_tier_1), get the last number
- if (slayerDataKey.startsWith('boss_kills_tier_')) {
- const slayerTierRaw = parseInt(slayerDataKey.substr('boss_kills_tier_'.length));
- const slayerTierKills = slayerDataRaw[slayerDataKey] ?? 0;
- // add 1 since hypixel is using 0 indexed tiers
- const slayerTier = slayerTierRaw + 1;
- slayerTiers.push({
- kills: slayerTierKills,
- tier: slayerTier
- });
- // count up the total number of kills for this slayer
- if (slayerTierKills)
- slayerKills += slayerTierKills;
- }
- }
- // if the slayer tier length is less than the max, add more empty ones
- while (slayerTiers.length < slayerLevels)
- slayerTiers.push({
- tier: slayerTiers.length + 1,
- kills: 0
- });
- const slayer = {
- name: slayerName,
- raw_name: slayerNameRaw,
- tiers: slayerTiers,
- xp: slayerXp ?? 0,
- kills: slayerKills
- };
- slayers.push(slayer);
- // add the xp and kills from this slayer to the total xp
- if (slayerXp)
- totalXp += slayerXp;
- if (slayerKills)
- totalKills += slayerKills;
- }
- return {
- xp: totalXp,
- kills: totalKills,
- bosses: slayers
- };
-}
diff --git a/build/cleaners/skyblock/stats.js b/build/cleaners/skyblock/stats.js
deleted file mode 100644
index 361f1ba..0000000
--- a/build/cleaners/skyblock/stats.js
+++ /dev/null
@@ -1,91 +0,0 @@
-const statCategories = {
- 'deaths': ['deaths_', 'deaths'],
- 'kills': ['kills_', 'kills'],
- 'fishing': ['items_fished_', 'items_fished', 'shredder_'],
- 'auctions': ['auctions_'],
- 'races': ['_best_time', '_best_time_2'],
- 'mythos': ['mythos_burrows_', 'mythos_kills'],
- 'collection': ['collection_'],
- 'skills': ['skill_'],
- 'slayer': ['slayer_'],
- 'misc': null // everything else goes here
-};
-export function categorizeStat(statNameRaw) {
- // 'deaths_void'
- for (const statCategory in statCategories) {
- // 'deaths'
- const statCategoryMatchers = statCategories[statCategory];
- if (statCategoryMatchers == null) {
- // If it's null, just go with this. Can only ever be 'misc'
- return {
- category: statCategory,
- name: statNameRaw
- };
- }
- for (const categoryMatch of statCategoryMatchers) {
- // ['deaths_']
- let trailingEnd = categoryMatch[0] === '_';
- let trailingStart = categoryMatch.substr(-1) === '_';
- if (trailingStart && statNameRaw.startsWith(categoryMatch)) {
- return {
- category: statCategory,
- name: statNameRaw.substr(categoryMatch.length)
- };
- }
- else if (trailingEnd && statNameRaw.endsWith(categoryMatch)) {
- return {
- category: statCategory,
- name: statNameRaw.substr(0, statNameRaw.length - categoryMatch.length)
- };
- }
- else if (statNameRaw == categoryMatch) {
- // if it matches exactly, we don't know the name. will be defaulted to category later on
- return {
- category: statCategory,
- name: null
- };
- }
- }
- }
- // this should never happen, as it'll default to misc and return if nothing is found
- return {
- category: null,
- name: statNameRaw
- };
-}
-export const statUnits = {
- time: ['_best_time', '_best_time_2'],
- date: ['first_join'],
- coins: ['purse'],
- leaderboards: ['leaderboards_count', 'top_1_leaderboards_count']
-};
-export function getStatUnit(name) {
- for (const [unitName, statMatchers] of Object.entries(statUnits)) {
- for (const statMatch of statMatchers) {
- let trailingEnd = statMatch[0] === '_';
- let trailingStart = statMatch.substr(-1) === '_';
- if ((trailingStart && name.startsWith(statMatch))
- || (trailingEnd && name.endsWith(statMatch))
- || (name == statMatch))
- return unitName;
- }
- }
- return null;
-}
-export function cleanProfileStats(data) {
- // TODO: add type for statsRaw (probably in hypixelApi.ts since its coming from there)
- const stats = [];
- const rawStats = data?.stats ?? {};
- for (const statNameRaw in rawStats) {
- const statValue = rawStats[statNameRaw];
- let { category: statCategory, name: statName } = categorizeStat(statNameRaw);
- stats.push({
- categorizedName: statName ?? 'total',
- value: statValue,
- rawName: statNameRaw,
- category: statCategory,
- unit: getStatUnit(statNameRaw) ?? null
- });
- }
- return stats;
-}
diff --git a/build/cleaners/skyblock/zones.js b/build/cleaners/skyblock/zones.js
deleted file mode 100644
index 90c689b..0000000
--- a/build/cleaners/skyblock/zones.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import * as constants from '../../constants.js';
-export async function cleanVisitedZones(data) {
- const rawZones = data?.visited_zones || [];
- // TODO: store all the zones that exist in SkyBlock, add add those to the array with visited being false
- const zones = [];
- const knownZones = await constants.fetchZones();
- for (const rawZoneName of knownZones) {
- zones.push({
- name: rawZoneName,
- visited: rawZones.includes(rawZoneName)
- });
- }
- // if this user somehow has a zone that we don't know about, just add it to zones
- for (const rawZoneName of rawZones) {
- if (!knownZones.includes(rawZoneName)) {
- zones.push({
- name: rawZoneName,
- visited: true
- });
- }
- }
- return zones;
-}