UNPKG

jsplanet

Version:

A controller for Trackmania 2020 dedicated server.

251 lines (250 loc) 8.53 kB
/* eslint-disable @typescript-eslint/naming-convention */ import { z } from "zod"; const endRoundEndSchema = z.object({ count: z.number(), isvalid: z.boolean().optional(), time: z.number(), valid: z.number().optional(), }); const mapDetailsSchema = z.object({ Author: z.string(), AuthorNickname: z.string(), CopperPrice: z.number(), Environnement: z.string(), FileName: z.string(), GoldTime: z.number(), MapStyle: z.string(), MapType: z.string(), Name: z.string(), UId: z.string(), }); const mapInfoSchema = z.object({ Author: z.string(), AuthorNickname: z.string(), AuthorTime: z.number(), BronzeTime: z.number(), CopperPrice: z.number(), Environnement: z.string(), FileName: z.string(), GoldTime: z.number(), LapRace: z.boolean(), MapStyle: z.string(), MapType: z.string(), Mood: z.string(), Name: z.string(), NbCheckpoints: z.number(), NbLaps: z.number(), SilverTime: z.number(), UId: z.string(), }); const modeScriptSettingsSchema = z.record(z.union([z.string(), z.number(), z.boolean()])); const pauseStatusSchema = z.object({ active: z.boolean(), available: z.boolean(), responseid: z.string().optional(), }); const playerInfoSchema = z.object({ Flags: z.number(), LadderRanking: z.number(), LadderScore: z.number(), Login: z.string(), NickName: z.string(), PlayerId: z.number(), SpectatorStatus: z.number(), TeamId: z.number(), }); const roundSchema = z.object({ count: z.number(), time: z.number(), valid: z.number().optional(), }); const scoresPlayerSchema = z.object({ accountid: z.string(), bestlapcheckpoints: z.array(z.number()), bestlaptime: z.number(), bestracecheckpoints: z.array(z.number()), bestracetime: z.number(), login: z.string(), mappoints: z.number(), matchpoints: z.number(), name: z.string(), prevracecheckpoints: z.array(z.number()), prevracetime: z.number(), rank: z.number(), roundpoints: z.number(), }); const scoresTeamSchema = z.object({ id: z.union([z.literal(0), z.literal(1)]), mappoints: z.number(), matchpoints: z.number(), name: z.union([z.literal("Blue"), z.literal("Red")]), roundpoints: z.number(), }); const scoresSchema = z.object({ players: z.array(scoresPlayerSchema), responseid: z.string().optional(), section: z.union([ z.literal(""), z.literal("EndMap"), z.literal("EndMatch"), z.literal("EndMatchEarly"), z.literal("EndRound"), z.literal("PreEndRound"), ]), teams: z.array(scoresTeamSchema), useteams: z.boolean(), winnerplayer: z.string(), winnerteam: z.union([z.literal(-1), z.literal(0), z.literal(1)]), }); const scriptSchema = z.object({ CurrentValue: z.string(), NextValue: z.string(), }); const startLineSchema = z.object({ accountid: z.string(), login: z.string(), time: z.number(), }); const statusSchema = z.object({ Code: z.number(), Name: z.string(), }); const versionSchema = z.object({ ApiVersion: z.string(), Build: z.string(), Name: z.string(), TitleId: z.string(), Version: z.string(), }); const warmupRoundSchema = z.object({ current: z.number(), total: z.number() }); const waypointSchema = z.object({ checkpointinlap: z.number(), checkpointinrace: z.number(), isendlap: z.boolean(), isendrace: z.boolean(), laptime: z.number(), login: z.string(), racetime: z.number(), speed: z.number(), time: z.number(), }); const xmlRpcScriptMethodsWithResponse = [ "Trackmania.GetScores", "Maniaplanet.Pause.SetActive", ]; const xmlRpcScriptMethodsResponseCallback = { "Maniaplanet.Pause.SetActive": "Maniaplanet.Pause.Status", "Trackmania.GetScores": "Trackmania.Scores", }; const xmlRpcMethodsResponseType = { AddMap: z.tuple([z.boolean()]), AddMapList: z.tuple([z.number()]), Authenticate: z.tuple([z.boolean()]), ChangeAuthPassword: z.tuple([z.boolean()]), ChatEnableManualRouting: z.tuple([z.boolean()]), ChatForwardToLogin: z.tuple([z.boolean()]), ChatSend: z.tuple([z.boolean()]), ChatSendServerMessage: z.tuple([z.boolean()]), ChatSendServerMessageToId: z.tuple([z.boolean()]), ChatSendServerMessageToLanguage: z.tuple([z.boolean()]), ChatSendServerMessageToLogin: z.tuple([z.boolean()]), ChatSendToId: z.tuple([z.boolean()]), ChatSendToLanguage: z.tuple([z.boolean()]), ChatSendToLogin: z.tuple([z.boolean()]), EnableCallbacks: z.tuple([z.boolean()]), ForcePlayerTeam: z.tuple([z.boolean()]), ForceSpectator: z.tuple([z.boolean()]), GetChatLines: z.tuple([z.array(z.string())]), GetCurrentMapIndex: z.tuple([z.number()]), GetCurrentMapInfo: z.tuple([mapInfoSchema]), GetForcedTeams: z.tuple([z.boolean()]), GetMapInfo: z.tuple([mapInfoSchema]), GetMapList: z.tuple([z.array(mapDetailsSchema)]), GetModeScriptSettings: z.tuple([modeScriptSettingsSchema]), GetModeScriptText: z.tuple([z.string()]), GetNextMapIndex: z.tuple([z.number()]), GetNextMapInfo: z.tuple([mapInfoSchema]), GetPlayerInfo: z.tuple([playerInfoSchema]), GetScriptName: z.tuple([scriptSchema]), GetServerPassword: z.tuple([z.string()]), GetServerPasswordForSpectator: z.tuple([z.string()]), GetStatus: z.tuple([statusSchema]), GetVersion: z.tuple([versionSchema]), InsertMap: z.tuple([z.boolean()]), InsertMapList: z.tuple([z.number()]), JumpToMapIdent: z.tuple([z.boolean()]), JumpToMapIndex: z.tuple([z.boolean()]), Kick: z.tuple([z.boolean()]), NextMap: z.tuple([z.boolean()]), RemoveMap: z.tuple([z.boolean()]), RemoveMapList: z.tuple([z.number()]), RestartMap: z.tuple([z.boolean()]), SetApiVersion: z.tuple([z.boolean()]), SetForcedTeams: z.tuple([z.boolean()]), SetModeScriptSettings: z.tuple([z.boolean()]), SetModeScriptText: z.tuple([z.boolean()]), SetNextMapIdent: z.tuple([z.boolean()]), SetNextMapIndex: z.tuple([z.boolean()]), SetScriptName: z.tuple([z.boolean()]), SetServerPassword: z.tuple([z.boolean()]), SetServerPasswordForSpectator: z.tuple([z.boolean()]), "system.listMethods": z.tuple([z.array(z.string())]), "system.methodHelp": z.tuple([z.string()]), "system.methodSignature": z.tuple([ z.array(z.array(z.string()).min(1)), ]), TriggerModeScriptEventArray: z.tuple([z.boolean()]), WriteFile: z.tuple([z.boolean()]), }; const xmlRpcCallbacksCallType = { "ManiaPlanet.ModeScriptCallbackArray": z.lazy(() => z.union([ z.never(), z.never(), ...Object.entries(xmlRpcScriptCallbacksCallType).map(([name, type]) => z.tuple([z.literal(name), type[0]])), ])), "ManiaPlanet.PlayerChat": z.tuple([ z.number(), z.string(), z.string(), z.boolean(), ]), "ManiaPlanet.PlayerConnect": z.tuple([z.string(), z.boolean()]), "ManiaPlanet.PlayerDisconnect": z.tuple([z.string(), z.string()]), "ManiaPlanet.PlayerInfoChanged": z.tuple([playerInfoSchema]), }; const xmlRpcScriptCallbacksCallType = { "Maniaplanet.EndRound_End": [ z.tuple([z.string()]), z.tuple([endRoundEndSchema]), ], "Maniaplanet.EndRound_Start": [z.tuple([z.string()]), z.tuple([roundSchema])], "Maniaplanet.Pause.Status": [ z.tuple([z.string()]), z.tuple([pauseStatusSchema]), ], "Maniaplanet.StartRound_End": [z.tuple([z.string()]), z.tuple([roundSchema])], "Maniaplanet.StartRound_Start": [ z.tuple([z.string()]), z.tuple([roundSchema]), ], "Trackmania.Event.StartLine": [ z.tuple([z.string()]), z.tuple([startLineSchema]), ], "Trackmania.Event.WayPoint": [ z.tuple([z.string()]), z.tuple([waypointSchema]), ], "Trackmania.Scores": [z.tuple([z.string()]), z.tuple([scoresSchema])], "Trackmania.WarmUp.End": [z.tuple([z.string()]), z.tuple([z.object({})])], "Trackmania.WarmUp.EndRound": [ z.tuple([z.string()]), z.tuple([warmupRoundSchema]), ], "Trackmania.WarmUp.Start": [z.tuple([z.string()]), z.tuple([z.object({})])], "Trackmania.WarmUp.StartRound": [ z.tuple([z.string()]), z.tuple([warmupRoundSchema]), ], }; export { xmlRpcCallbacksCallType, xmlRpcMethodsResponseType, xmlRpcScriptCallbacksCallType, xmlRpcScriptMethodsResponseCallback, xmlRpcScriptMethodsWithResponse, };