From c505512110bfd483d1f6ba2f251b8d63481a66bb Mon Sep 17 00:00:00 2001 From: Taken Date: Sat, 23 Aug 2025 22:23:42 +0200 Subject: [PATCH] Updated sidebar to be ok like fr --- .../player/[ign]/_components/Sidebar.tsx | 12 +++- src/app/(stats)/player/[ign]/page.tsx | 11 +++- src/data/hypixel/general.ts | 13 +++- src/lib/hypixel/stats.ts | 65 +++++++++++++++++-- src/lib/schema/player.ts | 3 +- 5 files changed, 90 insertions(+), 14 deletions(-) diff --git a/src/app/(stats)/player/[ign]/_components/Sidebar.tsx b/src/app/(stats)/player/[ign]/_components/Sidebar.tsx index eee78b6..f686bcb 100644 --- a/src/app/(stats)/player/[ign]/_components/Sidebar.tsx +++ b/src/app/(stats)/player/[ign]/_components/Sidebar.tsx @@ -14,9 +14,17 @@ type SidebarProps = { ign: string player: Player["player"] guild: Guild["guild"] | undefined + rank: string | undefined + specialRank: string | undefined + eulaCoins: boolean | undefined } -export default function Sidebar({ level, ign, player, guild }: SidebarProps) { +export default function Sidebar({ level, ign, player, guild, rank, specialRank, eulaCoins }: SidebarProps) { + const levelMultiplier = getCoinMultiplier(level, rank, specialRank, eulaCoins) + + const levelMultiplierVal = levelMultiplier.value + const levelMultiplierText = levelMultiplier.level === true ? `(Level ${level.toFixed(1).split(".")[0]})` : `(${levelMultiplier.name})` + return ( @@ -34,7 +42,7 @@ export default function Sidebar({ level, ign, player, guild }: SidebarProps) {

{"Coin multiplier: "} - {`x${getCoinMultiplier(level)} (Level ${level.toFixed(1).split(".")[0]})`} + {`x${levelMultiplierVal} ${levelMultiplierText}`}

{"Total coins: "} diff --git a/src/app/(stats)/player/[ign]/page.tsx b/src/app/(stats)/player/[ign]/page.tsx index 4015aa2..d78b18b 100644 --- a/src/app/(stats)/player/[ign]/page.tsx +++ b/src/app/(stats)/player/[ign]/page.tsx @@ -52,7 +52,6 @@ async function SuspendedPage({ ign: pign }: { ign: string }) { } const guild = await getGuild(uuid) - const level = getExactLevel(player.networkExp) return ( @@ -73,7 +72,15 @@ async function SuspendedPage({ ign: pign }: { ign: string }) { {player.uuid}

- + {player.stats !== undefined ? (
diff --git a/src/data/hypixel/general.ts b/src/data/hypixel/general.ts index f813215..339c641 100644 --- a/src/data/hypixel/general.ts +++ b/src/data/hypixel/general.ts @@ -12,5 +12,14 @@ export const MULTIPLIER = [ { level: 125, value: 6 }, { level: 150, value: 6.5 }, { level: 200, value: 7 }, - { level: 250, value: 8 }, -] \ No newline at end of file + { level: 250, value: 8 } +] + +export const RANKMULTIPLIER = { + VIP: { value: 2, name: "VIP" }, + VIP_PLUS: { value: 3, name: "VIP+" }, + MVP: { value: 4, name: "MVP" }, + MVP_PLUS: { value: 5, name: "MVP+" }, + YOUTUBER: { value: 7, name: "YouTuber" } +} + diff --git a/src/lib/hypixel/stats.ts b/src/lib/hypixel/stats.ts index 43d6f34..9cd9ac9 100644 --- a/src/lib/hypixel/stats.ts +++ b/src/lib/hypixel/stats.ts @@ -1,18 +1,69 @@ -import { MULTIPLIER } from "@/data/hypixel/general" +import { MULTIPLIER, RANKMULTIPLIER } from "@/data/hypixel/general" import { Player } from "@/lib/schema/player" -export function getCoinMultiplier(level: number) { +type ReturnType = { + level: true + value: number +} | { + level: false + value: number + name: string +} + +export function getCoinMultiplier(level: number, rank?: string, specialRank?: string, eulaCoins?: boolean): ReturnType { if (level > MULTIPLIER[MULTIPLIER.length - 1].level) { - return MULTIPLIER[MULTIPLIER.length - 1].value + return { + value: MULTIPLIER.at(-1)!.value, + level: true + } as const } - for (let i = MULTIPLIER.length - 1; i >= 0; i--) { - if (level >= MULTIPLIER[i].level) { - return MULTIPLIER[i].value + function getLevelMultiplier() { + for (let i = MULTIPLIER.length - 1; i >= 0; i--) { + if (level >= MULTIPLIER[i].level) { + return { + value: MULTIPLIER.at(i)!.value, + level: true + } as const + } + } + return { + value: MULTIPLIER.at(0)!.value, + level: true + } as const + } + + function getSpecialMultiplier() { + if (specialRank === "YOUTUBER") return RANKMULTIPLIER.YOUTUBER + if (!eulaCoins) return null + switch (rank) { + case "VIP": + return RANKMULTIPLIER.VIP + case "VIP_PLUS": + return RANKMULTIPLIER.VIP_PLUS + case "MVP": + return RANKMULTIPLIER.MVP + case "MVP_PLUS": + return RANKMULTIPLIER.MVP_PLUS + default: + return null } } - return MULTIPLIER[0].value + const specialMulti = getSpecialMultiplier() + const levelMulti = getLevelMultiplier() + + if (!specialMulti) { + return levelMulti + } + + const max = Math.max(specialMulti.value, levelMulti.value) + + if (max === specialMulti.value) { + return { ...specialMulti, level: false } + } else { + return levelMulti + } } export function getTotalCoins(stats: Record> | undefined) { diff --git a/src/lib/schema/player.ts b/src/lib/schema/player.ts index ca8649d..438ac25 100644 --- a/src/lib/schema/player.ts +++ b/src/lib/schema/player.ts @@ -48,7 +48,8 @@ export const playerSchema = z.looseObject({ YOUTUBE: z.string().optional() }).optional() }).optional(), - rank: z.string().optional() + rank: z.string().optional(), + eulaCoins: z.boolean().optional() }) })