mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-03-29 13:54:45 -05:00
57 lines
1.9 KiB
TypeScript
57 lines
1.9 KiB
TypeScript
import { addPendingPlusTiers } from "~/features/leaderboards/core/leaderboards.server";
|
|
import { userSPLeaderboard } from "~/features/leaderboards/queries/userSPLeaderboard.server";
|
|
import * as Seasons from "~/features/mmr/core/Seasons";
|
|
import { seasonToVotingRange } from "~/features/plus-voting/core/voting-time";
|
|
import * as PlusVotingRepository from "~/features/plus-voting/PlusVotingRepository.server";
|
|
import invariant from "~/utils/invariant";
|
|
import { userIsBanned } from "../../ban/core/banned.server";
|
|
|
|
export async function plusTiersFromVotingAndLeaderboard() {
|
|
const newMembersFromVoting =
|
|
await PlusVotingRepository.allPlusTiersFromLatestVoting();
|
|
const newMembersFromLeaderboard = fromLeaderboard(newMembersFromVoting);
|
|
return [
|
|
...newMembersFromLeaderboard,
|
|
// filter to ensure that user gets their highest tier
|
|
...newMembersFromVoting.filter(
|
|
(member) =>
|
|
!newMembersFromLeaderboard.some(
|
|
(leaderboardMember) => leaderboardMember.userId === member.userId,
|
|
),
|
|
),
|
|
].filter(({ userId }) => !userIsBanned(userId));
|
|
}
|
|
|
|
function fromLeaderboard(
|
|
newMembersFromVoting: Array<{ userId: number; plusTier: number }>,
|
|
) {
|
|
const now = new Date();
|
|
const lastCompletedSeason = Seasons.previous();
|
|
invariant(lastCompletedSeason, "No previous season found");
|
|
|
|
const currSeason = Seasons.current();
|
|
if (currSeason) {
|
|
const range = seasonToVotingRange(currSeason);
|
|
|
|
// we are in the period of a season where the season's voting
|
|
// has ended but we don't yet have the latest leaderboard results
|
|
// -> last season's results are no longer valid
|
|
if (range.endDate < now) return [];
|
|
}
|
|
|
|
const leaderboard = addPendingPlusTiers(
|
|
userSPLeaderboard(lastCompletedSeason.nth),
|
|
newMembersFromVoting,
|
|
lastCompletedSeason.nth,
|
|
);
|
|
|
|
return leaderboard.flatMap((entry) => {
|
|
if (!entry.pendingPlusTier) return [];
|
|
|
|
return {
|
|
userId: entry.id,
|
|
plusTier: entry.pendingPlusTier,
|
|
};
|
|
});
|
|
}
|