44 lines
1.5 KiB
TypeScript
44 lines
1.5 KiB
TypeScript
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,
|
|
};
|
|
}
|