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
	 Grail Finder
					Grail Finder