Added first part of duel stats

This commit is contained in:
2025-09-01 14:53:52 +02:00
parent 3c0d577aa6
commit 22eb67d5d1
7 changed files with 254 additions and 6 deletions

View File

@@ -0,0 +1,33 @@
import { DIVISIONS, MODES } from "@/data/hypixel/duels"
import { NonNullStats } from "@/lib/schema/player"
type DuelType = "all_modes"
export function getDivision(duelType: DuelType, stats: NonNullable<NonNullStats["Duels"]>) {
for (const div of DIVISIONS.slice().reverse()) {
const index = `${duelType}_${div.id}_title_prestige` as const
const val = stats[index]
if (val > 0) {
return {
name: div.name,
level: val,
color: div.color
}
}
}
return null
}
export function getMostPlayed(stats: NonNullable<NonNullStats["Duels"]>) {
let mostPlayed: typeof MODES[number] | null = null
let mostPlays = 0
for (const mode of MODES) {
const plays = stats[`${mode.id}_wins`] + stats[`${mode.id}_losses`]
if (plays > mostPlays && mode.id) {
mostPlays = plays
mostPlayed = mode
}
}
return mostPlayed
}

View File

@@ -33,13 +33,40 @@ export function concatStatsArray<T extends Record<string, number>>(keys: (keyof
return base as T
}
export function romanize(num: number): string {
export function romanize(num: number) {
if (!Number.isFinite(num)) return "NaN"
const digits = Math.trunc(num).toString().split("")
const key = [
"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM",
"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC",
"","I","II","III","IV","V","VI","VII","VIII","IX"
"",
"C",
"CC",
"CCC",
"CD",
"D",
"DC",
"DCC",
"DCCC",
"CM",
"",
"X",
"XX",
"XXX",
"XL",
"L",
"LX",
"LXX",
"LXXX",
"XC",
"",
"I",
"II",
"III",
"IV",
"V",
"VI",
"VII",
"VIII",
"IX"
] as const
let roman = ""

View File

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

View File

@@ -268,3 +268,73 @@ export const skywarsStatsSchema = z.looseObject({
}))
}).optional()
})
export const duelsStatsSchema = z.looseObject({
wins: z.number().default(0),
losses: 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),
all_modes_diamond_title_prestige: z.number().default(-1),
all_modes_master_title_prestige: z.number().default(-1),
all_modes_legend_title_prestige: z.number().default(-1),
all_modes_grandmaster_title_prestige: z.number().default(-1),
all_modes_godlike_title_prestige: z.number().default(-1),
all_modes_celestial_title_prestige: z.number().default(-1),
all_modes_divine_title_prestige: z.number().default(-1),
all_modes_ascended_title_prestige: z.number().default(-1),
uhc_duel_wins: z.number().default(0),
uhc_doubles_wins: z.number().default(0),
uhc_four_wins: z.number().default(0),
uhc_meetup_wins: z.number().default(0),
op_duel_wins: z.number().default(0),
op_doubles_wins: z.number().default(0),
sw_duel_wins: z.number().default(0),
sw_doubles_wins: z.number().default(0),
bow_duel_wins: z.number().default(0),
blitz_duel_wins: z.number().default(0),
mw_duel_wins: z.number().default(0),
mw_doubles_wins: z.number().default(0),
sumo_duel_wins: z.number().default(0),
bowspleef_duel_wins: z.number().default(0),
parkour_eight_wins: z.number().default(0),
boxing_duel_wins: z.number().default(0),
classic_duel_wins: z.number().default(0),
potion_duel_wins: z.number().default(0),
combo_duel_wins: z.number().default(0),
bridge_duel_wins: z.number().default(0),
bridge_doubles_wins: z.number().default(0),
bridge_threes_wins: z.number().default(0),
bridge_four_wins: z.number().default(0),
bridge_2v2v2v2_wins: z.number().default(0),
bridge_3v3v3v3_wins: z.number().default(0),
capture_threes_wins: z.number().default(0),
duel_arena_wins: z.number().default(0),
uhc_duel_losses: z.number().default(0),
uhc_doubles_losses: z.number().default(0),
uhc_four_losses: z.number().default(0),
uhc_meetup_losses: z.number().default(0),
op_duel_losses: z.number().default(0),
op_doubles_losses: z.number().default(0),
sw_duel_losses: z.number().default(0),
sw_doubles_losses: z.number().default(0),
bow_duel_losses: z.number().default(0),
blitz_duel_losses: z.number().default(0),
mw_duel_losses: z.number().default(0),
mw_doubles_losses: z.number().default(0),
sumo_duel_losses: z.number().default(0),
bowspleef_duel_losses: z.number().default(0),
parkour_eight_losses: z.number().default(0),
boxing_duel_losses: z.number().default(0),
classic_duel_losses: z.number().default(0),
potion_duel_losses: z.number().default(0),
combo_duel_losses: z.number().default(0),
bridge_duel_losses: z.number().default(0),
bridge_doubles_losses: z.number().default(0),
bridge_threes_losses: z.number().default(0),
bridge_four_losses: z.number().default(0),
bridge_2v2v2v2_losses: z.number().default(0),
bridge_3v3v3v3_losses: z.number().default(0),
capture_threes_losses: z.number().default(0),
duel_arena_losses: z.number().default(0)
})