export const leaderboardMetrics = [ { key: 'highestRound', label: 'Highest round' }, { key: 'kills', label: 'Total kills' }, { key: 'roundsSurvived', label: 'Total rounds' }, { key: 'headshots', label: 'Headshots' }, { key: 'revives', label: 'Revives' }, { key: 'downs', label: 'Downs' }, { key: 'gamesPlayed', label: 'Games played' }, { key: 'gamesCompleted', label: 'Games completed' }, { key: 'bestKills', label: 'Best game kills' }, { key: 'bestScore', label: 'Highest reported score' } ] as const; export type LeaderboardMetric = typeof leaderboardMetrics[number]['key']; export type PlayerStats = Record; export interface PlayerMapRecord extends PlayerStats { game: string; key: string; name: string; lastSeen: string; } export interface PlayerMatch { id: number; game: string; server: string; server_deleted_at?: string | null; mapName: string; startedAt: string; lastSeen: string; status: 'active' | 'completed' | 'interrupted'; completed: number; highestRound: number; roundsSurvived: number; kills: number; headshots: number; revives: number; downs: number; bestScore: number; } export interface PlayerProfile { guid: string; name: string; firstSeen: string; lastSeen: string; stats: PlayerStats; maps: PlayerMapRecord[]; matches: PlayerMatch[]; offset: number; limit: number; } export function playerProfileHref(guid: string): string { return `/leaderboard/players/${encodeURIComponent(guid)}`; } export interface LeaderboardEntry { rank: number; guid: string; name: string; highestRound: number; kills: number; roundsSurvived: number; headshots: number; revives: number; downs: number; gamesPlayed: number; gamesCompleted: number; bestKills: number; bestScore: number; lastSeen: string; } export interface LeaderboardMap { key: string; game: string; map: string; name: string; } export interface LeaderboardOptions { game?: string; map?: string; metric?: LeaderboardMetric; q?: string; limit?: number; offset?: number; } export interface LeaderboardResponse { entries: LeaderboardEntry[]; maps: LeaderboardMap[]; total: number; limit: number; offset: number; metric: LeaderboardMetric; summary: { players: number; matches: number; kills: number; roundsSurvived: number; highestRound: number; firstTrackedAt: string | null; updatedAt: string | null; }; }