Added arcade stat card
This commit is contained in:
23
src/app/(stats)/player/[ign]/_stats/arcade/arcade.tsx
Normal file
23
src/app/(stats)/player/[ign]/_stats/arcade/arcade.tsx
Normal 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>
|
||||
)
|
||||
}
|
||||
@@ -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>
|
||||
) :
|
||||
|
||||
24
src/data/hypixel/arcade.ts
Normal file
24
src/data/hypixel/arcade.ts
Normal 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
|
||||
14
src/lib/hypixel/arcade/general.ts
Normal file
14
src/lib/hypixel/arcade/general.ts
Normal 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
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
@@ -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()
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user