aboutsummaryrefslogtreecommitdiff
path: root/src/cleaners/skyblock/stats.ts
blob: c4ff54560b1f6c50dab0a02dbd4715df45456250 (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
66
67
68
69
70
71
72
73
const statCategories: { [ key: string ]: string[] | null } = { // sorted in order of importance
    'deaths': ['deaths_', 'deaths'],
    'kills': ['kills_', 'kills'],
    'fishing': ['items_fished_', 'items_fished'],
    'auctions': ['auctions_'],
    'races': ['_best_time'],
    'misc': null // everything else goes here
}

interface statCategory {
	category: string,
	name: string
}

function categorizeStat(statNameRaw: string): statCategory {
    // '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, 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 interface CleanProfileStats {
    [ category: string ]: {
        [ stat: string ]: any
        total?: any
    }
}

export function cleanProfileStats(statsRaw: any): CleanProfileStats {
    // TODO: add type for statsRaw (probably in hypixelApi.ts since its coming from there)
    const stats: CleanProfileStats = {}
    for (let statNameRaw in statsRaw) {
        let { category: statCategory, name: statName } = categorizeStat(statNameRaw)
        if (!stats[statCategory]) stats[statCategory] = {}
        stats[statCategory][statName || 'total'] = statsRaw[statNameRaw]
    }
    return stats
}