jsplanet
Version:
A controller for Trackmania 2020 dedicated server.
251 lines (250 loc) • 8.53 kB
JavaScript
/* 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, };