Add player leaderboard and homepage preview

This commit is contained in:
2026-10-06 15:21:49 +05:00
parent 2bbf5ae2c0
commit 949aa6627a
25 changed files with 2363 additions and 28 deletions

View File

@@ -520,6 +520,15 @@ export type Database = {
[_ in never]: never;
};
Functions: {
player_leaderboard: {
Args: {
p_difficulty?: string;
p_search?: string;
p_page?: number;
p_limit?: number;
};
Returns: Json;
};
submit_content_report: {
Args: {
p_dataset: string;

54
shared/leaderboard.ts Normal file
View File

@@ -0,0 +1,54 @@
export const leaderboardDifficulties = [
"all",
"easy",
"normal",
"hard",
] as const;
export type LeaderboardDifficulty = (typeof leaderboardDifficulties)[number];
export type LeaderboardEntry = {
rank: number;
player_id: string;
display_name: string;
best_score: number;
average_score: number;
games_played: number;
};
export type LeaderboardData = {
entries: LeaderboardEntry[];
leaders: LeaderboardEntry[];
total_players: number;
total_games: number;
matching_players: number;
page: number;
pages: number;
};
export function leaderboardFilters(
params: Record<string, string | string[] | undefined>,
) {
const difficulty =
leaderboardDifficulties.find((value) => value === params.difficulty) ??
"all";
const search =
typeof params.q === "string" ? params.q.trim().slice(0, 64) : "";
const rawPage = typeof params.page === "string" ? Number(params.page) : 1;
const page =
Number.isSafeInteger(rawPage) && rawPage > 0
? Math.min(rawPage, 1_000_000)
: 1;
return { difficulty, search, page };
}
export function leaderboardHref(
difficulty: LeaderboardDifficulty,
search = "",
page = 1,
) {
const params = new URLSearchParams();
if (difficulty !== "all") params.set("difficulty", difficulty);
if (search) params.set("q", search);
if (page > 1) params.set("page", String(page));
return `/leaderboard${params.size ? `?${params}` : ""}`;
}
export const formatScore = (score: number) => score.toLocaleString("en-US");