diff --git a/backend/src/queues/later-queue.ts b/backend/src/queues/later-queue.ts index 8a556a67e..56993b5ec 100644 --- a/backend/src/queues/later-queue.ts +++ b/backend/src/queues/later-queue.ts @@ -5,24 +5,36 @@ import { getCurrentDayTimestamp, getCurrentWeekTimestamp } from "../utils/misc"; const QUEUE_NAME = "later"; -type LaterTasks = "daily-leaderboard-results" | "weekly-xp-leaderboard-results"; +export type LaterTaskType = + | "daily-leaderboard-results" + | "weekly-xp-leaderboard-results"; -export interface LaterTask { - taskName: LaterTasks; - ctx: any; +export interface LaterTask { + taskName: LaterTaskType; + ctx: LaterTaskContexts[T]; } +export type LaterTaskContexts = { + "daily-leaderboard-results": { + yesterdayTimestamp: number; + modeRule: MonkeyTypes.ValidModeRule; + }; + "weekly-xp-leaderboard-results": { + lastWeekTimestamp: number; + }; +}; + const ONE_MINUTE_IN_MILLISECONDS = 1000 * 60; const ONE_DAY_IN_MILLISECONDS = 1000 * 60 * 60 * 24; -class LaterQueue extends MonkeyQueue { +class LaterQueue extends MonkeyQueue> { private scheduledJobCache = new LRUCache({ max: 100, }); private async scheduleTask( taskName: string, - task: LaterTask, + task: LaterTask, jobId: string, delay: number ): Promise { @@ -41,9 +53,8 @@ class LaterQueue extends MonkeyQueue { } async scheduleForNextWeek( - taskName: LaterTasks, - taskId: string, - taskContext?: any + taskName: LaterTaskType, + taskId: string ): Promise { const currentWeekTimestamp = getCurrentWeekTimestamp(); const jobId = `${taskName}:${currentWeekTimestamp}:${taskId}`; @@ -52,10 +63,9 @@ class LaterQueue extends MonkeyQueue { return; } - const task: LaterTask = { + const task: LaterTask = { taskName, ctx: { - ...taskContext, lastWeekTimestamp: currentWeekTimestamp, }, }; @@ -70,9 +80,9 @@ class LaterQueue extends MonkeyQueue { } async scheduleForTomorrow( - taskName: LaterTasks, + taskName: LaterTaskType, taskId: string, - taskContext: any + modeRule: MonkeyTypes.ValidModeRule ): Promise { const currentDayTimestamp = getCurrentDayTimestamp(); const jobId = `${taskName}:${currentDayTimestamp}:${taskId}`; @@ -81,10 +91,10 @@ class LaterQueue extends MonkeyQueue { return; } - const task: LaterTask = { + const task: LaterTask = { taskName, ctx: { - ...taskContext, + modeRule, yesterdayTimestamp: currentDayTimestamp, }, }; diff --git a/backend/src/utils/daily-leaderboards.ts b/backend/src/utils/daily-leaderboards.ts index 8ae4a7860..79f5645e4 100644 --- a/backend/src/utils/daily-leaderboards.ts +++ b/backend/src/utils/daily-leaderboards.ts @@ -101,9 +101,7 @@ export class DailyLeaderboard { await LaterQueue.scheduleForTomorrow( "daily-leaderboard-results", this.leaderboardModeKey, - { - modeRule: this.modeRule, - } + this.modeRule ); } diff --git a/backend/src/workers/later-worker.ts b/backend/src/workers/later-worker.ts index dacf5c010..5857808c4 100644 --- a/backend/src/workers/later-worker.ts +++ b/backend/src/workers/later-worker.ts @@ -8,21 +8,16 @@ import { buildMonkeyMail } from "../utils/monkey-mail"; import { DailyLeaderboard } from "../utils/daily-leaderboards"; import { getCachedConfiguration } from "../init/configuration"; import { formatSeconds, getOrdinalNumberString, mapRange } from "../utils/misc"; -import LaterQueue, { LaterTask } from "../queues/later-queue"; +import LaterQueue, { + LaterTask, + LaterTaskContexts, + LaterTaskType, +} from "../queues/later-queue"; import { WeeklyXpLeaderboard } from "../services/weekly-xp-leaderboard"; import { recordTimeToCompleteJob } from "../utils/prometheus"; -interface DailyLeaderboardMailContext { - yesterdayTimestamp: number; - modeRule: MonkeyTypes.ValidModeRule; -} - -interface WeeklyXpLeaderboardResultContext { - lastWeekTimestamp: number; -} - async function handleDailyLeaderboardResults( - ctx: DailyLeaderboardMailContext + ctx: LaterTaskContexts["daily-leaderboard-results"] ): Promise { const { yesterdayTimestamp, modeRule } = ctx; const { language, mode, mode2 } = modeRule; @@ -106,7 +101,7 @@ async function handleDailyLeaderboardResults( } async function handleWeeklyXpLeaderboardResults( - ctx: WeeklyXpLeaderboardResultContext + ctx: LaterTaskContexts["weekly-xp-leaderboard-results"] ): Promise { const { leaderboards: { weeklyXp: weeklyXpConfig }, @@ -184,15 +179,18 @@ async function handleWeeklyXpLeaderboardResults( } async function jobHandler(job: Job): Promise { - const { taskName, ctx }: LaterTask = job.data; + const { taskName, ctx }: LaterTask = job.data; + Logger.info(`Starting job: ${taskName}`); const start = performance.now(); if (taskName === "daily-leaderboard-results") { - await handleDailyLeaderboardResults(ctx); + const taskCtx = ctx as LaterTaskContexts["daily-leaderboard-results"]; + await handleDailyLeaderboardResults(taskCtx); } else if (taskName === "weekly-xp-leaderboard-results") { - await handleWeeklyXpLeaderboardResults(ctx); + const taskCtx = ctx as LaterTaskContexts["weekly-xp-leaderboard-results"]; + await handleWeeklyXpLeaderboardResults(taskCtx); } const elapsed = performance.now() - start; diff --git a/frontend/src/ts/elements/scroll-to-top.ts b/frontend/src/ts/elements/scroll-to-top.ts index fa3f7866d..795ec14a4 100644 --- a/frontend/src/ts/elements/scroll-to-top.ts +++ b/frontend/src/ts/elements/scroll-to-top.ts @@ -2,7 +2,7 @@ import * as ActivePage from "../states/active-page"; let visible = false; -$(".scrollToTopButton").on("click", () => { +$(document).on("click", ".scrollToTopButton", () => { window.scrollTo({ top: 0, behavior: "smooth" }); }); diff --git a/frontend/static/html/pages/settings.html b/frontend/static/html/pages/settings.html index 8c5323749..132c4c34b 100644 --- a/frontend/static/html/pages/settings.html +++ b/frontend/static/html/pages/settings.html @@ -2151,6 +2151,31 @@ id="--bg-color" /> + +
+ + + +
- -
- - - -
- +
-