mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-03-21 18:04:39 -05:00
87 lines
2.5 KiB
TypeScript
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");
|
|
}
|