import { gameAdmissionDenialReason } from "@minecraft-account-manager/auth"; import { admissionDenialMessage, renderAdmissionMessage, type AdmissionMessages, } from "./admission-settings"; import { evaluateGroupSchedule, formatScheduleInstant, type WeeklyAccessWindow, } from "./group-schedule"; interface EffectiveGroupPolicy { name: string; accessEnabled: boolean; anonymizedNetworksAllowed: boolean; } interface RegisteredPlayerAdmissionInput { group: EffectiveGroupPolicy | null; windows: WeeklyAccessWindow[]; classification: "unknown" | "clear" | "vpn" | "proxy" | "hosting" | "tor"; now: Date; player: string; messages: AdmissionMessages; } export function evaluateRegisteredPlayerAdmission(input: RegisteredPlayerAdmissionInput) { const schedule = evaluateGroupSchedule(input.windows, input.now); const reason = gameAdmissionDenialReason(input.group, input.classification, schedule.allowed); if (!reason) return { allowed: true as const, reason: null, message: null, nextWindow: null }; return { allowed: false as const, reason, message: renderAdmissionMessage(admissionDenialMessage(reason, input.messages), { player: input.player, group: input.group?.name ?? "everyone", next_start: schedule.nextWindow ? formatScheduleInstant(schedule.nextWindow.start) : "unavailable", next_end: schedule.nextWindow ? formatScheduleInstant(schedule.nextWindow.end) : "unavailable", }), nextWindow: schedule.nextWindow, }; }