diff --git a/components/playerlist.html b/components/playerlist.html index 6be38df..2443c64 100644 --- a/components/playerlist.html +++ b/components/playerlist.html @@ -1,7 +1,13 @@ {{define "teamlist"}} -
-{{range .}} +
+

Guessers

+{{range .Guessers}}

{{.}}

{{end}}
+
+
+

Mime

+

{{.Mime}}

+
{{end}} diff --git a/components/room.html b/components/room.html index ac145db..93ef6df 100644 --- a/components/room.html +++ b/components/room.html @@ -1,19 +1,26 @@ {{define "room"}}
-

Hello {{.State.Username}}

+

Hello {{.State.Username}};

+

+ {{if eq .State.Team ""}} + join the team! + {{else}} + you're on the team {{.State.Team}}! + {{end}} +


- {{template "teamlist" .Room.BlueGuessers}} - {{if eq .State.Team ""}} + {{template "teamlist" .Room.BlueTeam}} + {{if ne .State.Team "blue"}} {{template "teampew" "blue"}} {{end}} - {{if eq .State.Team ""}} + {{if ne .State.Team "red"}} {{template "teampew" "red"}} {{end}} - {{template "teamlist" .Room.RedGuessers}} + {{template "teamlist" .Room.RedTeam}}

diff --git a/handlers/actions.go b/handlers/actions.go index c3f1bf5..9816a9a 100644 --- a/handlers/actions.go +++ b/handlers/actions.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "golias/models" + "golias/utils" ) func createRoom(ctx context.Context, req *models.RoomReq) (*models.Room, error) { @@ -140,3 +141,61 @@ func getFullInfoByCtx(ctx context.Context) (*models.FullInfo, error) { } return resp, nil } + +func joinTeam(ctx context.Context, role, team string) (*models.FullInfo, error) { + // get username + fi, _ := getFullInfoByCtx(ctx) + fi.Room.RedTeam.Guessers = utils.RemoveFromSlice(fi.State.Username, fi.Room.RedTeam.Guessers) + fi.Room.BlueTeam.Guessers = utils.RemoveFromSlice(fi.State.Username, fi.Room.BlueTeam.Guessers) + // get room + if role == "mime" { + if team == "blue" { + if fi.Room.BlueTeam.Mime != "" { + // error: alredy taken + err := errors.New("Mime role already taken!") + return fi, err + } + fi.Room.BlueTeam.Mime = fi.State.Username + fi.State.Team = "blue" + fi.State.Role = "mime" + if fi.Room.RedTeam.Mime == fi.State.Username { + fi.Room.RedTeam.Mime = "" + } + } else if team == "red" { + if fi.Room.RedTeam.Mime != "" { + // error: alredy taken + err := errors.New("Mime role already taken!") + return fi, err + } + fi.Room.RedTeam.Mime = fi.State.Username + fi.State.Team = "red" + fi.State.Role = "mime" + if fi.Room.BlueTeam.Mime == fi.State.Username { + fi.Room.BlueTeam.Mime = "" + } + } else { + err := errors.New("uknown team:" + team) + return nil, err + } + } else if role == "guesser" { + if team == "blue" { + fi.Room.BlueTeam.Guessers = append(fi.Room.BlueTeam.Guessers, fi.State.Username) + fi.State.Team = "blue" + fi.State.Role = "guesser" + } else if team == "red" { + fi.Room.RedTeam.Guessers = append(fi.Room.RedTeam.Guessers, fi.State.Username) + fi.State.Team = "red" + fi.State.Role = "guesser" + } else { + err := errors.New("uknown team:" + team) + return nil, err + } + } else { + err := errors.New("uknown role:" + role) + return nil, err + } + if err := saveFullInfoByUsername(fi.State.Username, fi); err != nil { + return nil, err + } + return fi, nil +} diff --git a/handlers/game.go b/handlers/game.go index c6fd2c1..0684823 100644 --- a/handlers/game.go +++ b/handlers/game.go @@ -107,46 +107,13 @@ func HandleJoinTeam(w http.ResponseWriter, r *http.Request) { return } // get username - 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) + fi, err := getFullInfoByCtx(r.Context()) + if err != nil { + abortWithError(w, err.Error()) return } - if err := saveFullInfoByUsername(fi.State.Username, fi); err != nil { - log.Error("failed to save state", "error", err) + fi, err = joinTeam(r.Context(), role, team) + if err != nil { abortWithError(w, err.Error()) return } diff --git a/handlers/handlers.go b/handlers/handlers.go index f82c1b7..23e3217 100644 --- a/handlers/handlers.go +++ b/handlers/handlers.go @@ -63,6 +63,7 @@ func HandleHome(w http.ResponseWriter, r *http.Request) { return } fi, _ := getFullInfoByCtx(r.Context()) + 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") } diff --git a/models/main.go b/models/main.go index ddf6435..bfb118c 100644 --- a/models/main.go +++ b/models/main.go @@ -31,19 +31,26 @@ func StrToWordColor(s string) WordColor { } } +type Team struct { + Guessers []string + Mime string +} + type Room struct { ID string `json:"id" db:"id"` CreatedAt time.Time `json:"created_at" db:"created_at"` // RoomName string `json:"room_name"` - RoomPass string `json:"room_pass"` - RoomLink string - CreatorName string `json:"creator_name"` - PlayerList []string `json:"player_list"` - TeamTurn string - RedMime string - BlueMime string - RedGuessers []string - BlueGuessers []string + RoomPass string `json:"room_pass"` + RoomLink string + CreatorName string `json:"creator_name"` + PlayerList []string `json:"player_list"` + TeamTurn string + RedTeam Team + BlueTeam Team + // RedMime string + // BlueMime string + // RedGuessers []string + // BlueGuessers []string Cards []WordCard GameSettings *GameSettings `json:"settings"` Result uint8 // 0 for unknown; 1 is win for red; 2 if for blue; diff --git a/models/state.go b/models/state.go index afd7a20..8b63450 100644 --- a/models/state.go +++ b/models/state.go @@ -75,13 +75,15 @@ func MakeTestState() *FullInfo { {Word: "tomato", Color: "red"}, {Word: "cloud", Color: "white"}, } + redTeam := Team{Guessers: []string{"Adam", "Eve"}, Mime: "Serpent"} + blueTeam := Team{Guessers: []string{"Abel", "Kain"}} room := &Room{ - ID: "test-id", - CreatedAt: time.Now(), - CreatorName: "test-name", - Cards: cards, - RedGuessers: []string{"Adam", "Eve"}, - BlueGuessers: []string{"Abel", "Kain"}, + ID: "test-id", + CreatedAt: time.Now(), + CreatorName: "test-name", + Cards: cards, + RedTeam: redTeam, + BlueTeam: blueTeam, } us := &UserState{ Username: "test-name", diff --git a/utils/main.go b/utils/main.go index f49313e..57b6253 100644 --- a/utils/main.go +++ b/utils/main.go @@ -22,3 +22,16 @@ func StrInSlice(key string, sl []string) bool { } return false } + +func RemoveFromSlice(key string, sl []string) []string { + if !StrInSlice(key, sl) { + return sl + } + resp := []string{} + for _, el := range sl { + if el != key { + resp = append(resp, el) + } + } + return resp +}