diff --git a/src/ps/games/game.ts b/src/ps/games/game.ts index 5be4a2f6..63384bb7 100644 --- a/src/ps/games/game.ts +++ b/src/ps/games/game.ts @@ -294,6 +294,7 @@ export class BaseGame { const forfeitPlayer = this.onForfeitPlayer?.(player, ctx); if (forfeitPlayer?.success === false) return forfeitPlayer; player.out = true; + this.spectators.push(player.id); this.log.push({ action: staffAction ? 'dq' : 'forfeit', turn: player.turn, time: new Date(), ctx: null }); return { success: true, @@ -409,7 +410,7 @@ export class BaseGame { if (!this.started) return; if (user) { const asPlayer = Object.values(this.players).find(player => player.id === user); - if (asPlayer) return this.sendHTML(asPlayer.id, this.render(asPlayer.turn)); + if (asPlayer && !asPlayer.out) return this.sendHTML(asPlayer.id, this.render(asPlayer.turn)); if (this.spectators.includes(user)) return this.sendHTML(user, this.render(null)); this.throw('GAME.NON_PLAYER_OR_SPEC'); } diff --git a/src/ps/handlers/interface.ts b/src/ps/handlers/interface.ts index 61e9f37c..3a19d010 100644 --- a/src/ps/handlers/interface.ts +++ b/src/ps/handlers/interface.ts @@ -26,7 +26,8 @@ export function interfaceHandler(message: PSMessage) { if (!game) return; // Don't put any errors here! People should be able to close games that don't exist, like ones that ended const user = message.author.id; - if (game.hasPlayer(user)) { + const player = Object.values(game.players).find(player => player.id === user); + if (game.hasPlayer(user) && player && !player.out) { message.reply(game.$T('GAME.CANNOT_LEAVE', { prefix, game: game.meta.id })); return game.update(user); }