Added first mm stats

This commit is contained in:
2025-09-02 20:17:26 +02:00
parent e949738ade
commit d3b04eec9a
6 changed files with 101 additions and 4 deletions

View File

@@ -0,0 +1,41 @@
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 { NonNullStats } from "@/lib/schema/player"
import CollapsedStats from "../../_components/CollapsedStats"
import MurderMysteryGeneralStats from "./stats"
export default function MurderMysteryStats({ stats }: { stats: NonNullStats["MurderMystery"] }) {
if (!stats) return null
return (
<AccordionItem value="murder-mystery">
<Card className="py-0">
<CardContent>
<AccordionTrigger className="items-center py-2 hover:no-underline hover:cursor-pointer">
<h1 className="text-xl font-bold">Murder Mystery</h1>
<div className="flex gap-4">
<CollapsedStats
stats={[
{
title: <p>Kills</p>,
stat: <p className="text-muted-foreground">{formatNumber(stats.kills)}</p>
},
{
title: <p>Wins</p>,
stat: <p className="text-muted-foreground">{formatNumber(stats.wins)}</p>
}
]}
/>
</div>
</AccordionTrigger>
<AccordionContent>
<Separator className="my-4" />
<MurderMysteryGeneralStats statsChecked={stats} />
</AccordionContent>
</CardContent>
</Card>
</AccordionItem>
)
}

View File

@@ -0,0 +1,23 @@
import { formatNumber } from "@/lib/formatters"
import { NonNullStats } from "@/lib/schema/player"
import { BasicStat } from "../../_components/Stats"
export default function MurderMysteryGeneralStats({ statsChecked }: { statsChecked: NonNullStats["MurderMystery"] }) {
const stats = statsChecked!
const kd = formatNumber(stats.kills / stats.deaths)
return (
<div className="flex mb-10">
<div className="flex-1">
<BasicStat title="Tokens: " value={formatNumber(stats.coins)} className="font-bold text-mc-dark-green" />
<BasicStat title="Kills: " value={formatNumber(stats.kills)} />
<BasicStat title="Kills as Murderer: " value={formatNumber(stats.kills_as_murderer)} />
<BasicStat title="Deaths: " value={formatNumber(stats.deaths)} />
<BasicStat title="Kill/Death Ratio: " value={kd} />
</div>
<div className="flex-1">
</div>
</div>
)
}

View File

@@ -10,6 +10,7 @@ import { Suspense } from "react"
import Sidebar from "./_components/Sidebar" import Sidebar from "./_components/Sidebar"
import BedwarsStats from "./_stats/bedwars/bedwars" import BedwarsStats from "./_stats/bedwars/bedwars"
import DuelsStats from "./_stats/duels/duels" import DuelsStats from "./_stats/duels/duels"
import MurderMysteryStats from "./_stats/murder-mystery/murder-mystery"
import SkyWarsStats from "./_stats/skywars/skywars" import SkyWarsStats from "./_stats/skywars/skywars"
export default async function PlayerPage({ export default async function PlayerPage({
@@ -93,6 +94,7 @@ async function SuspendedPage({ ign: pign }: { ign: string }) {
achievements_skywars_opal_obsession={player.achievements?.["skywars_opal_obsession"] ?? 0} achievements_skywars_opal_obsession={player.achievements?.["skywars_opal_obsession"] ?? 0}
/> />
<DuelsStats stats={player.stats.Duels} /> <DuelsStats stats={player.stats.Duels} />
<MurderMysteryStats stats={player.stats.MurderMystery} />
</Accordion> </Accordion>
</div> </div>
) : ) :

View File

@@ -1,5 +1,5 @@
import z from "zod" import z from "zod"
import { bedwarsStatsSchema, duelsStatsSchema, skywarsStatsSchema } from "./stats" import { bedwarsStatsSchema, duelsStatsSchema, murderMysteryStatsSchema, skywarsStatsSchema } from "./stats"
export const playerSchema = z.looseObject({ export const playerSchema = z.looseObject({
player: z.looseObject({ player: z.looseObject({
@@ -16,7 +16,8 @@ export const playerSchema = z.looseObject({
stats: z.looseObject({ stats: z.looseObject({
Bedwars: bedwarsStatsSchema.optional(), Bedwars: bedwarsStatsSchema.optional(),
SkyWars: skywarsStatsSchema.optional(), SkyWars: skywarsStatsSchema.optional(),
Duels: duelsStatsSchema.optional() Duels: duelsStatsSchema.optional(),
MurderMystery: murderMysteryStatsSchema.optional()
}).optional(), }).optional(),
quests: z.record( quests: z.record(
z.string(), z.string(),

View File

@@ -1,5 +1,4 @@
import { title } from "process" import z from "zod"
import z, { object } from "zod"
function bedwarsModeStats() { function bedwarsModeStats() {
const ids = [ const ids = [
@@ -331,3 +330,11 @@ export const duelsStatsSchema = z.looseObject({
...duelsModeStats().bestWs, ...duelsModeStats().bestWs,
...duelsModeStats().bridge ...duelsModeStats().bridge
}) })
export const murderMysteryStatsSchema = z.looseObject({
kills: z.number().default(0),
wins: z.number().default(0),
coins: z.number().default(0),
kills_as_murderer: z.number().default(0),
deaths: z.number().default(0)
})

23
đ Normal file
View File

@@ -0,0 +1,23 @@
import { formatNumber } from "@/lib/formatters"
import { NonNullStats } from "@/lib/schema/player"
import { BasicStat } from "../../_components/Stats"
export default function MurderMysteryGeneralStats({ statsChecked }: { statsChecked: NonNullStats["MurderMystery"] }) {
const stats = statsChecked!
const kd = formatNumber(stats.kills / stats.deaths)
return (
<div className="flex mb-10">
<div className="flex-1">
<BasicStat title="Tokens: " value={formatNumber(stats.coins)} className="font-bold text-mc-dark-green" />
<BasicStat title="Kills: " value={formatNumber(stats.kills)} />
<BasicStat title="Kills as Murderer: " value={formatNumber(stats.kills_as_murderer)} />
<BasicStat title="Deaths: " value={formatNumber(stats.deaths)} />
<BasicStat title="Kill/Death Ratio: " value={kd} />
</div>
<div className="flex-1">
</div>
</div>
)
}