mirror of
https://github.com/monkeytypegame/monkeytype.git
synced 2025-12-09 12:56:07 +08:00
parent
a0d7af31d8
commit
85606bcb6c
3 changed files with 39 additions and 33 deletions
|
|
@ -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<T extends LaterTaskType> {
|
||||
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<LaterTask> {
|
||||
class LaterQueue extends MonkeyQueue<LaterTask<LaterTaskType>> {
|
||||
private scheduledJobCache = new LRUCache<string, boolean>({
|
||||
max: 100,
|
||||
});
|
||||
|
||||
private async scheduleTask(
|
||||
taskName: string,
|
||||
task: LaterTask,
|
||||
task: LaterTask<LaterTaskType>,
|
||||
jobId: string,
|
||||
delay: number
|
||||
): Promise<void> {
|
||||
|
|
@ -41,9 +53,8 @@ class LaterQueue extends MonkeyQueue<LaterTask> {
|
|||
}
|
||||
|
||||
async scheduleForNextWeek(
|
||||
taskName: LaterTasks,
|
||||
taskId: string,
|
||||
taskContext?: any
|
||||
taskName: LaterTaskType,
|
||||
taskId: string
|
||||
): Promise<void> {
|
||||
const currentWeekTimestamp = getCurrentWeekTimestamp();
|
||||
const jobId = `${taskName}:${currentWeekTimestamp}:${taskId}`;
|
||||
|
|
@ -52,10 +63,9 @@ class LaterQueue extends MonkeyQueue<LaterTask> {
|
|||
return;
|
||||
}
|
||||
|
||||
const task: LaterTask = {
|
||||
const task: LaterTask<LaterTaskType> = {
|
||||
taskName,
|
||||
ctx: {
|
||||
...taskContext,
|
||||
lastWeekTimestamp: currentWeekTimestamp,
|
||||
},
|
||||
};
|
||||
|
|
@ -70,9 +80,9 @@ class LaterQueue extends MonkeyQueue<LaterTask> {
|
|||
}
|
||||
|
||||
async scheduleForTomorrow(
|
||||
taskName: LaterTasks,
|
||||
taskName: LaterTaskType,
|
||||
taskId: string,
|
||||
taskContext: any
|
||||
modeRule: MonkeyTypes.ValidModeRule
|
||||
): Promise<void> {
|
||||
const currentDayTimestamp = getCurrentDayTimestamp();
|
||||
const jobId = `${taskName}:${currentDayTimestamp}:${taskId}`;
|
||||
|
|
@ -81,10 +91,10 @@ class LaterQueue extends MonkeyQueue<LaterTask> {
|
|||
return;
|
||||
}
|
||||
|
||||
const task: LaterTask = {
|
||||
const task: LaterTask<LaterTaskType> = {
|
||||
taskName,
|
||||
ctx: {
|
||||
...taskContext,
|
||||
modeRule,
|
||||
yesterdayTimestamp: currentDayTimestamp,
|
||||
},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -101,9 +101,7 @@ export class DailyLeaderboard {
|
|||
await LaterQueue.scheduleForTomorrow(
|
||||
"daily-leaderboard-results",
|
||||
this.leaderboardModeKey,
|
||||
{
|
||||
modeRule: this.modeRule,
|
||||
}
|
||||
this.modeRule
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<void> {
|
||||
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<void> {
|
||||
const {
|
||||
leaderboards: { weeklyXp: weeklyXpConfig },
|
||||
|
|
@ -184,15 +179,18 @@ async function handleWeeklyXpLeaderboardResults(
|
|||
}
|
||||
|
||||
async function jobHandler(job: Job): Promise<void> {
|
||||
const { taskName, ctx }: LaterTask = job.data;
|
||||
const { taskName, ctx }: LaterTask<LaterTaskType> = 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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue