Feat: add exit room
This commit is contained in:
		| @@ -52,5 +52,8 @@ | |||||||
|   <div hx-get="/actionhistory" hx-trigger="sse:backlog_{{.Room.ID}}"> |   <div hx-get="/actionhistory" hx-trigger="sse:backlog_{{.Room.ID}}"> | ||||||
|   {{template "actionhistory" .Room.ActionHistory}} |   {{template "actionhistory" .Room.ActionHistory}} | ||||||
|   </div> |   </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> | </div> | ||||||
| {{end}} | {{end}} | ||||||
|   | |||||||
| @@ -79,8 +79,7 @@ func saveFullInfo(fi *models.FullInfo) error { | |||||||
| 	if err := saveState(fi.State.Username, fi.State); err != nil { | 	if err := saveState(fi.State.Username, fi.State); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	// can room be nil? | 	// if fi.Room == nil { // can be null on exit | ||||||
| 	// if fi.Room == nil { |  | ||||||
| 	// 	return nil | 	// 	return nil | ||||||
| 	// } | 	// } | ||||||
| 	if err := saveRoom(fi.Room); err != 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") | 		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 /start-game", handlers.HandleStartGame) | ||||||
| 	mux.HandleFunc("GET /room-join", handlers.HandleJoinRoom) | 	mux.HandleFunc("GET /room-join", handlers.HandleJoinRoom) | ||||||
| 	mux.HandleFunc("POST /give-clue", handlers.HandleGiveClue) | 	mux.HandleFunc("POST /give-clue", handlers.HandleGiveClue) | ||||||
|  | 	mux.HandleFunc("GET /room/exit", handlers.HandleExit) | ||||||
| 	//elements | 	//elements | ||||||
| 	mux.HandleFunc("GET /actionhistory", handlers.HandleActionHistory) | 	mux.HandleFunc("GET /actionhistory", handlers.HandleActionHistory) | ||||||
| 	mux.HandleFunc("GET /room/createform", handlers.HandleShowCreateForm) | 	mux.HandleFunc("GET /room/createform", handlers.HandleShowCreateForm) | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| package models | package models | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"golias/utils" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/rs/xid" | 	"github.com/rs/xid" | ||||||
| @@ -200,3 +201,19 @@ type FullInfo struct { | |||||||
| 	Room  *Room | 	Room  *Room | ||||||
| 	List  []*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 | 	Role     UserRole | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (u *UserState) ExitRoom() { | ||||||
|  | 	u.RoomID = "" | ||||||
|  | 	u.Team = UserTeamNone | ||||||
|  | 	u.Role = UserRoleNone | ||||||
|  | } | ||||||
|  |  | ||||||
| func MakeTestState(creatorName string) *FullInfo { | func MakeTestState(creatorName string) *FullInfo { | ||||||
| 	cards := []WordCard{ | 	cards := []WordCard{ | ||||||
| 		{Word: "hamster", Color: "blue"}, | 		{Word: "hamster", Color: "blue"}, | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								todos.md
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								todos.md
									
									
									
									
									
								
							| @@ -1,7 +1,6 @@ | |||||||
| ### feats | ### feats | ||||||
| - end game: who won. |  | ||||||
| - end game: two reasons (black word; all words); |  | ||||||
| - ability to leave room; | - ability to leave room; | ||||||
|  | - close room if creator left (or pass role to other player); | ||||||
|  |  | ||||||
| #### sse points | #### sse points | ||||||
| - clue sse update; | - clue sse update; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Grail Finder
					Grail Finder