From 83031f652676503e6a2ee5bf69f652242ab2da1b Mon Sep 17 00:00:00 2001 From: Taken Date: Tue, 2 Sep 2025 12:57:29 +0200 Subject: [PATCH] Refactored duels table --- .../player/[ign]/_stats/duels/table.tsx | 596 ++---------------- src/lib/hypixel/duels/duels.ts | 34 +- 2 files changed, 59 insertions(+), 571 deletions(-) diff --git a/src/app/(stats)/player/[ign]/_stats/duels/table.tsx b/src/app/(stats)/player/[ign]/_stats/duels/table.tsx index fb5569e..9fe2133 100644 --- a/src/app/(stats)/player/[ign]/_stats/duels/table.tsx +++ b/src/app/(stats)/player/[ign]/_stats/duels/table.tsx @@ -1,6 +1,6 @@ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { formatNumber } from "@/lib/formatters" -import { getDuelsModeStats, getModeTitle } from "@/lib/hypixel/duels/duels" +import { getBestDuelsMode, getDuelsModeStats, getModeTitle } from "@/lib/hypixel/duels/duels" import { NonNullStats } from "@/lib/schema/player" export default function DuelsStatTable({ stats }: { stats: NonNullStats["Duels"] }) { @@ -8,37 +8,37 @@ export default function DuelsStatTable({ stats }: { stats: NonNullStats["Duels"] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
) @@ -72,529 +72,25 @@ function DuelsTableHeader() { ) } -function Bedwars1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { +function DuelsStat( + { modeId, stats }: { modeId: Parameters[0], stats: NonNullStats["Duels"] } +) { if (!stats) return null - const modeStats = getDuelsModeStats("bedwars_two_one_duels", stats) - const title = getModeTitle("bedwars_two_one_duels") + const modeStats = getDuelsModeStats(modeId, stats) + const title = getModeTitle(modeId) + const bestMode = getBestDuelsMode(stats) === modeId + const divisionLabel = "I" return ( - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function Bedwars1v1RushStats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("bedwars_two_one_duels_rush", stats) - const title = getModeTitle("bedwars_two_one_duels_rush") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function UHC1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("uhc_duel", stats) - const title = getModeTitle("uhc_duel") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function UHC2v2Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("uhc_doubles", stats) - const title = getModeTitle("uhc_doubles") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function UHC4v4Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("uhc_four", stats) - const title = getModeTitle("uhc_four") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function UHCMeetupStats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("uhc_meetup", stats) - const title = getModeTitle("uhc_meetup") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function OP1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("op_duel", stats) - const title = getModeTitle("op_duel") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function OP2v2Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("op_doubles", stats) - const title = getModeTitle("op_doubles") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function SkyWars1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("sw_duel", stats) - const title = getModeTitle("sw_duel") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function SkyWars2v2Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("sw_doubles", stats) - const title = getModeTitle("sw_doubles") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function MegaWalls1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("mw_duel", stats) - const title = getModeTitle("mw_duel") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function MegaWalls2v2Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("mw_doubles", stats) - const title = getModeTitle("mw_doubles") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function Bow1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("bow_duel", stats) - const title = getModeTitle("bow_duel") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function Blitz1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("blitz_duel", stats) - const title = getModeTitle("blitz_duel") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function Sumo1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("sumo_duel", stats) - const title = getModeTitle("sumo_duel") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function BowSpleef1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("bowspleef_duel", stats) - const title = getModeTitle("bowspleef_duel") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function ParkourFFAStats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("parkour_eight", stats) - const title = getModeTitle("parkour_eight") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function Boxing1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("boxing_duel", stats) - const title = getModeTitle("boxing_duel") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function Classic1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("classic_duel", stats) - const title = getModeTitle("classic_duel") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function Classic2v2Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("classic_doubles", stats) - const title = getModeTitle("classic_doubles") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function Potion1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("potion_duel", stats) - const title = getModeTitle("potion_duel") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function Combo1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("combo_duel", stats) - const title = getModeTitle("combo_duel") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function Bridge1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("bridge_duel", stats) - const title = getModeTitle("bridge_duel") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function Bridge2v2Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("bridge_doubles", stats) - const title = getModeTitle("bridge_doubles") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function Bridge3v3Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("bridge_threes", stats) - const title = getModeTitle("bridge_threes") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function Bridge4v4Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("bridge_four", stats) - const title = getModeTitle("bridge_four") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function Bridge2v2v2v2Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("bridge_2v2v2v2", stats) - const title = getModeTitle("bridge_2v2v2v2") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function Bridge3v3v3v3Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("bridge_3v3v3v3", stats) - const title = getModeTitle("bridge_3v3v3v3") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function DuelArenaStats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("duel_arena", stats) - const title = getModeTitle("duel_arena") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function Quake1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("quake_duel", stats) - const title = getModeTitle("quake_duel") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} - - ) -} - -function Spleef1v1Stats({ stats }: { stats: NonNullStats["Duels"] }) { - if (!stats) return null - - const modeStats = getDuelsModeStats("spleef_duel", stats) - const title = getModeTitle("spleef_duel") - - return ( - - {title} - I - {modeStats.map((v, i) => { - return {typeof v === "number" ? formatNumber(v) : v} - })} + {title} + {divisionLabel} + {modeStats.map((v, i) => ( + + {typeof v === "number" ? formatNumber(v) : v} + + ))} ) } diff --git a/src/lib/hypixel/duels/duels.ts b/src/lib/hypixel/duels/duels.ts index 60028d6..1828c11 100644 --- a/src/lib/hypixel/duels/duels.ts +++ b/src/lib/hypixel/duels/duels.ts @@ -46,27 +46,19 @@ export function getMostPlayed(stats: NonNullable) { type Mode = typeof MODES[number]["id"] -// export function getBestMode(stats: NonNullable) { -// const { wins_bedwars: solo } = getBedwarsModeStats("solo", stats, true) -// const { wins_bedwars: doubles } = getBedwarsModeStats("doubles", stats, true) -// const { wins_bedwars: threes } = getBedwarsModeStats("3s", stats, true) -// const { wins_bedwars: fours } = getBedwarsModeStats("4s", stats, true) -// -// const max = Math.max(solo, doubles, threes, fours) -// -// switch (max) { -// case solo: -// return "solo" -// case doubles: -// return "doubles" -// case threes: -// return "3s" -// case fours: -// return "4s" -// default: -// return null -// } -// } +export function getBestDuelsMode(stats: NonNullable) { + let best: typeof MODES[number] | null = null + let mostPlays = 0 + for (const mode of MODES) { + const [, , , wins, losses] = getDuelsModeStats(mode.id, stats) + const plays = (wins as number || 0) + (losses as number || 0) + if (plays > mostPlays) { + mostPlays = plays + best = mode + } + } + return best === null ? null : best.id +} export function getDuelsModeStats(mode: Mode, stats: NonNullable) { return duelsModeStats(mode, stats)