aboutsummaryrefslogtreecommitdiff
path: root/src/cleaners/rank.ts
blob: a9bc25578db8a421c33829ea8cf16800a491dd79 (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
import typedHypixelApi from 'typed-hypixel-api'
import { colorCodeFromName, minecraftColorCodes } from '../util.js'

export const RANK_COLORS: { [name: string]: string } = {
	'NONE': '7',
	'VIP': 'a',
	'VIP+': 'a',
	'MVP': 'b',
	'MVP+': 'b',
	'MVP++': '6',
	'YOUTUBE': 'c',
	'HELPER': '9',
	'MOD': '2',
	'GM': '2',
	'ADMIN': 'c'
}

export interface CleanRank {
	name: string,
	color: string | null,
	colored: string | null,
}

/** Response cleaning (reformatting to be nicer) */
export function cleanRank({
	packageRank,
	newPackageRank,
	monthlyPackageRank,
	rankPlusColor,
	rank,
	prefix
}: typedHypixelApi.PlayerDataResponse['player']): CleanRank {
	let name: string | undefined
	let color: string
	let colored: string
	let bracketColor: string | undefined
	if (prefix) { // derive values from prefix
		colored = prefix
		color = minecraftColorCodes[colored.match(/§./)![0][1]]
		name = colored.replace(/§./g, '').replace(/[\[\]]/g, '')
	} else {
		if (monthlyPackageRank && monthlyPackageRank !== 'NONE')
			name = monthlyPackageRank
		else if (rank && rank !== 'NORMAL')
			name = rank
		else
			name = newPackageRank?.replace('_PLUS', '+')
				?? packageRank?.replace('_PLUS', '+')

		switch (name) {
			// MVP++ is called Superstar for some reason
			case 'SUPERSTAR':
				name = 'MVP++'
				break
			// YouTube rank is called YouTuber, change this to the proper name
			case 'YOUTUBER':
				name = 'YOUTUBE'
				bracketColor = 'c'
				break
			case 'GAME_MASTER':
				name = 'GM'
				break
			case 'MODERATOR':
				name = 'MOD'
				break
			case undefined:
				name = 'NONE'
				break
		}

		const plusColor = rankPlusColor ? colorCodeFromName(rankPlusColor) : null
		color = minecraftColorCodes[RANK_COLORS[name]]
		let rankColorPrefix = RANK_COLORS[name] ? '§' + RANK_COLORS[name] : ''

		// the text is white, but only in the prefix
		if (name === 'YOUTUBE')
			rankColorPrefix = '§f'

		const nameWithoutPlus = name.split('+')[0]
		const plusesInName = '+'.repeat(name.split('+').length - 1)
		if (plusColor && plusesInName.length >= 1)
			if (bracketColor)
				colored = ${bracketColor}[${rankColorPrefix}${nameWithoutPlus}§${plusColor}${plusesInName}${rankColorPrefix}§${bracketColor}]`
			else
				colored = `${rankColorPrefix}[${nameWithoutPlus}§${plusColor}${plusesInName}${rankColorPrefix}]`
		else if (name !== 'NONE')
			if (bracketColor)
				colored = ${bracketColor}[${rankColorPrefix}${name}§${bracketColor}]`
			else
				colored = `${rankColorPrefix}[${name}]`
		else
			// nons don't have a prefix
			colored = `${rankColorPrefix}`
	}
	return {
		name,
		color,
		colored
	}
}