Added arcade stat card

This commit is contained in:
2025-09-14 13:59:58 +02:00
parent 64a39eec6a
commit 6c19b059c4
6 changed files with 109 additions and 1 deletions

View File

@@ -0,0 +1,23 @@
import { Separator } from "@/components/ui/separator"
import { getArcadeTotalWins } from "@/lib/hypixel/arcade/general"
import { NonNullStats } from "@/lib/schema/player"
import GeneralStats from "../GeneralStats"
export default function ArcadeStats({ stats }: { stats: NonNullStats["Arcade"] }) {
if (!stats) return null
const wins = getArcadeTotalWins(stats)
return (
<GeneralStats
id="arcade"
title="Arcade"
collapsedStats={[{
title: <p>Wins</p>,
stat: <p className="text-muted-foreground">{wins}</p>
}]}
>
<Separator className="my-4" />
</GeneralStats>
)
}

View File

@@ -12,6 +12,7 @@ import { Metadata } from "next"
import { Suspense } from "react"
import { PlayerPageLoadText } from "./_client"
import Sidebar from "./_components/Sidebar"
import ArcadeStats from "./_stats/arcade/arcade"
import BedwarsStats from "./_stats/bedwars/bedwars"
import BlitzStats from "./_stats/blitz/blitz"
import BuildBattleStats from "./_stats/build-battle/build-battle"
@@ -132,6 +133,7 @@ async function SuspendedPage({ params }: Pick<PageProps<"/player/[ign]">, "param
<CopsAndCrimsStats stats={player.stats.CopsAndCrims} />
<WoolGamesStats stats={player.stats.WoolGames} />
<BlitzStats stats={player.stats.Blitz} />
<ArcadeStats stats={player.stats.Arcade} />
</Accordion>
</div>
) :

View File

@@ -0,0 +1,24 @@
export const WINS = [
"wins_dayone",
"wins_oneinthequiver",
"wins_dragonwars2",
"wins_easter_simulator",
"wins_ender",
"wins_farm_hunt",
"wins_soccer",
"sw_game_wins",
"wins_grinch_simulator_v2",
"wins_halloween_simulator",
"seeker_wins_hide_and_seek",
"hider_wins_hide_and_seek",
"wins_hole_in_the_wall",
"wins_simon_says",
"wins_party",
"wins_party_2",
"wins_party_3",
"wins_draw_their_thing",
"wins_scuba_simulator",
"wins_throw_out",
"wins_mini_walls",
"wins_zombies"
] as const

View File

@@ -0,0 +1,14 @@
import { WINS } from "@/data/hypixel/arcade"
import { NonNullStats } from "@/lib/schema/player"
export function getArcadeTotalWins(stats: NonNullable<NonNullStats["Arcade"]>) {
let wins = 0
for (const win of WINS) {
wins = wins + stats[win]
}
if (stats.dropper) wins = wins + stats.dropper.wins
if (stats.pixel_party) wins = wins + stats.pixel_party.wins
return wins
}

View File

@@ -1,5 +1,6 @@
import z from "zod"
import {
arcadeStatsSchema,
bedwarsStatsSchema,
blitzStatsSchema,
buildBattleStatsSchema,
@@ -38,7 +39,8 @@ export const playerSchema = z.looseObject({
Walls3: megawallsStats.optional(),
MCGO: copsAndCrimsStatsSchema.optional(),
WoolGames: woolGamesStatsSchema.optional(),
HungerGames: blitzStatsSchema.optional()
HungerGames: blitzStatsSchema.optional(),
Arcade: arcadeStatsSchema.optional()
}).transform(({ Walls3, MCGO, HungerGames, ...rest }) => {
return {
MegaWalls: Walls3,

View File

@@ -878,3 +878,46 @@ export const blitzStatsSchema = z.object({
...blitzKitPlayedStats().kits,
...blitzKitPlayedStats().prestiges
})
function arcadeModeWins() {
const ids = [
"wins_dayone",
"wins_oneinthequiver",
"wins_dragonwars2",
"wins_easter_simulator",
"wins_ender",
"wins_farm_hunt",
"wins_soccer",
"sw_game_wins",
"wins_grinch_simulator_v2",
"wins_halloween_simulator",
"seeker_wins_hide_and_seek",
"hider_wins_hide_and_seek",
"wins_hole_in_the_wall",
"wins_simon_says",
"wins_party",
"wins_party_2",
"wins_party_3",
"wins_draw_their_thing",
"wins_scuba_simulator",
"wins_throw_out",
"wins_mini_walls",
"wins_zombies"
] as const
const entries = new Map<string, z.ZodDefault<z.ZodNumber>>()
for (const id of ids) {
entries.set(`${id}`, z.number().default(0))
}
return Object.fromEntries(entries) as Record<`${typeof ids[number]}`, z.ZodDefault<z.ZodNumber>>
}
export const arcadeStatsSchema = z.object({
pixel_party: z.object({
wins: z.number().default(0)
}).optional(),
dropper: z.object({
wins: z.number().default(0)
}).optional(),
...arcadeModeWins()
})