Files
electric-cherry/src/lib/leaderboard.ts
T

107 lines
2.6 KiB
TypeScript

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<LeaderboardMetric, number>;
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;
};
}