Feat: add exit room

This commit is contained in:
Grail Finder
2025-05-11 13:59:25 +03:00
parent cf5643227b
commit f2aee1469b
7 changed files with 55 additions and 4 deletions

View File

@ -52,5 +52,8 @@
<div hx-get="/actionhistory" hx-trigger="sse:backlog_{{.Room.ID}}">
{{template "actionhistory" .Room.ActionHistory}}
</div>
<div id="exitbtn">
<button button id="exit-room-btn" type="submit" 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" hx-get="/room/exit" hx-target="#ancestor">Exit Room</button>
</div>
</div>
{{end}}

View File

@ -79,8 +79,7 @@ func saveFullInfo(fi *models.FullInfo) error {
if err := saveState(fi.State.Username, fi.State); err != nil {
return err
}
// can room be nil?
// if fi.Room == nil {
// if fi.Room == nil { // can be null on exit
// return nil
// }
if err := saveRoom(fi.Room); err != nil {

View File

@ -81,3 +81,29 @@ func HandleHome(w http.ResponseWriter, r *http.Request) {
log.Error("failed to exec templ;", "error", err, "templ", "base")
}
}
func HandleExit(w http.ResponseWriter, r *http.Request) {
tmpl, err := template.ParseGlob("components/*.html")
if err != nil {
abortWithError(w, err.Error())
return
}
fi, err := getFullInfoByCtx(r.Context())
if err != nil {
abortWithError(w, err.Error())
return
}
exitedRoom := fi.ExitRoom()
if err := saveRoom(exitedRoom); err != nil {
abortWithError(w, err.Error())
return
}
if err := saveState(fi.State.Username, fi.State); err != nil {
abortWithError(w, err.Error())
return
}
fi.List = listPublicRooms()
if err := tmpl.ExecuteTemplate(w, "base", fi); err != nil {
log.Error("failed to exec templ;", "error", err, "templ", "base")
}
}

View File

@ -30,6 +30,7 @@ func ListenToRequests(port string) error {
mux.HandleFunc("GET /start-game", handlers.HandleStartGame)
mux.HandleFunc("GET /room-join", handlers.HandleJoinRoom)
mux.HandleFunc("POST /give-clue", handlers.HandleGiveClue)
mux.HandleFunc("GET /room/exit", handlers.HandleExit)
//elements
mux.HandleFunc("GET /actionhistory", handlers.HandleActionHistory)
mux.HandleFunc("GET /room/createform", handlers.HandleShowCreateForm)

View File

@ -1,6 +1,7 @@
package models
import (
"golias/utils"
"time"
"github.com/rs/xid"
@ -200,3 +201,19 @@ type FullInfo struct {
Room *Room
List []*Room
}
func (f *FullInfo) ExitRoom() *Room {
f.Room.PlayerList = utils.RemoveFromSlice(f.State.Username, f.Room.PlayerList)
f.Room.RedTeam.Guessers = utils.RemoveFromSlice(f.State.Username, f.Room.RedTeam.Guessers)
f.Room.BlueTeam.Guessers = utils.RemoveFromSlice(f.State.Username, f.Room.BlueTeam.Guessers)
if f.Room.RedTeam.Mime == f.State.Username {
f.Room.RedTeam.Mime = ""
}
if f.Room.BlueTeam.Mime == f.State.Username {
f.Room.BlueTeam.Mime = ""
}
f.State.ExitRoom()
resp := f.Room
f.Room = nil
return resp
}

View File

@ -47,6 +47,12 @@ type UserState struct {
Role UserRole
}
func (u *UserState) ExitRoom() {
u.RoomID = ""
u.Team = UserTeamNone
u.Role = UserRoleNone
}
func MakeTestState(creatorName string) *FullInfo {
cards := []WordCard{
{Word: "hamster", Color: "blue"},

View File

@ -1,7 +1,6 @@
### feats
- end game: who won.
- end game: two reasons (black word; all words);
- ability to leave room;
- close room if creator left (or pass role to other player);
#### sse points
- clue sse update;