From 3cb43d5129ac1044541c84bcb1ba9b28ef6ce09d Mon Sep 17 00:00:00 2001 From: Grail Finder Date: Fri, 11 Jul 2025 13:02:44 +0300 Subject: [PATCH] Fix: exit from room deletes player --- components/createroomform.html | 2 +- handlers/handlers.go | 44 +++++++++++++++++++++------------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/components/createroomform.html b/components/createroomform.html index 184dfe5..69f825b 100644 --- a/components/createroomform.html +++ b/components/createroomform.html @@ -14,7 +14,7 @@ -
+

diff --git a/handlers/handlers.go b/handlers/handlers.go index 12a94a0..20b9398 100644 --- a/handlers/handlers.go +++ b/handlers/handlers.go @@ -83,27 +83,39 @@ func HandleExit(w http.ResponseWriter, r *http.Request) { abortWithError(w, "cannot leave when game is running") return } - var creatorLeft bool + // if creator leaves, remove all players from room and delete room if fi.Room.CreatorName == fi.State.Username { - creatorLeft = true - } - exitedRoom := fi.ExitRoom() - if creatorLeft { - if err := repo.RoomDeleteByID(r.Context(), exitedRoom.ID); err != nil { + players, err := repo.PlayerListByRoom(r.Context(), fi.Room.ID) + if err != nil { + log.Error("failed to list players in room", "error", err) + abortWithError(w, err.Error()) + return + } + for _, p := range players { + if p.IsBot { + if err := repo.PlayerDelete(r.Context(), p.Username); err != nil { + log.Error("failed to delete bot", "error", err) + } + continue + } + if err := repo.PlayerExitRoom(r.Context(), p.Username); err != nil { + log.Error("failed to exit room", "error", err) + } + } + if err := repo.RoomDeleteByID(r.Context(), fi.Room.ID); err != nil { log.Error("failed to remove room", "error", err) } notify(models.NotifyRoomListUpdate, "") + } else { + // if regular player leaves, just exit room + if err := repo.PlayerExitRoom(r.Context(), fi.State.Username); err != nil { + log.Error("failed to exit room", "error", err) + abortWithError(w, err.Error()) + return + } } - if err := repo.PlayerExitRoom(r.Context(), fi.State.Username); err != nil { - log.Error("failed to exit room", "error", err) - abortWithError(w, err.Error()) - return - } - if err := repo.RoomUpdate(r.Context(), exitedRoom); err != nil { - log.Error("failed to update room", "error", err) - abortWithError(w, err.Error()) - return - } + fi.Room = nil + fi.State.RoomID = nil fi.List, err = repo.RoomList(r.Context()) if err != nil { abortWithError(w, err.Error())