Feat: add exit room
This commit is contained in:
@ -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}}
|
||||
|
@ -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 {
|
||||
|
@ -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")
|
||||
}
|
||||
}
|
||||
|
1
main.go
1
main.go
@ -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)
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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"},
|
||||
|
Reference in New Issue
Block a user