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