Finished first column of duels stats

This commit is contained in:
2025-09-01 20:13:49 +02:00
parent 22eb67d5d1
commit 542cdc1cd8
4 changed files with 58 additions and 2 deletions

View File

@@ -1,15 +1,18 @@
import { AccordionContent, AccordionItem, AccordionTrigger } from "@/components/ui/accordion"
import { Card, CardContent } from "@/components/ui/card"
import { Separator } from "@/components/ui/separator"
import { formatNumber } from "@/lib/formatters"
import { getDivision, getMostPlayed } from "@/lib/hypixel/duels/duels"
import { romanize } from "@/lib/hypixel/general"
import { NonNullStats } from "@/lib/schema/player"
import CollapsedStats from "../../_components/CollapsedStats"
import DuelsGeneralStats from "./stats"
export default function DuelsStats({ stats }: { stats: NonNullStats["Duels"] }) {
if (!stats) return null
const wl = formatNumber(stats.wins / stats.losses)
const wl = stats.wins / stats.losses
const kd = stats.kills / stats.deaths
const div = getDivision("all_modes", stats)
const mostPlayed = getMostPlayed(stats)
@@ -57,13 +60,15 @@ export default function DuelsStats({ stats }: { stats: NonNullStats["Duels"] })
},
{
title: <p>WL</p>,
stat: <p className="text-muted-foreground">{wl}</p>
stat: <p className="text-muted-foreground">{formatNumber(wl)}</p>
}
]}
/>
</div>
</AccordionTrigger>
<AccordionContent>
<Separator className="my-4" />
<DuelsGeneralStats statsChecked={stats} div={div} kd={kd} />
</AccordionContent>
</CardContent>
</Card>

View File

@@ -0,0 +1,40 @@
import { formatNumber } from "@/lib/formatters"
import { Div } from "@/lib/hypixel/duels/duels"
import { romanize } from "@/lib/hypixel/general"
import { NonNullStats } from "@/lib/schema/player"
import { cn } from "@/lib/utils"
import { BasicStat } from "../../_components/Stats"
export default function DuelsGeneralStats({ statsChecked, div, kd }: { statsChecked: NonNullStats["Duels"], div: Div | null, kd: number }) {
const stats = statsChecked!
return (
<div className="flex mb-10">
<div className="flex-1">
<BasicStat title="Tokens: " value={formatNumber(stats.coins)} className="text-mc-dark-green" />
<BasicStat
title="Overall division: "
value={div !== null ? `${div.name} ${romanize(div.level)}` : "-"}
className={cn("font-bold", div !== null ? `text-mc-${div.color}` : undefined)}
/>
<p>
<br />
</p>
<p>
<br />
</p>
<BasicStat title="Kills: " value={formatNumber(stats.kills)} />
<BasicStat title="Deaths: " value={formatNumber(stats.deaths)} />
<BasicStat title="Kill/Death Ratio: " value={formatNumber(kd)} />
<p>
<br />
</p>
<BasicStat title="Melee Swings: " value={formatNumber(stats.melee_swings)} />
<BasicStat title="Melee Hits: " value={formatNumber(stats.melee_hits)} />
<BasicStat title="Melee Hit Accuracy: " value={`${formatNumber(stats.melee_hits / stats.melee_swings * 100)}%`} />
</div>
<div className="flex-1">
</div>
</div>
)
}

View File

@@ -2,6 +2,11 @@ import { DIVISIONS, MODES } from "@/data/hypixel/duels"
import { NonNullStats } from "@/lib/schema/player"
type DuelType = "all_modes"
export type Div = {
name: typeof DIVISIONS[number]["name"]
level: number
color: typeof DIVISIONS[number]["color"]
}
export function getDivision(duelType: DuelType, stats: NonNullable<NonNullStats["Duels"]>) {
for (const div of DIVISIONS.slice().reverse()) {

View File

@@ -272,6 +272,12 @@ export const skywarsStatsSchema = z.looseObject({
export const duelsStatsSchema = z.looseObject({
wins: z.number().default(0),
losses: z.number().default(0),
coins: z.number().default(0),
kills: z.number().default(0),
deaths: z.number().default(0),
melee_swings: z.number().default(0),
melee_hits: z.number().default(0),
//
all_modes_rookie_title_prestige: z.number().default(-1),
all_modes_iron_title_prestige: z.number().default(-1),
all_modes_gold_title_prestige: z.number().default(-1),