diff --git a/src/client/ClientGameRunner.ts b/src/client/ClientGameRunner.ts index bcddbf86e..e5c731b92 100644 --- a/src/client/ClientGameRunner.ts +++ b/src/client/ClientGameRunner.ts @@ -103,7 +103,7 @@ export function joinLobby( if (message.type === "error") { showErrorModal( message.error, - "", + message.message, lobbyConfig.gameID, lobbyConfig.clientID, true, @@ -329,7 +329,7 @@ export class ClientGameRunner { if (message.type === "error") { showErrorModal( message.error, - "", + message.message, this.lobby.gameID, this.lobby.clientID, true, @@ -582,27 +582,31 @@ export class ClientGameRunner { } function showErrorModal( - errMsg: string, - stack: string, + error: string, + message: string | undefined, gameID: GameID, clientID: ClientID, closable = false, showDiscord = true, heading = "error_modal.crashed", ) { - const errorText = `Error: ${errMsg}\nStack: ${stack}`; - if (document.querySelector("#error-modal")) { return; } const modal = document.createElement("div"); - modal.id = "error-modal"; - const discord = showDiscord ? translateText("error_modal.paste_discord") : ""; - - const content = `${discord}\n${translateText(heading)}\n game id: ${gameID}, client id: ${clientID}\n${errorText}`; + const content = [ + showDiscord ? translateText("error_modal.paste_discord") : null, + translateText(heading), + `game id: ${gameID}`, + `client id: ${clientID}`, + `Error: ${error}`, + message ? `Message: ${message}` : null, + ] + .filter(Boolean) + .join("\n"); // Create elements const pre = document.createElement("pre"); diff --git a/src/core/Schemas.ts b/src/core/Schemas.ts index bf6d6a30d..7520f3558 100644 --- a/src/core/Schemas.ts +++ b/src/core/Schemas.ts @@ -450,6 +450,7 @@ export const ServerDesyncSchema = z.object({ export const ServerErrorSchema = z.object({ type: z.literal("error"), error: z.string(), + message: z.string().optional(), }); export const ServerMessageSchema = z.discriminatedUnion("type", [ diff --git a/src/core/StatsSchemas.ts b/src/core/StatsSchemas.ts index 0974c6237..8ad7fd95c 100644 --- a/src/core/StatsSchemas.ts +++ b/src/core/StatsSchemas.ts @@ -89,7 +89,7 @@ export const OTHER_INDEX_LOST = 3; // Structures/warships destroyed/captured by export const OTHER_INDEX_UPGRADE = 4; // Structures upgraded const BigIntStringSchema = z.preprocess((val) => { - if (typeof val === "string" && /^\d+$/.test(val)) return BigInt(val); + if (typeof val === "string" && /^-?\d+$/.test(val)) return BigInt(val); if (typeof val === "bigint") return val; return val; }, z.bigint()); diff --git a/src/server/GameServer.ts b/src/server/GameServer.ts index 76e7615b0..c1093dd27 100644 --- a/src/server/GameServer.ts +++ b/src/server/GameServer.ts @@ -199,7 +199,8 @@ export class GameServer { client.ws.send( JSON.stringify({ type: "error", - error: error.toString(), + error, + message, } satisfies ServerErrorMessage), ); // Add a small delay before closing the connection to ensure the error message is received