diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cleaners/skyblock/collections.ts | 8 | ||||
-rw-r--r-- | src/cleaners/skyblock/harp.ts | 15 | ||||
-rw-r--r-- | src/cleaners/skyblock/pets.ts | 8 | ||||
-rw-r--r-- | src/cleaners/skyblock/skills.ts | 8 | ||||
-rw-r--r-- | src/cleaners/skyblock/slayers.ts | 6 | ||||
-rw-r--r-- | src/cleaners/skyblock/zones.ts | 10 | ||||
-rw-r--r-- | src/database.ts | 9 |
7 files changed, 49 insertions, 15 deletions
diff --git a/src/cleaners/skyblock/collections.ts b/src/cleaners/skyblock/collections.ts index 119e292..fe8ee1d 100644 --- a/src/cleaners/skyblock/collections.ts +++ b/src/cleaners/skyblock/collections.ts @@ -1,5 +1,6 @@ import { cleanItemId, hypixelItemNames } from './itemId.js' import typedHypixelApi from 'typed-hypixel-api' +import * as constants from '../../constants.js' const COLLECTIONS = { 'farming': [ @@ -97,13 +98,17 @@ function getCategory(collectionName): CollectionCategory | undefined { } export function cleanCollections(data: typedHypixelApi.SkyBlockProfileMember): Collection[] { + // 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: string[] = data?.unlocked_coll_tiers ?? [] const playerCollectionTiers: { [key: string]: number } = {} + let rawCollectionNames: Set<string> = new Set() + for (const collectionTierNameValueRaw of playerCollectionTiersRaw) { const [collectionTierNameRaw, collectionTierValueRaw] = collectionTierNameValueRaw.split(/_(?=-?\d+$)/) + rawCollectionNames.add(collectionTierNameRaw) const collectionName = cleanItemId(collectionTierNameRaw) // ensure it's at least 0 const collectionValue: number = Math.max(parseInt(collectionTierValueRaw), 0) @@ -113,6 +118,9 @@ export function cleanCollections(data: typedHypixelApi.SkyBlockProfileMember): C playerCollectionTiers[collectionName] = collectionValue } + constants.addCollections(Array.from(rawCollectionNames)) + + // 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: { [key in hypixelItemNames]?: number } = data?.collection ?? {} diff --git a/src/cleaners/skyblock/harp.ts b/src/cleaners/skyblock/harp.ts index b1ec905..c38013e 100644 --- a/src/cleaners/skyblock/harp.ts +++ b/src/cleaners/skyblock/harp.ts @@ -1,5 +1,5 @@ import typedHypixelApi from 'typed-hypixel-api' -import { fetchHarpSongs } from '../../constants.js' +import * as constants from '../../constants.js' export interface HarpSong { id: string @@ -26,11 +26,14 @@ export async function cleanHarp(data: typedHypixelApi.SkyBlockProfileMember): Pr const harpQuestData = data.harp_quest ?? {} const songs: HarpSong[] = [] - const allHarpSongNames = await fetchHarpSongs() + let songIds: string[] = [] + + const allHarpSongIds = await constants.fetchHarpSongs() for (const item in data.harp_quest) { if (item.startsWith('song_') && item.endsWith('_best_completion')) { const apiSongName = item.slice('song_'.length, -'_best_completion'.length) + songIds.push(apiSongName) const songName = renamedSongs[apiSongName] ?? apiSongName songs.push({ id: songName, @@ -41,10 +44,12 @@ export async function cleanHarp(data: typedHypixelApi.SkyBlockProfileMember): Pr } } - const missingHarpSongNames = allHarpSongNames.filter(songName => !songs.find(song => (renamedSongs[song.id] ?? song.id) === songName)) - for (const songName of missingHarpSongNames) { + constants.addHarpSongs(songIds) + + const missingHarpSongId = allHarpSongIds.filter(songId => !songIds.includes(songId)) + for (const songId of missingHarpSongId) { songs.push({ - id: renamedSongs[songName] ?? songName, + id: renamedSongs[songId] ?? songId, completions: 0, perfectCompletions: 0, progress: 0 diff --git a/src/cleaners/skyblock/pets.ts b/src/cleaners/skyblock/pets.ts index 031924a..4ee7cda 100644 --- a/src/cleaners/skyblock/pets.ts +++ b/src/cleaners/skyblock/pets.ts @@ -1,8 +1,8 @@ import typedHypixelApi from 'typed-hypixel-api' import { fetchItemList } from '../../hypixel.js' import { levelFromXpTable } from '../../util.js' -import { fetchPets } from '../../constants.js' import { ItemListItem } from './itemList.js' +import * as constants from '../../constants.js' // https://hypixel-skyblock.fandom.com/wiki/Module:Pet/LevelingData?action=edit @@ -57,12 +57,15 @@ export async function cleanPets(data: typedHypixelApi.SkyBlockProfileMember): Pr const obtainedPets: Pet[] = [] let activePet: Pet | null = null - const allPetIds = await fetchPets() + const allPetIds = await constants.fetchPets() const obtainedPetIds: string[] = [] const itemList = await fetchItemList() + let petIds: string[] = [] + for (const petData of data.pets ?? []) { + petIds.push(petData.type) const xpTable = RARITY_XP_TABLES[petData.tier] ?? RARITY_XP_TABLES.LEGENDARY const level = levelFromXpTable(petData.exp, xpTable) const pet: Pet = { @@ -80,6 +83,7 @@ export async function cleanPets(data: typedHypixelApi.SkyBlockProfileMember): Pr activePet = pet } + constants.addPets(petIds) const missingPetIds = allPetIds.filter(id => !obtainedPetIds.includes(id)) return { diff --git a/src/cleaners/skyblock/skills.ts b/src/cleaners/skyblock/skills.ts index 9aa3fb7..d035a96 100644 --- a/src/cleaners/skyblock/skills.ts +++ b/src/cleaners/skyblock/skills.ts @@ -1,6 +1,7 @@ import typedHypixelApi from 'typed-hypixel-api' import { fetchSkills } from '../../constants.js' import { levelFromXpTable } from '../../util.js' +import * as constants from '../../constants.js' export interface Skill { name: string @@ -139,9 +140,13 @@ export function levelForSkillXp(xp: number, maxLevel: number) { export async function cleanSkills(data: typedHypixelApi.SkyBlockProfileMember): Promise<Skill[]> { const allSkillNames = await fetchSkills() const skills: Skill[] = [] + + let skillNamesFound: string[] = [] + for (const item in data) { if (item.startsWith('experience_skill_')) { const skillName = item.slice('experience_skill_'.length) + skillNamesFound.push(skillName) // the amount of total xp you have in this skill const skillXp: number = data[item] @@ -173,6 +178,9 @@ export async function cleanSkills(data: typedHypixelApi.SkyBlockProfileMember): } } + constants.addSkills(skillNamesFound) + + // add missing skills const missingSkillNames = allSkillNames.filter(skillName => !skills.some(skill => skill.name === skillName)) for (const skillName of missingSkillNames) { diff --git a/src/cleaners/skyblock/slayers.ts b/src/cleaners/skyblock/slayers.ts index 94c23f0..f70ddc5 100644 --- a/src/cleaners/skyblock/slayers.ts +++ b/src/cleaners/skyblock/slayers.ts @@ -1,4 +1,5 @@ import typedHypixelApi from 'typed-hypixel-api' +import * as constants from '../../constants.js' const SLAYER_NAMES = { @@ -48,7 +49,10 @@ export function cleanSlayers(data: typedHypixelApi.SkyBlockProfileMember): Slaye let totalXp: number = 0 let totalKills: number = 0 + let slayerIds: string[] = [] + for (const slayerNameRaw in slayersDataRaw) { + slayerIds.push(slayerNameRaw) const slayerDataRaw = slayersDataRaw[slayerNameRaw] // convert name provided by api (spider) to the real name (tarantula) @@ -108,6 +112,8 @@ export function cleanSlayers(data: typedHypixelApi.SkyBlockProfileMember): Slaye totalKills += slayerKills } + constants.addSlayers(slayerIds) + return { xp: totalXp, kills: totalKills, diff --git a/src/cleaners/skyblock/zones.ts b/src/cleaners/skyblock/zones.ts index 556a2e7..92f4e81 100644 --- a/src/cleaners/skyblock/zones.ts +++ b/src/cleaners/skyblock/zones.ts @@ -6,9 +6,17 @@ export interface Zone { visited: boolean } +export function zoneIdToName(id: string) { + // this currently does nothing, but in the future it could get data from https://api.hypixel.net/resources/games + return id +} + export async function cleanVisitedZones(data: typedHypixelApi.SkyBlockProfileMember): Promise<Zone[]> { const rawZones = data?.visited_zones || [] + + constants.addZones(rawZones) + // TODO: store all the zones that exist in SkyBlock, add add those to the array with visited being false const zones: Zone[] = [] @@ -16,7 +24,7 @@ export async function cleanVisitedZones(data: typedHypixelApi.SkyBlockProfileMem for (const rawZoneName of knownZones) { zones.push({ - name: rawZoneName, + name: zoneIdToName(rawZoneName), visited: rawZones.includes(rawZoneName) }) } diff --git a/src/database.ts b/src/database.ts index 93e2a40..8b606d4 100644 --- a/src/database.ts +++ b/src/database.ts @@ -16,6 +16,7 @@ import { v4 as uuid4 } from 'uuid' import { debug } from './index.js' import Queue from 'queue-promise' import { RANK_COLORS } from './cleaners/rank.js' +import { cleanItemId } from './cleaners/skyblock/itemId.js' // don't update the user for 3 minutes const recentlyUpdated = new NodeCache({ @@ -357,7 +358,7 @@ export async function fetchAllMemberLeaderboardAttributes(): Promise<string[]> { ...await constants.fetchStats(), // collection leaderboards - ...(await constants.fetchCollections()).map(value => `collection_${value}`), + ...(await constants.fetchCollections()).map(value => `collection_${cleanItemId(value)}`), // skill leaderboards ...(await constants.fetchSkills()).map(value => `skill_${value}`), @@ -811,12 +812,6 @@ export async function updateDatabaseMember(member: CleanMember, profile: CleanFu if (member.rawHypixelStats) constants.addStats(Object.keys(member.rawHypixelStats)) - constants.addCollections(member.collections.map(coll => coll.name)) - constants.addSkills(member.skills.map(skill => skill.name)) - constants.addZones(member.zones.map(zone => zone.name)) - constants.addSlayers(member.slayers.bosses.map(s => s.rawName)) - constants.addPets(member.pets.list.map(s => s.id)) - constants.addHarpSongs(member.harp.songs.map(s => s.id)) if (debug) console.debug('done constants..') |