107 lines
2.6 KiB
TypeScript
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;
|
|
};
|
|
}
|