From 29f9b305e7773af874345307e807b822e60f1f8d Mon Sep 17 00:00:00 2001 From: Liam Date: Fri, 11 Oct 2024 18:42:46 +0100 Subject: [PATCH] track top 10 pages, untested but it should work --- projects/backend/src/index.ts | 39 ++++++++++++------- .../backend/src/service/player.service.ts | 8 +++- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/projects/backend/src/index.ts b/projects/backend/src/index.ts index 116dd5f..87177d4 100644 --- a/projects/backend/src/index.ts +++ b/projects/backend/src/index.ts @@ -35,22 +35,33 @@ app.use( pattern: "1 0 * * *", // Every day at 00:01 (London time) timezone: "Europe/London", run: async () => { - console.log("Fetching first page of players from ScoreSaber..."); - const page = await scoresaberService.lookupPlayers(1); - if (page === undefined) { - console.log("Failed to fetch players from ScoreSaber"); - return; - } - for (const player of page.players) { - await PlayerService.getPlayer(player.id, true); - } - console.log("All players on the front page are now being tracked :)"); + const pages = 10; + let toTrack: PlayerDocument[] = await PlayerModel.find({}); + const toRemoveIds: string[] = []; - // --- + // loop through pages to fetch the top players + console.log(`Fetching ${pages} pages of players from ScoreSaber...`); + for (let i = 0; i < pages; i++) { + const pageNumber = i + 1; + console.log(`Fetching page ${pageNumber}...`); + const page = await scoresaberService.lookupPlayers(pageNumber); + if (page === undefined) { + console.log(`Failed to fetch players on page ${pageNumber}, skipping page...`); + continue; + } + for (const player of page.players) { + const foundPlayer = await PlayerService.getPlayer(player.id, true); + await PlayerService.trackScoreSaberPlayer(foundPlayer, player); + toRemoveIds.push(foundPlayer.id); + } + } + console.log(`Finished tracking player statistics for ${pages} pages, found ${toRemoveIds.length} players.`); - console.log("Tracking player statistics..."); - const players: PlayerDocument[] = await PlayerModel.find({}); - for (const player of players) { + // remove all players that have been tracked + toTrack = toTrack.filter(player => !toRemoveIds.includes(player.id)); + + console.log(`Tracking ${toTrack.length} player statistics...`); + for (const player of toTrack) { await PlayerService.trackScoreSaberPlayer(player); } console.log("Finished tracking player statistics."); diff --git a/projects/backend/src/service/player.service.ts b/projects/backend/src/service/player.service.ts index 3ea68cb..89d608c 100644 --- a/projects/backend/src/service/player.service.ts +++ b/projects/backend/src/service/player.service.ts @@ -67,10 +67,14 @@ export class PlayerService { * Tracks a players statistics * * @param foundPlayer the player to track + * @param playerToken an optional player token */ - public static async trackScoreSaberPlayer(foundPlayer: PlayerDocument) { + public static async trackScoreSaberPlayer( + foundPlayer: PlayerDocument, + playerToken?: ScoreSaberPlayerToken + ): Promise { const dateToday = getMidnightAlignedDate(new Date()); - const player = await scoresaberService.lookupPlayer(foundPlayer.id); + const player = playerToken ? playerToken : await scoresaberService.lookupPlayer(foundPlayer.id); if (player == undefined) { console.log(`Player "${foundPlayer.id}" not found on ScoreSaber`); return;