import * as z from 'zod'; export enum ConfigFile { configuration = 'configuration.json', assistRules = 'assistRules.json', event = 'event.json', eventRules = 'eventRules.json', settings = 'settings.json' } export const configFileSchema = z.enum(ConfigFile); export enum ServerTab { statistics = 'statistics', configuration = 'configuration', assistRules = 'assistRules', event = 'event', eventRules = 'eventRules', settings = 'settings', leaderboard = 'leaderboard' } export const serverTabSchema = z.enum(ServerTab); export const configurationSchema = z.object({ udpPort: z.number().min(1025).max(65535), tcpPort: z.number().min(1025).max(65535), maxConnections: z.number().min(1).max(64), lanDiscovery: z.number().min(0).max(1), registerToLobby: z.number().min(0).max(2), configVersion: z.number().min(1).max(2).default(1).optional() }); export type Configuration = z.infer; export const assistRulesSchema = z.object({ stabilityControlLevelMax: z.number().min(0).max(100).default(100), disableAutosteer: z.number().min(0).max(1).default(0), disableAutoLights: z.number().min(0).max(1).default(0), disableAutoWiper: z.number().min(0).max(1).default(0), disableAutoEngineStart: z.number().min(0).max(1).default(0), disableAutoPitLimiter: z.number().min(0).max(1).default(0), disableAutoGear: z.number().min(0).max(1).default(0), disableAutoClutch: z.number().min(0).max(1).default(0), disableIdealLine: z.number().min(0).max(1).default(0) }); export type AssistRules = z.infer; export const serverSettingsSchema = z.object({ serverName: z.string().min(3).max(150), adminPassword: z.string().min(6).max(50), carGroup: z.string().min(1).max(50), trackMedalsRequirement: z.number().min(-1).max(3), safetyRatingRequirement: z.number().min(-1).max(99), racecraftRatingRequirement: z.number().min(-1).max(99), password: z.string().max(50).optional().or(z.literal('')), spectatorPassword: z.string().max(50).optional().or(z.literal('')), maxCarSlots: z.number().min(1).max(30), dumpLeaderboards: z.number().min(0).max(1).default(0), isRaceLocked: z.number().min(0).max(1).default(0), randomizeTrackWhenEmpty: z.number().min(0).max(1).default(0), centralEntryListPath: z.string().max(255).optional().or(z.literal('')), allowAutoDQ: z.number().min(0).max(1).default(0), shortFormationLap: z.number().min(0).max(1).default(0), formationLapType: z.number().min(0).max(3).default(0), ignorePrematureDisconnects: z.number().min(0).max(1).default(0) }); export type ServerSettings = z.infer; export const sessionSchema = z.object({ hourOfDay: z.number().min(1).max(24).default(14), dayOfWeekend: z.number().min(1).max(3).default(1), timeMultiplier: z.number().min(1).max(120).default(1), sessionType: z.string().min(1).max(20), sessionDurationMinutes: z.number().min(1).max(180).default(20) }); export type Session = z.infer; export const eventConfigSchema = z.object({ track: z.string().min(1).max(100), preRaceWaitingTimeSeconds: z.number().min(0).max(600).default(30), sessionOverTimeSeconds: z.number().min(0).max(300).default(30), ambientTemp: z.number().min(0).max(50).default(24), cloudLevel: z.number().min(0).max(1).default(0), rain: z.number().min(0).max(1).default(0), weatherRandomness: z.number().min(0).max(7).default(0), postQualySeconds: z.number().min(0).max(600).default(30), postRaceSeconds: z.number().min(0).max(600).default(30), simracerWeatherConditions: z.number().min(0).max(1).default(0), isFixedConditionQualification: z.number().min(0).max(1).default(0), sessions: z.array(sessionSchema).min(1).max(10) }); export type EventConfig = z.infer; export const eventRulesSchema = z.object({ qualifyStandingType: z.number().min(-1).max(1).default(0), pitWindowLengthSec: z.number().min(-1).max(3600).default(30), driverStintTimeSec: z.number().min(-1).max(7200).default(30), mandatoryPitstopCount: z.number().min(-1).max(5).default(0), maxTotalDrivingTime: z.number().min(-1).max(14400).default(60), isRefuellingAllowedInRace: z.number().min(0).max(1).default(0), isRefuellingTimeFixed: z.number().min(0).max(1).default(0), isMandatoryPitstopRefuellingRequired: z.number().min(0).max(1).default(0), isMandatoryPitstopTyreChangeRequired: z.number().min(0).max(1).default(0), isMandatoryPitstopSwapDriverRequired: z.number().min(0).max(1).default(0), tyreSetCount: z.number().min(0).max(50).default(0) }); export type EventRules = z.infer; export const configurationsSchema = z.object({ configuration: configurationSchema, assistRules: assistRulesSchema, settings: serverSettingsSchema, event: eventConfigSchema, eventRules: eventRulesSchema }); export type Configurations = z.infer; export const configSchemaMap = { [ConfigFile.configuration]: configurationSchema, [ConfigFile.assistRules]: assistRulesSchema, [ConfigFile.event]: eventConfigSchema, [ConfigFile.eventRules]: eventRulesSchema, [ConfigFile.settings]: serverSettingsSchema }; export type Config = Configuration | AssistRules | EventConfig | EventRules | ServerSettings;