aboutsummaryrefslogtreecommitdiff
path: root/src/lib/profile.ts
blob: e5716b5bcc0837a7cc70dadb8837ee0a8a0dd166 (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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import type { CleanMemberProfile, StatItem } from './APITypes'
import { cleanId, millisecondsToTime } from './utils'

/**
 * Convert milliseconds since epoch into a string, but if it was within the
 * past week then show the timeago
 */
export function prettyTimestamp(ms: number) {
    const isWithinPastWeek = Date.now() - ms < 1000 * 60 * 60 * 24 * 7
    const timeAsString = isWithinPastWeek ? (millisecondsToTime(Date.now() - ms) + ' ago') : (new Date(ms)).toUTCString()
    return timeAsString
}

export const MODE_EMOJIS = {
    ironman: '♻️',
    stranded: '🏝️'
}
export const DEFAULT_MODE_EMOJI = '❓'

export function generateInfobox(data: CleanMemberProfile): string[] {
    const result: string[] = []

    if (data.member.left)
        result.push(`🚪 Removed from profile`)

    if (data.profile.mode !== 'normal') {
        const modeEmoji = MODE_EMOJIS[data.profile.mode] ?? DEFAULT_MODE_EMOJI
        result.push(`${modeEmoji} Mode: ${cleanId(data.profile.mode)}`)
    }

    if (data.member.lastSave)
        result.push(`💾 Last save: ${prettyTimestamp(data.member.lastSave)}`)

    if (data.member.firstJoin)
        result.push(`🚶 Profile created: ${prettyTimestamp(data.member.firstJoin)}`)

    result.push(`✨ Fairy souls: ${data.member.fairySouls.total}/${data.member.fairySouls.max}`)

    if (data.profile.minionCount >= data.profile.maxUniqueMinions)
        result.push(`🤖 Minion count: ${data.profile.minionCount}`)

    const farmingContestsWonByCrop: Record<string, number> = {}
    const farmingContestsWon = data.member.farmingContests.list.reduce(
        (previous, current) => {
            return previous + current.crops.reduce((previousCropSum, currentCrop) => {
                const wonContest = currentCrop.position === 1
                if (wonContest) {
                    farmingContestsWonByCrop[currentCrop.item] = (farmingContestsWonByCrop[currentCrop.item] ?? 0) + 1
                    return previousCropSum + 1
                }
                return previousCropSum
            }, 0)
        }, 0
    )

    if (farmingContestsWon >= 50) {
        let mostContestsWonCrop = ''
        let mostContestsWonCropCount = 0
        for (const [crop, count] of Object.entries(farmingContestsWonByCrop)) {
            if (count > mostContestsWonCropCount) {
                mostContestsWonCrop = crop
                mostContestsWonCropCount = count
            }
        }

        const cropEmoji = {
            cactus: '🌵',
            carrot: '🥕',
            cocoa_beans: '🍫',
            melon_slice: '🍉',
            // i couldn't find a better emoji lmao
            nether_wart: '🌶',
            potato: '🥔',
            pumpkin: '🎃',
            red_mushroom: '🍄',
            sugar_cane: '🎋',
            wheat: '🌾',
        }[mostContestsWonCrop] ?? '🌾'

        result.push(`${cropEmoji} Farming contests won: ${farmingContestsWon}`)
    }

    if (data.member.stats) {
        let mostSignificantKillsStat: StatItem | null = null
        let mostSignificantDeathsStat: StatItem | null = null

        for (const stat of data.member.stats) {
            if (
                stat.category === 'kills'
                && stat.rawName != 'kills'
                && stat.value >= 200_000
                && stat.value > (mostSignificantKillsStat?.value ?? 0)
            )
                mostSignificantKillsStat = stat
            if (
                stat.category === 'deaths'
                && stat.rawName != 'deaths'
                && stat.value > 1_000_000
                && stat.value > (mostSignificantDeathsStat?.value ?? 0)
            )
                mostSignificantDeathsStat = stat
        }

        if (mostSignificantKillsStat)
            result.push(
                `⚔ ${mostSignificantKillsStat.value.toLocaleString()} ${mostSignificantKillsStat.unit || cleanId(mostSignificantKillsStat.rawName).toLowerCase()}`
            )

        if (mostSignificantDeathsStat)
            result.push(
                `☠ ${mostSignificantDeathsStat.value.toLocaleString()} ${mostSignificantDeathsStat.unit || cleanId(mostSignificantDeathsStat.rawName).toLowerCase()}`
            )
    }

    return result
}