mirror of
https://github.com/monkeytypegame/monkeytype.git
synced 2024-09-22 16:26:18 +08:00
Merge branch 'master' into newads
This commit is contained in:
commit
c32005ac2b
|
@ -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;
|
||||
|
|
|
@ -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" });
|
||||
});
|
||||
|
||||
|
|
|
@ -2151,6 +2151,31 @@
|
|||
id="--bg-color"
|
||||
/>
|
||||
</div>
|
||||
<label class="colorText">sub alt</label>
|
||||
<div class="colorPicker inputAndButton">
|
||||
<input
|
||||
type="text"
|
||||
value="#000000"
|
||||
class="input"
|
||||
id="--sub-alt-color-txt"
|
||||
/>
|
||||
<label
|
||||
for="--sub-alt-color"
|
||||
class="button"
|
||||
style="
|
||||
color: var(--text-color);
|
||||
background: var(--sub-alt-color);
|
||||
"
|
||||
>
|
||||
<i class="fas fa-fw fa-palette"></i>
|
||||
</label>
|
||||
<input
|
||||
type="color"
|
||||
class="color"
|
||||
value="#000000"
|
||||
id="--sub-alt-color"
|
||||
/>
|
||||
</div>
|
||||
<label class="colorText">main</label>
|
||||
<div class="colorPicker inputAndButton">
|
||||
<input
|
||||
|
@ -2169,24 +2194,6 @@
|
|||
id="--main-color"
|
||||
/>
|
||||
</div>
|
||||
<label class="colorText">caret</label>
|
||||
<div class="colorPicker inputAndButton">
|
||||
<input
|
||||
type="text"
|
||||
value="#000000"
|
||||
class="input"
|
||||
id="--caret-color-txt"
|
||||
/>
|
||||
<label for="--caret-color" class="button">
|
||||
<i class="fas fa-fw fa-palette"></i>
|
||||
</label>
|
||||
<input
|
||||
type="color"
|
||||
class="color"
|
||||
value="#000000"
|
||||
id="--caret-color"
|
||||
/>
|
||||
</div>
|
||||
<label class="colorText">sub</label>
|
||||
<div class="colorPicker inputAndButton">
|
||||
<input
|
||||
|
@ -2205,22 +2212,22 @@
|
|||
id="--sub-color"
|
||||
/>
|
||||
</div>
|
||||
<label class="colorText">sub alt</label>
|
||||
<label class="colorText">caret</label>
|
||||
<div class="colorPicker inputAndButton">
|
||||
<input
|
||||
type="text"
|
||||
value="#000000"
|
||||
class="input"
|
||||
id="--sub-alt-color-txt"
|
||||
id="--caret-color-txt"
|
||||
/>
|
||||
<label for="--sub-alt-color" class="button">
|
||||
<label for="--caret-color" class="button">
|
||||
<i class="fas fa-fw fa-palette"></i>
|
||||
</label>
|
||||
<input
|
||||
type="color"
|
||||
class="color"
|
||||
value="#000000"
|
||||
id="--sub-alt-color"
|
||||
id="--caret-color"
|
||||
/>
|
||||
</div>
|
||||
<label class="colorText">text</label>
|
||||
|
|
Loading…
Reference in a new issue