From 9d3b127adcedd0341c5ec0385540c684924ca135 Mon Sep 17 00:00:00 2001 From: Raymond <101374892+raymonable@users.noreply.github.com> Date: Wed, 7 May 2025 00:05:39 -0400 Subject: [PATCH 1/5] feat: :construction: song leaderboard --- src/lib/api/game.ts | 12 ++++ src/lib/i18n/en/index.ts | 3 +- src/lib/i18n/i18n-types.ts | 13 +++- .../(app)/(nonuser)/home/+page.server.ts | 18 ++++- src/routes/(app)/(nonuser)/home/+page.svelte | 22 +----- .../(nonuser)/home/SongLeaderboard.svelte | 70 +++++++++++++++++++ 6 files changed, 114 insertions(+), 24 deletions(-) create mode 100644 src/routes/(app)/(nonuser)/home/SongLeaderboard.svelte diff --git a/src/lib/api/game.ts b/src/lib/api/game.ts index 7b099d9f..7fdd88bc 100644 --- a/src/lib/api/game.ts +++ b/src/lib/api/game.ts @@ -53,6 +53,11 @@ export interface RankedUser { lastSeen: string } +export interface PopularSongItem { + musicId: number, + weight: number +} + const Routes = { ...Slug( { @@ -89,6 +94,13 @@ const Routes = { }) }, response: Json() + }, + "{}/song-pop": { + authenticated: false, + request: { + method: "GET" + }, + response: Json() } }, games diff --git a/src/lib/i18n/en/index.ts b/src/lib/i18n/en/index.ts index 0467ced0..4a6c0422 100644 --- a/src/lib/i18n/en/index.ts +++ b/src/lib/i18n/en/index.ts @@ -110,7 +110,8 @@ const en = { }, home: { welcome: "Hello, {name:string}!", - songLeaderboard: "{game:string} Top 10 songs", + songLeaderboard: "{game:string} Global Song Leaderboard", + playsSuffix: "{plays:number} plays", banner: { title: "Welcome to {aquanet: string}", description: diff --git a/src/lib/i18n/i18n-types.ts b/src/lib/i18n/i18n-types.ts index 26b8004b..def0eec3 100644 --- a/src/lib/i18n/i18n-types.ts +++ b/src/lib/i18n/i18n-types.ts @@ -330,10 +330,15 @@ type RootTranslation = { */ welcome: RequiredParams<'name'> /** - * {​g​a​m​e​}​ ​T​o​p​ ​1​0​ ​s​o​n​g​s + * {​g​a​m​e​}​ ​G​l​o​b​a​l​ ​S​o​n​g​ ​L​e​a​d​e​r​b​o​a​r​d * @param {string} game */ songLeaderboard: RequiredParams<'game'> + /** + * {​p​l​a​y​s​}​ ​p​l​a​y​s + * @param {number} plays + */ + playsSuffix: RequiredParams<'plays'> banner: { /** * W​e​l​c​o​m​e​ ​t​o​ ​{​a​q​u​a​n​e​t​} @@ -998,9 +1003,13 @@ export type TranslationFunctions = { */ welcome: (arg: { name: string }) => LocalizedString /** - * {game} Top 10 songs + * {game} Global Song Leaderboard */ songLeaderboard: (arg: { game: string }) => LocalizedString + /** + * {plays} plays + */ + playsSuffix: (arg: { plays: number }) => LocalizedString banner: { /** * Welcome to {aquanet} diff --git a/src/routes/(app)/(nonuser)/home/+page.server.ts b/src/routes/(app)/(nonuser)/home/+page.server.ts index c90635f4..1e7043d2 100644 --- a/src/routes/(app)/(nonuser)/home/+page.server.ts +++ b/src/routes/(app)/(nonuser)/home/+page.server.ts @@ -1,5 +1,21 @@ +import { api } from "$lib/api" +import { music } from "$lib/api/data" +import { coerceToGame } from "$lib/app/formatting.js" +import pickKeys from "$lib/utility/pickKeys" import { redirect } from "@sveltejs/kit" -export function load({ locals: { user } }) { +export async function load({ locals: { user }, parent }) { if (!user) throw redirect(307, "/") + + const { cardUserGames, activeGame } = await parent() + const targetGame = coerceToGame(activeGame) || "mai2" + + let songLeaderboard = (await api(`game/${targetGame}/song-pop`, {})).slice(0, 10) + + return { + songLeaderboard, + music: pickKeys(await music(targetGame!), + songLeaderboard.map(v => v.musicId) + ) + } } diff --git a/src/routes/(app)/(nonuser)/home/+page.svelte b/src/routes/(app)/(nonuser)/home/+page.svelte index 7f6c733d..bd92fe1e 100644 --- a/src/routes/(app)/(nonuser)/home/+page.svelte +++ b/src/routes/(app)/(nonuser)/home/+page.svelte @@ -7,6 +7,7 @@ import Header from "$lib/components/Header.svelte" import LL from "$lib/i18n/i18n-svelte"; + import SongLeaderboard from "./SongLeaderboard.svelte" let { data } = $props(); @@ -25,23 +26,4 @@

{$LL.home.songLeaderboard({game: $LL.games[data.activeGame as keyof typeof $LL.games]()})}

-
- {#each {length: 10} as _} - - {/each} -
- \ No newline at end of file + \ No newline at end of file diff --git a/src/routes/(app)/(nonuser)/home/SongLeaderboard.svelte b/src/routes/(app)/(nonuser)/home/SongLeaderboard.svelte new file mode 100644 index 00000000..7d98baf8 --- /dev/null +++ b/src/routes/(app)/(nonuser)/home/SongLeaderboard.svelte @@ -0,0 +1,70 @@ + +
+ {#each songLeaderboard as song, index} +
+ Jacket + Background + +
+ {index + 1}. {music[song.musicId]?.name ?? "unknown"} +
+
+ {$LL.home.playsSuffix({plays: song.weight})} +
+
+ {/each} +
+ \ No newline at end of file From 0df1f920f549b6de5d608f30fd849365e8846b04 Mon Sep 17 00:00:00 2001 From: Raymond <101374892+raymonable@users.noreply.github.com> Date: Wed, 7 May 2025 00:26:04 -0400 Subject: [PATCH 2/5] fix: :rocket: "performance optimizations" :troll: --- src/routes/(app)/(nonuser)/home/+page.server.ts | 2 +- .../(app)/(nonuser)/home/SongLeaderboard.svelte | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/routes/(app)/(nonuser)/home/+page.server.ts b/src/routes/(app)/(nonuser)/home/+page.server.ts index 1e7043d2..bda41bc5 100644 --- a/src/routes/(app)/(nonuser)/home/+page.server.ts +++ b/src/routes/(app)/(nonuser)/home/+page.server.ts @@ -10,7 +10,7 @@ export async function load({ locals: { user }, parent }) { const { cardUserGames, activeGame } = await parent() const targetGame = coerceToGame(activeGame) || "mai2" - let songLeaderboard = (await api(`game/${targetGame}/song-pop`, {})).slice(0, 10) + let songLeaderboard = (await api(`game/${targetGame}/song-pop`, {})).slice(0, 5) return { songLeaderboard, diff --git a/src/routes/(app)/(nonuser)/home/SongLeaderboard.svelte b/src/routes/(app)/(nonuser)/home/SongLeaderboard.svelte index 7d98baf8..af531780 100644 --- a/src/routes/(app)/(nonuser)/home/SongLeaderboard.svelte +++ b/src/routes/(app)/(nonuser)/home/SongLeaderboard.svelte @@ -14,7 +14,7 @@
{index + 1}. {music[song.musicId]?.name ?? "unknown"}
-
+
{$LL.home.playsSuffix({plays: song.weight})}
@@ -23,9 +23,10 @@