Feat: roomlist update
This commit is contained in:
		| @@ -1,5 +1,5 @@ | |||||||
| {{define "roomlist"}} | {{define "roomlist"}} | ||||||
| <div id="roomlist"> | <div id="roomlist" hx-get="/" hx-trigger="sse:roomlistupdate" hx-target="#ancestor"> | ||||||
| {{range .}} | {{range .}} | ||||||
| <p> | <p> | ||||||
|     {{.ID}} |     {{.ID}} | ||||||
| @@ -15,9 +15,6 @@ | |||||||
|                 <span class="px-2 py-1 text-xs font-medium rounded-full {{if .IsGameRunning}}bg-green-100 text-green-800{{else}}bg-gray-100 text-gray-600{{end}}"> |                 <span class="px-2 py-1 text-xs font-medium rounded-full {{if .IsGameRunning}}bg-green-100 text-green-800{{else}}bg-gray-100 text-gray-600{{end}}"> | ||||||
|                     {{if .IsRunning}}Game Active{{else}}Waiting Room{{end}} |                     {{if .IsRunning}}Game Active{{else}}Waiting Room{{end}} | ||||||
|                 </span> |                 </span> | ||||||
|                 <!-- <span class="text-sm text-gray-600"> --> |  | ||||||
|                 <!--     {{.PlayersCount}} player{{if ne .PlayersCount 1}}s{{end}} --> |  | ||||||
|                 <!-- </span> --> |  | ||||||
|             </div> |             </div> | ||||||
|         </div> |         </div> | ||||||
|     </div> |     </div> | ||||||
|   | |||||||
| @@ -46,6 +46,11 @@ func getRoomByID(roomID string) (*models.Room, error) { | |||||||
| 	return resp, nil | 	return resp, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func removeRoom(roomID string) { | ||||||
|  | 	key := models.CacheRoomPrefix + roomID | ||||||
|  | 	memcache.RemoveKey(key) | ||||||
|  | } | ||||||
|  |  | ||||||
| // context | // context | ||||||
| func getRoomIDFromCtx(ctx context.Context) string { | func getRoomIDFromCtx(ctx context.Context) string { | ||||||
| 	id, _ := ctx.Value(models.CtxRoomIDKey).(string) | 	id, _ := ctx.Value(models.CtxRoomIDKey).(string) | ||||||
|   | |||||||
| @@ -8,16 +8,6 @@ import ( | |||||||
| 	"net/http" | 	"net/http" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // func HandleRoomList(w http.ResponseWriter, r *http.Request) { |  | ||||||
| // 	pubRooms := listPublicRooms() |  | ||||||
| // 	tmpl, err := template.ParseGlob("components/*.html") |  | ||||||
| // 	if err != nil { |  | ||||||
| // 		abortWithError(w, err.Error()) |  | ||||||
| // 		return |  | ||||||
| // 	} |  | ||||||
| // 	tmpl.ExecuteTemplate(w, "base", pubRooms) |  | ||||||
| // } |  | ||||||
|  |  | ||||||
| func HandleCreateRoom(w http.ResponseWriter, r *http.Request) { | func HandleCreateRoom(w http.ResponseWriter, r *http.Request) { | ||||||
| 	// parse payload | 	// parse payload | ||||||
| 	payload := &models.RoomReq{ | 	payload := &models.RoomReq{ | ||||||
| @@ -49,6 +39,7 @@ func HandleCreateRoom(w http.ResponseWriter, r *http.Request) { | |||||||
| 		abortWithError(w, msg) | 		abortWithError(w, msg) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  | 	notify(models.NotifyRoomListUpdate, "") | ||||||
| 	// send msg of created room | 	// send msg of created room | ||||||
| 	// h.Broker.Notifier <- broker.NotificationEvent{ | 	// h.Broker.Notifier <- broker.NotificationEvent{ | ||||||
| 	// 	EventName: models.MsgRoomListUpdate, | 	// 	EventName: models.MsgRoomListUpdate, | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ package handlers | |||||||
| import ( | import ( | ||||||
| 	"golias/broker" | 	"golias/broker" | ||||||
| 	"golias/config" | 	"golias/config" | ||||||
|  | 	"golias/models" | ||||||
| 	"golias/pkg/cache" | 	"golias/pkg/cache" | ||||||
| 	"html/template" | 	"html/template" | ||||||
| 	"log/slog" | 	"log/slog" | ||||||
| @@ -93,11 +94,20 @@ func HandleExit(w http.ResponseWriter, r *http.Request) { | |||||||
| 		abortWithError(w, err.Error()) | 		abortWithError(w, err.Error()) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  | 	var creatorLeft bool | ||||||
|  | 	if fi.Room.CreatorName == fi.State.Username { | ||||||
|  | 		creatorLeft = true | ||||||
|  | 	} | ||||||
| 	exitedRoom := fi.ExitRoom() | 	exitedRoom := fi.ExitRoom() | ||||||
| 	if err := saveRoom(exitedRoom); err != nil { | 	if err := saveRoom(exitedRoom); err != nil { | ||||||
| 		abortWithError(w, err.Error()) | 		abortWithError(w, err.Error()) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  | 	if len(exitedRoom.PlayerList) == 0 || creatorLeft { | ||||||
|  | 		removeRoom(exitedRoom.ID) | ||||||
|  | 		// TODO: notify users if creator left | ||||||
|  | 		notify(models.NotifyRoomListUpdate, "") | ||||||
|  | 	} | ||||||
| 	if err := saveState(fi.State.Username, fi.State); err != nil { | 	if err := saveState(fi.State.Username, fi.State); err != nil { | ||||||
| 		abortWithError(w, err.Error()) | 		abortWithError(w, err.Error()) | ||||||
| 		return | 		return | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ var ( | |||||||
| 	CacheRoomPrefix  = "room#" | 	CacheRoomPrefix  = "room#" | ||||||
| 	CacheStatePrefix = "state-" | 	CacheStatePrefix = "state-" | ||||||
| 	// sse | 	// sse | ||||||
|  | 	NotifyRoomListUpdate   = "roomlistupdate" | ||||||
| 	NotifyRoomUpdatePrefix = "roomupdate_" | 	NotifyRoomUpdatePrefix = "roomupdate_" | ||||||
| 	NotifyBacklogPrefix    = "backlog_" | 	NotifyBacklogPrefix    = "backlog_" | ||||||
| ) | ) | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								todos.md
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								todos.md
									
									
									
									
									
								
							| @@ -1,6 +1,7 @@ | |||||||
| ### feats | ### feats | ||||||
| - ability to leave room; | - ability to leave room; | ||||||
| - close room if creator left (or pass role to other player); | - close room if creator left (or pass role to other player); | ||||||
|  | - notify on creation of new room; | ||||||
|  |  | ||||||
| #### sse points | #### sse points | ||||||
| - clue sse update; | - clue sse update; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Grail Finder
					Grail Finder