mirror of
https://github.com/monkeytypegame/monkeytype.git
synced 2025-10-17 11:06:17 +08:00
Leaderboard update flag (#2676)
* blocking leaderboard get requests if lb is updating * locking lb while its updating * brackets
This commit is contained in:
parent
6b12ba3900
commit
9e41df2158
3 changed files with 21 additions and 2 deletions
|
@ -17,7 +17,15 @@ class LeaderboardsController {
|
|||
queryLimit
|
||||
);
|
||||
|
||||
const normalizedLeaderboard = _.map(leaderboard, (entry) => {
|
||||
if (leaderboard === false) {
|
||||
return new MonkeyResponse(
|
||||
"Leaderboard is currently updating. Please try again in a few seconds.",
|
||||
null,
|
||||
503
|
||||
);
|
||||
}
|
||||
|
||||
const normalizedLeaderboard = _.map(leaderboard as any[], (entry) => {
|
||||
return uid && entry.uid === uid
|
||||
? entry
|
||||
: _.omit(entry, ["discordId", "uid", "difficulty", "language"]);
|
||||
|
|
|
@ -2,8 +2,11 @@ import db from "../init/db";
|
|||
import Logger from "../utils/logger";
|
||||
import { performance } from "perf_hooks";
|
||||
|
||||
const leaderboardUpdating = {};
|
||||
|
||||
class LeaderboardsDAO {
|
||||
static async get(mode, mode2, language, skip, limit = 50) {
|
||||
if (leaderboardUpdating[`${language}_${mode}_${mode2}`]) return false;
|
||||
if (limit > 50 || limit <= 0) limit = 50;
|
||||
if (skip < 0) skip = 0;
|
||||
const preset = await db
|
||||
|
@ -83,6 +86,7 @@ class LeaderboardsDAO {
|
|||
});
|
||||
let end2 = performance.now();
|
||||
let start3 = performance.now();
|
||||
leaderboardUpdating[`${language}_${mode}_${mode2}`] = true;
|
||||
try {
|
||||
await db.collection(`leaderboards.${language}.${mode}.${mode2}`).drop();
|
||||
} catch (e) {}
|
||||
|
@ -103,6 +107,7 @@ class LeaderboardsDAO {
|
|||
.createIndex({
|
||||
rank: 1,
|
||||
});
|
||||
leaderboardUpdating[`${language}_${mode}_${mode2}`] = false;
|
||||
let end4 = performance.now();
|
||||
|
||||
let timeToRunAggregate = (end1 - start1) / 1000;
|
||||
|
|
|
@ -8,7 +8,13 @@ const RECENT_AGE_MINUTES = 10;
|
|||
const RECENT_AGE_MILLISECONDS = RECENT_AGE_MINUTES * 60 * 1000;
|
||||
|
||||
async function getTop10(leaderboardTime: string): Promise<WithId<Document>[]> {
|
||||
return await LeaderboardsDAO.get("time", leaderboardTime, "english", 0, 10);
|
||||
return (await LeaderboardsDAO.get(
|
||||
"time",
|
||||
leaderboardTime,
|
||||
"english",
|
||||
0,
|
||||
10
|
||||
)) as any[];
|
||||
}
|
||||
|
||||
async function updateLeaderboardAndNotifyChanges(
|
||||
|
|
Loading…
Add table
Reference in a new issue