Feat: join team
This commit is contained in:
		| @@ -60,6 +60,26 @@ func getStateByCtx(ctx context.Context) (*models.UserState, error) { | ||||
| 	return us, nil | ||||
| } | ||||
|  | ||||
| func saveStateByCtx(ctx context.Context, state *models.UserState) error { | ||||
| 	username, ok := ctx.Value(models.CtxUsernameKey).(string) | ||||
| 	if !ok { | ||||
| 		log.Debug("no username in ctx") | ||||
| 		return errors.New("no username in ctx") | ||||
| 	} | ||||
| 	return saveState(username, state) | ||||
| } | ||||
|  | ||||
| func saveFullInfoByUsername(username string, fi *models.FullInfo) error { | ||||
| 	// INFO: unfortunately working no transactions; so case are possible where first object is updated but the second is not | ||||
| 	if err := saveState(username, fi.State); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if err := saveRoom(fi.Room); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // cache | ||||
|  | ||||
| func saveState(username string, state *models.UserState) error { | ||||
|   | ||||
| @@ -59,7 +59,6 @@ func HandleFrontLogin(w http.ResponseWriter, r *http.Request) { | ||||
| 	} | ||||
| 	// make sure username does not exists | ||||
| 	cleanName := utils.RemoveSpacesFromStr(username) | ||||
| 	// TODO: create user in db | ||||
| 	// login user | ||||
| 	cookie, err := makeCookie(cleanName, r.RemoteAddr) | ||||
| 	if err != nil { | ||||
| @@ -73,16 +72,15 @@ func HandleFrontLogin(w http.ResponseWriter, r *http.Request) { | ||||
| 		abortWithError(w, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	// session, ok :=r.Context().Value(models.CtxSessionKey).(*models.Session) | ||||
| 	// if !ok{ | ||||
| 	// 	abortWithError(w, "failed to extract session from ctx") | ||||
| 	// 	return | ||||
| 	// } | ||||
| 	// state := models.InitState(cleanName) | ||||
| 	state := models.MakeTestState() | ||||
| 	state.State.Username = cleanName | ||||
| 	// save state to cache | ||||
| 	saveState(cleanName, state.State) | ||||
| 	// if err := saveState(cleanName, state.State); err != nil { | ||||
| 	if err := saveFullInfoByUsername(cleanName, state); err != nil { | ||||
| 		log.Error("failed to save state", "error", err) | ||||
| 		abortWithError(w, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	tmpl.ExecuteTemplate(w, "base", state) | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -66,6 +66,19 @@ func HandleRoomEnter(w http.ResponseWriter, r *http.Request) { | ||||
| 		abortWithError(w, msg) | ||||
| 		return | ||||
| 	} | ||||
| 	state, err := getStateByCtx(ctx) | ||||
| 	if err != nil { | ||||
| 		log.Error("failed to get state", "error", err) | ||||
| 		abortWithError(w, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	state.RoomID = room.ID | ||||
| 	// update state | ||||
| 	if err := saveStateByCtx(ctx, state); err != nil { | ||||
| 		log.Error("failed to update state", "error", err) | ||||
| 		abortWithError(w, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	// send msg of created room | ||||
| 	// h.Broker.Notifier <- broker.NotificationEvent{ | ||||
| 	// 	EventName: models.MsgRoomListUpdate, | ||||
| @@ -82,23 +95,66 @@ 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") | ||||
| 	// team := r.URL.Query().Get("team") | ||||
| 	// role := r.URL.Query().Get("role") | ||||
| 	r.ParseForm() | ||||
| 	team := r.PostFormValue("team") | ||||
| 	role := r.PostFormValue("role") | ||||
| 	if team == "" || role == "" { | ||||
| 		msg := "missing team or role" | ||||
| 		log.Error(msg) | ||||
| 		abortWithError(w, msg) | ||||
| 		// error | ||||
| 		return | ||||
| 	} | ||||
| 	// get username | ||||
| 	// get state | ||||
| 	fi, _ := getFullInfoByCtx(r.Context()) | ||||
| 	// get room | ||||
| 	if role == "mime" { | ||||
| 		if team == "blue" { | ||||
| 			fi.Room.BlueMime = fi.State.Username | ||||
| 			fi.State.Team = "blue" | ||||
| 			fi.State.Role = "mime" | ||||
| 		} else if team == "red" { | ||||
| 			fi.Room.RedMime = fi.State.Username | ||||
| 			fi.State.Team = "red" | ||||
| 			fi.State.Role = "mime" | ||||
| 		} else { | ||||
| 			msg := "uknown team:" + team | ||||
| 			log.Error(msg) | ||||
| 			abortWithError(w, msg) | ||||
| 			return | ||||
| 		} | ||||
| 	} else if role == "guesser" { | ||||
| 		if team == "blue" { | ||||
| 			fi.Room.BlueGuessers = append(fi.Room.BlueGuessers, fi.State.Username) | ||||
| 			fi.State.Team = "red" | ||||
| 			fi.State.Role = "guesser" | ||||
| 		} else if team == "red" { | ||||
| 			fi.Room.RedGuessers = append(fi.Room.RedGuessers, fi.State.Username) | ||||
| 			fi.State.Team = "red" | ||||
| 			fi.State.Role = "guesser" | ||||
| 		} else { | ||||
| 			msg := "uknown team:" + team | ||||
| 			log.Error(msg) | ||||
| 			abortWithError(w, msg) | ||||
| 			return | ||||
| 		} | ||||
| 	} else { | ||||
| 		msg := "uknown role:" + role | ||||
| 		log.Error(msg) | ||||
| 		abortWithError(w, msg) | ||||
| 		return | ||||
| 	} | ||||
| 	if err := saveFullInfoByUsername(fi.State.Username, fi); err != nil { | ||||
| 		log.Error("failed to save state", "error", err) | ||||
| 		abortWithError(w, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	// return html | ||||
| 	tmpl, err := template.ParseGlob("components/*.html") | ||||
| 	if err != nil { | ||||
| 		abortWithError(w, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	tmpl.ExecuteTemplate(w, "base", nil) | ||||
| 	tmpl.ExecuteTemplate(w, "base", fi) | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Grail Finder
					Grail Finder