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}}
+
+
{{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
+}