diff --git a/realm/chess.gno b/realm/chess.gno index 9703658..91e3afd 100644 --- a/realm/chess.gno +++ b/realm/chess.gno @@ -513,7 +513,14 @@ func Resign(gameID string) string { std.AssertOriginCall() g := getGame(gameID, true) + err := resign(g) + if err != nil { + panic(err.String()) + } + return g.json() +} +func resign(g *Game) error { caller := std.GetOrigCaller() switch caller { case g.Black: @@ -523,12 +530,12 @@ func Resign(gameID string) string { g.State = GameStateResigned g.Winner = WinnerBlack default: - panic("you are not involved in this game") + return errors.New("you are not involved in this game") } g.DrawOfferer = nil g.saveResult() - return g.json() + return nil } // DrawOffer creates a draw offer in the current game, if one doesn't already diff --git a/realm/lobby.gno b/realm/lobby.gno index 8f5db18..894f11b 100644 --- a/realm/lobby.gno +++ b/realm/lobby.gno @@ -83,7 +83,16 @@ func LobbyJoin(seconds, increment int) { // Ensure that user's previous games are finished (or timed out). caller := std.GetOrigCaller() - assertGamesFinished(getUserGames(caller)) + games := getUserGames(caller) + // XXX: temporary to avoid ever prohibiting a user from joining the lobby. + // when possible, change back to assertGamesFinished(games) + for _, g := range games { + if !g.State.IsFinished() { + if err := resign(g); err != nil { + panic("internal error (could not resign game " + g.ID + "): " + err.Error()) + } + } + } assertUserNotInLobby(caller) // remove caller from lobbyPlayer2Game, so LobbyGameFound