Feat: roomlist & join room
This commit is contained in:
		| @@ -6,6 +6,7 @@ import ( | ||||
| 	"errors" | ||||
| 	"golias/models" | ||||
| 	"golias/utils" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| func createRoom(ctx context.Context, req *models.RoomReq) (*models.Room, error) { | ||||
| @@ -22,11 +23,13 @@ func createRoom(ctx context.Context, req *models.RoomReq) (*models.Room, error) | ||||
| } | ||||
|  | ||||
| func saveRoom(room *models.Room) error { | ||||
| 	key := models.CacheRoomPrefix + room.ID | ||||
| 	data, err := json.Marshal(room) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	memcache.Set(models.CacheRoomPrefix+room.ID, data) | ||||
| 	log.Debug("saved room", "room", room, "key", key) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| @@ -208,3 +211,24 @@ func joinTeam(ctx context.Context, role, team string) (*models.FullInfo, error) | ||||
| 	} | ||||
| 	return fi, nil | ||||
| } | ||||
|  | ||||
| // get all rooms | ||||
| func listPublicRooms() []*models.Room { | ||||
| 	cacheMap := memcache.GetAll() | ||||
| 	publicRooms := []*models.Room{} | ||||
| 	// no way to know if room is public until unmarshal -_-; | ||||
| 	for key, value := range cacheMap { | ||||
| 		if strings.HasPrefix(key, models.CacheRoomPrefix) { | ||||
| 			room := &models.Room{} | ||||
| 			if err := json.Unmarshal(value, &room); err != nil { | ||||
| 				log.Warn("failed to unmarshal room", "error", err) | ||||
| 				continue | ||||
| 			} | ||||
| 			log.Debug("consider room for list", "room", room, "key", key) | ||||
| 			if room.IsPublic { | ||||
| 				publicRooms = append(publicRooms, room) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return publicRooms | ||||
| } | ||||
|   | ||||
| @@ -17,7 +17,7 @@ import ( | ||||
| ) | ||||
|  | ||||
| func abortWithError(w http.ResponseWriter, msg string) { | ||||
| 	w.WriteHeader(500) | ||||
| 	w.WriteHeader(200) // must be 200 for htmx to replace components | ||||
| 	tmpl := template.Must(template.ParseGlob("components/*.html")) | ||||
| 	tmpl.ExecuteTemplate(w, "error", msg) | ||||
| } | ||||
| @@ -109,9 +109,9 @@ func makeCookie(username string, remote string) (*http.Cookie, error) { | ||||
| 	cookieValue := base64.URLEncoding.EncodeToString([]byte( | ||||
| 		string(signature) + sessionToken)) | ||||
| 	cookie := &http.Cookie{ | ||||
| 		Name:  cookieName, | ||||
| 		Value: cookieValue, | ||||
| 		// Secure:   true, | ||||
| 		Name:     cookieName, | ||||
| 		Value:    cookieValue, | ||||
| 		Secure:   true, | ||||
| 		HttpOnly: true, | ||||
| 		SameSite: http.SameSiteNoneMode, | ||||
| 		Domain:   cfg.ServerConfig.Host, | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package handlers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"golias/models" | ||||
| 	"html/template" | ||||
| 	"net/http" | ||||
| @@ -45,6 +46,12 @@ func HandleShowColor(w http.ResponseWriter, r *http.Request) { | ||||
| 		abortWithError(w, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	// TODO: whos move it is? | ||||
| 	if state.Role != "guesser" { | ||||
| 		err = errors.New("need to guesser to open the card") | ||||
| 		abortWithError(w, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	log.Debug("got state", "state", state) | ||||
| 	// TODO: update room score | ||||
| 	color, exists := roundWords[word] | ||||
|   | ||||
| @@ -8,6 +8,16 @@ import ( | ||||
| 	"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) { | ||||
| 	// parse payload | ||||
| 	payload := &models.RoomReq{ | ||||
| @@ -32,6 +42,7 @@ func HandleCreateRoom(w http.ResponseWriter, r *http.Request) { | ||||
| 	} | ||||
| 	fi.State.RoomID = room.ID | ||||
| 	fi.Room = room | ||||
| 	fi.Room.IsPublic = true // hardcode for local test; move to form | ||||
| 	if err := saveFullInfo(fi); err != nil { | ||||
| 		msg := "failed to set current room to session" | ||||
| 		log.Error(msg, "error", err) | ||||
| @@ -103,9 +114,6 @@ func HandleRoomEnter(w http.ResponseWriter, r *http.Request) { | ||||
| } | ||||
|  | ||||
| func HandleJoinTeam(w http.ResponseWriter, r *http.Request) { | ||||
| 	// parse payload | ||||
| 	// team := r.URL.Query().Get("team") | ||||
| 	// role := r.URL.Query().Get("role") | ||||
| 	r.ParseForm() | ||||
| 	team := r.PostFormValue("team") | ||||
| 	role := r.PostFormValue("role") | ||||
| @@ -121,11 +129,20 @@ func HandleJoinTeam(w http.ResponseWriter, r *http.Request) { | ||||
| 		abortWithError(w, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	if fi.Room.IsRunning && role == "mime" { | ||||
| 		err = errors.New("cannot join as mime when game is running") | ||||
| 		abortWithError(w, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	fi, err = joinTeam(r.Context(), role, team) | ||||
| 	if err != nil { | ||||
| 		abortWithError(w, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	// reveal all cards | ||||
| 	if role == "mime" { | ||||
| 		fi.Room.RevealAllCards() | ||||
| 	} | ||||
| 	// return html | ||||
| 	tmpl, err := template.ParseGlob("components/*.html") | ||||
| 	if err != nil { | ||||
| @@ -177,6 +194,39 @@ func HandleStartGame(w http.ResponseWriter, r *http.Request) { | ||||
| 		abortWithError(w, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	// reveal all cards | ||||
| 	if fi.State.Role == "mime" { | ||||
| 		fi.Room.RevealAllCards() | ||||
| 	} | ||||
| 	// return html | ||||
| 	tmpl, err := template.ParseGlob("components/*.html") | ||||
| 	if err != nil { | ||||
| 		abortWithError(w, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	tmpl.ExecuteTemplate(w, "room", fi) | ||||
| } | ||||
|  | ||||
| func HandleJoinRoom(w http.ResponseWriter, r *http.Request) { | ||||
| 	roomID := r.URL.Query().Get("id") | ||||
| 	room, err := getRoomByID(roomID) | ||||
| 	if err != nil { | ||||
| 		abortWithError(w, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	fi, err := getFullInfoByCtx(r.Context()) | ||||
| 	if err != nil { | ||||
| 		abortWithError(w, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	room.PlayerList = append(room.PlayerList, fi.State.Username) | ||||
| 	fi.State.RoomID = room.ID | ||||
| 	fi.Room = room | ||||
| 	fi.List = nil | ||||
| 	if err := saveFullInfo(fi); err != nil { | ||||
| 		abortWithError(w, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	// return html | ||||
| 	tmpl, err := template.ParseGlob("components/*.html") | ||||
| 	if err != nil { | ||||
|   | ||||
| @@ -63,6 +63,15 @@ func HandleHome(w http.ResponseWriter, r *http.Request) { | ||||
| 		return | ||||
| 	} | ||||
| 	fi, _ := getFullInfoByCtx(r.Context()) | ||||
| 	if fi != nil && fi.Room != nil && fi.State != nil { | ||||
| 		if fi.State.Role == "mime" { | ||||
| 			fi.Room.RevealAllCards() | ||||
| 		} | ||||
| 	} | ||||
| 	if fi != nil && fi.Room == nil { | ||||
| 		log.Debug("loading list") | ||||
| 		fi.List = listPublicRooms() | ||||
| 	} | ||||
| 	log.Debug("data debug", "fi", fi) | ||||
| 	if err := tmpl.ExecuteTemplate(w, "base", fi); err != nil { | ||||
| 		log.Error("failed to exec templ;", "error", err, "templ", "base") | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Grail Finder
					Grail Finder