Files
hypixel-stats/src/lib/schema/player.ts
2025-09-05 19:31:06 +02:00

73 lines
2.5 KiB
TypeScript

import z from "zod"
import {
bedwarsStatsSchema,
buildBattleStatsSchema,
duelsStatsSchema,
murderMysteryStatsSchema,
pitStats,
skywarsStatsSchema,
uhcSchema
} from "./stats"
export const playerSchema = z.looseObject({
player: z.looseObject({
displayname: z.string(),
uuid: z.string(),
newPackageRank: z.string().optional(),
monthlyPackageRank: z.string().optional(),
rankPlusColor: z.string().optional(),
monthlyRankColor: z.string().optional(),
networkExp: z.number().default(0),
karma: z.number().default(0),
achievementPoints: z.number().default(0),
achievements: z.record(z.string(), z.number()).optional(),
stats: z.looseObject({
Bedwars: bedwarsStatsSchema.optional(),
SkyWars: skywarsStatsSchema.optional(),
Duels: duelsStatsSchema.optional(),
MurderMystery: murderMysteryStatsSchema.optional(),
BuildBattle: buildBattleStatsSchema.optional(),
UHC: uhcSchema.optional(),
Pit: pitStats.optional()
}).optional(),
quests: z.record(
z.string(),
z.looseObject({
completions: z.array(
z.looseObject({
time: z.number()
})
).optional()
})
).optional(),
challenges: z.looseObject({
all_time: z.record(z.string(), z.number())
}).optional(),
lastClaimedReward: z.number().optional(),
rewardHighScore: z.number().optional(),
rewardStreak: z.number().optional(),
totalRewards: z.number().optional(),
giftingMeta: z.looseObject({
giftsGiven: z.number().optional(),
ranksGiven: z.number().optional()
}).optional(),
firstLogin: z.number().optional(),
lastLogin: z.number().optional(),
lastLogout: z.number().optional(),
socialMedia: z.looseObject({
links: z.looseObject({
DISCORD: z.string().optional(),
TWITCH: z.string().optional(),
HYPIXEL: z.string().optional(),
TWITTER: z.string().optional(),
YOUTUBE: z.string().optional()
}).optional()
}).optional(),
rank: z.string().optional(),
eulaCoins: z.boolean().optional()
})
})
export type Player = z.infer<typeof playerSchema>
export type NonNullStats = NonNullable<Player["player"]["stats"]>