aboutsummaryrefslogtreecommitdiff
path: root/src/cleaners/skyblock/harp.ts
blob: b1ec90567b82753186684734ecd770ad8c8e4ca2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import typedHypixelApi from 'typed-hypixel-api'
import { fetchHarpSongs } from '../../constants.js'

export interface HarpSong {
	id: string
	/** A number between 0 and 1 representing the user's best completion */
	progress: number
	completions: number
	perfectCompletions: number
}

export interface HarpData {
	selected: {
		id: string
		timestamp: number
	} | null
	claimedMelodysHair: boolean
	songs: HarpSong[]
}

const renamedSongs = {
	fire_and_flames: 'through_the_campfire'
}

export async function cleanHarp(data: typedHypixelApi.SkyBlockProfileMember): Promise<HarpData> {
	const harpQuestData = data.harp_quest ?? {}
	const songs: HarpSong[] = []

	const allHarpSongNames = await 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)
			const songName = renamedSongs[apiSongName] ?? apiSongName
			songs.push({
				id: songName,
				completions: data.harp_quest[`song_${apiSongName}_completions`] ?? 0,
				perfectCompletions: data.harp_quest[`song_${apiSongName}_perfect_completions`] ?? 0,
				progress: data.harp_quest[`song_${apiSongName}_best_completion`] ?? 0
			})
		}
	}

	const missingHarpSongNames = allHarpSongNames.filter(songName => !songs.find(song => (renamedSongs[song.id] ?? song.id) === songName))
	for (const songName of missingHarpSongNames) {
		songs.push({
			id: renamedSongs[songName] ?? songName,
			completions: 0,
			perfectCompletions: 0,
			progress: 0
		})
	}

	const selectedSongId = harpQuestData.selected_song ? renamedSongs[harpQuestData.selected_song] ?? harpQuestData.selected_song : null

	return {
		selected: selectedSongId ? {
			id: selectedSongId,
			// i'm pretty sure the epoch is always there if the name is
			timestamp: harpQuestData.selected_song_epoch ?? 0
		} : null,
		claimedMelodysHair: harpQuestData?.claimed_talisman ?? false,
		songs
	}
}