forked from OpenWF/SpaceNinjaServer
50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
|
import { toOid } from "../helpers/inventoryHelpers";
|
||
|
import { Leaderboard } from "../models/leaderboardModel";
|
||
|
import { ILeaderboardEntryClient } from "../types/leaderboardTypes";
|
||
|
|
||
|
export const submitLeaderboardScore = async (
|
||
|
leaderboard: string,
|
||
|
displayName: string,
|
||
|
score: number
|
||
|
): Promise<void> => {
|
||
|
const schedule = leaderboard.split(".")[0] as "daily" | "weekly";
|
||
|
let expiry: Date;
|
||
|
if (schedule == "daily") {
|
||
|
expiry = new Date(Math.trunc(Date.now() / 86400000) * 86400000 + 86400000);
|
||
|
} else {
|
||
|
const EPOCH = 1734307200 * 1000; // Monday
|
||
|
const day = Math.trunc((Date.now() - EPOCH) / 86400000);
|
||
|
const week = Math.trunc(day / 7);
|
||
|
const weekStart = EPOCH + week * 604800000;
|
||
|
const weekEnd = weekStart + 604800000;
|
||
|
expiry = new Date(weekEnd);
|
||
|
}
|
||
|
await Leaderboard.findOneAndUpdate(
|
||
|
{ leaderboard, displayName },
|
||
|
{ $max: { score }, $set: { expiry } },
|
||
|
{ upsert: true }
|
||
|
);
|
||
|
};
|
||
|
|
||
|
export const getLeaderboard = async (
|
||
|
leaderboard: string,
|
||
|
before: number,
|
||
|
after: number
|
||
|
): Promise<ILeaderboardEntryClient[]> => {
|
||
|
const entries = await Leaderboard.find({ leaderboard })
|
||
|
.sort({ score: -1 })
|
||
|
.skip(before)
|
||
|
.limit(after - before);
|
||
|
const res: ILeaderboardEntryClient[] = [];
|
||
|
let r = before;
|
||
|
for (const entry of entries) {
|
||
|
res.push({
|
||
|
_id: toOid(entry._id),
|
||
|
s: entry.score,
|
||
|
r: ++r,
|
||
|
n: entry.displayName
|
||
|
});
|
||
|
}
|
||
|
return res;
|
||
|
};
|