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