SpaceNinjaServer/src/services/leaderboardService.ts

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;
};