diff --git a/src/app/(stats)/player/[ign]/_stats/arcade/arcade.tsx b/src/app/(stats)/player/[ign]/_stats/arcade/arcade.tsx new file mode 100644 index 0000000..7601d37 --- /dev/null +++ b/src/app/(stats)/player/[ign]/_stats/arcade/arcade.tsx @@ -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 ( + Wins

, + stat:

{wins}

+ }]} + > + +
+ ) +} diff --git a/src/app/(stats)/player/[ign]/page.tsx b/src/app/(stats)/player/[ign]/page.tsx index a9d1871..0b3b6b1 100644 --- a/src/app/(stats)/player/[ign]/page.tsx +++ b/src/app/(stats)/player/[ign]/page.tsx @@ -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, "param + ) : diff --git a/src/data/hypixel/arcade.ts b/src/data/hypixel/arcade.ts new file mode 100644 index 0000000..b302128 --- /dev/null +++ b/src/data/hypixel/arcade.ts @@ -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 diff --git a/src/lib/hypixel/arcade/general.ts b/src/lib/hypixel/arcade/general.ts new file mode 100644 index 0000000..3a3a32f --- /dev/null +++ b/src/lib/hypixel/arcade/general.ts @@ -0,0 +1,14 @@ +import { WINS } from "@/data/hypixel/arcade" +import { NonNullStats } from "@/lib/schema/player" + +export function getArcadeTotalWins(stats: NonNullable) { + 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 +} diff --git a/src/lib/schema/player.ts b/src/lib/schema/player.ts index 8c93088..3fd8288 100644 --- a/src/lib/schema/player.ts +++ b/src/lib/schema/player.ts @@ -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, diff --git a/src/lib/schema/stats.ts b/src/lib/schema/stats.ts index 9736fc2..c6dfa1f 100644 --- a/src/lib/schema/stats.ts +++ b/src/lib/schema/stats.ts @@ -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>() + for (const id of ids) { + entries.set(`${id}`, z.number().default(0)) + } + return Object.fromEntries(entries) as Record<`${typeof ids[number]}`, z.ZodDefault> +} + +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() +})