sendou.ink/scripts/check-season-status.ts
2025-11-25 20:49:47 +02:00

87 lines
2.5 KiB
TypeScript

import "dotenv/config";
import { db } from "~/db/sql";
import * as Seasons from "~/features/mmr/core/Seasons";
import invariant from "~/utils/invariant";
import { logger } from "~/utils/logger";
const rawNth = process.argv[2]?.trim();
const season = rawNth
? (() => {
const nth = Number(rawNth);
invariant(!Number.isNaN(nth), "nth must be a number");
const seasonData = Seasons.list.find((s) => s.nth === nth);
invariant(seasonData, `Season ${nth} not found`);
return seasonData;
})()
: Seasons.currentOrPrevious();
invariant(season, "No season found");
logger.info(`Checking status for season ${season.nth}`);
logger.info(
`Season period: ${season.starts.toISOString()} - ${season.ends.toISOString()}`,
);
const activeMatches = await db
.selectFrom("GroupMatch")
.leftJoin("Skill", "Skill.groupMatchId", "GroupMatch.id")
.select("GroupMatch.id")
.where("Skill.id", "is", null)
.execute();
const activeMatchIds = activeMatches.map((row) => row.id);
if (activeMatchIds.length > 0) {
logger.info(
`Active matches (${activeMatchIds.length}): ${activeMatchIds.join(", ")}`,
);
} else {
logger.info("No active matches found");
}
const seasonStartTimestamp = Math.floor(season.starts.getTime() / 1000);
const seasonEndTimestamp = Math.floor(season.ends.getTime() / 1000);
const tournaments = await db
.selectFrom("Tournament")
.innerJoin("CalendarEvent", "CalendarEvent.tournamentId", "Tournament.id")
.innerJoin(
"CalendarEventDate",
"CalendarEventDate.eventId",
"CalendarEvent.id",
)
.select([
"Tournament.id",
"Tournament.settings",
"Tournament.isFinalized",
"CalendarEvent.name",
"CalendarEventDate.startTime",
])
.where("CalendarEventDate.startTime", ">=", seasonStartTimestamp)
.where("CalendarEventDate.startTime", "<=", seasonEndTimestamp)
.orderBy("CalendarEventDate.startTime")
.execute();
const unfinalizedTournaments = tournaments.filter(
(t) => t.settings.isRanked && !t.settings.isTest && !t.isFinalized,
);
if (unfinalizedTournaments.length > 0) {
logger.info(
`Unfinalized ranked tournaments (${unfinalizedTournaments.length}):`,
);
for (const tournament of unfinalizedTournaments) {
const date = new Date(tournament.startTime * 1000).toISOString();
logger.info(` - ID ${tournament.id}: "${tournament.name}" (${date})`);
}
} else {
logger.info("No unfinalized ranked tournaments found");
}
if (activeMatchIds.length > 0 || unfinalizedTournaments.length > 0) {
logger.warn("Season cannot be closed yet");
} else {
logger.info("Season is ready to be closed");
}