Fix: exit from room deletes player

This commit is contained in:
Grail Finder
2025-07-11 13:02:44 +03:00
parent 566d645230
commit 3cb43d5129
2 changed files with 29 additions and 17 deletions

View File

@ -14,7 +14,7 @@
<option value="ru">Russian</option> <option value="ru">Russian</option>
</select> </select>
</div> </div>
<label For="password">Password:</label><br/> <label For="room_pass">Password:</label><br/>
<input type="text" id="password" name="room_pass" class="text-center text-white" value="" placeholder="Leave empty for open room"/><br/> <input type="text" id="password" name="room_pass" class="text-center text-white" value="" placeholder="Leave empty for open room"/><br/>
<button button class="justify-center rounded-md bg-indigo-600 px-3 py-1.5 text-sm font-semibold leading-6 text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600" type="submit" >Create Room</button> <button button class="justify-center rounded-md bg-indigo-600 px-3 py-1.5 text-sm font-semibold leading-6 text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600" type="submit" >Create Room</button>
</form> </form>

View File

@ -83,27 +83,39 @@ func HandleExit(w http.ResponseWriter, r *http.Request) {
abortWithError(w, "cannot leave when game is running") abortWithError(w, "cannot leave when game is running")
return return
} }
var creatorLeft bool // if creator leaves, remove all players from room and delete room
if fi.Room.CreatorName == fi.State.Username { if fi.Room.CreatorName == fi.State.Username {
creatorLeft = true 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
} }
exitedRoom := fi.ExitRoom() for _, p := range players {
if creatorLeft { if p.IsBot {
if err := repo.RoomDeleteByID(r.Context(), exitedRoom.ID); err != nil { 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) log.Error("failed to remove room", "error", err)
} }
notify(models.NotifyRoomListUpdate, "") notify(models.NotifyRoomListUpdate, "")
} } else {
// if regular player leaves, just exit room
if err := repo.PlayerExitRoom(r.Context(), fi.State.Username); err != nil { if err := repo.PlayerExitRoom(r.Context(), fi.State.Username); err != nil {
log.Error("failed to exit room", "error", err) log.Error("failed to exit room", "error", err)
abortWithError(w, err.Error()) abortWithError(w, err.Error())
return 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()) fi.List, err = repo.RoomList(r.Context())
if err != nil { if err != nil {
abortWithError(w, err.Error()) abortWithError(w, err.Error())