Feat: switch team; team model

This commit is contained in:
Grail Finder
2025-05-08 15:36:25 +03:00
parent 21948b23f4
commit 3cc2ecb93d
8 changed files with 122 additions and 60 deletions

View File

@ -1,7 +1,13 @@
{{define "teamlist"}} {{define "teamlist"}}
<div class="playerlist border border-gray-300 rounded-lg p-4"> <div class="playerlist border border-gray-300 rounded mb-2">
{{range .}} <p class=border>Guessers</p>
{{range .Guessers}}
<p>{{.}}</p> <p>{{.}}</p>
{{end}} {{end}}
</div> </div>
<hr />
<div class="playerlist border border-gray-300 rounded mb-2">
<p class=border>Mime</p>
<p>{{.Mime}}</p>
</div>
{{end}} {{end}}

View File

@ -1,19 +1,26 @@
{{define "room"}} {{define "room"}}
<div id="hello-user"> <div id="hello-user">
<p>Hello {{.State.Username}}</p> <p>Hello {{.State.Username}};</p>
<p>
{{if eq .State.Team ""}}
join the team!
{{else}}
you're on the team {{.State.Team}}!
{{end}}
</p>
</div> </div>
<hr /> <hr />
<div class="flex justify-center"> <div class="flex justify-center">
<!-- Left Panel --> <!-- Left Panel -->
{{template "teamlist" .Room.BlueGuessers}} {{template "teamlist" .Room.BlueTeam}}
{{if eq .State.Team ""}} {{if ne .State.Team "blue"}}
{{template "teampew" "blue"}} {{template "teampew" "blue"}}
{{end}} {{end}}
<!-- Right Panel --> <!-- Right Panel -->
{{if eq .State.Team ""}} {{if ne .State.Team "red"}}
{{template "teampew" "red"}} {{template "teampew" "red"}}
{{end}} {{end}}
{{template "teamlist" .Room.RedGuessers}} {{template "teamlist" .Room.RedTeam}}
</div> </div>
<hr /> <hr />
<div id="cardtable"> <div id="cardtable">

View File

@ -5,6 +5,7 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"golias/models" "golias/models"
"golias/utils"
) )
func createRoom(ctx context.Context, req *models.RoomReq) (*models.Room, error) { 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 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
}

View File

@ -107,46 +107,13 @@ func HandleJoinTeam(w http.ResponseWriter, r *http.Request) {
return return
} }
// get username // get username
fi, _ := getFullInfoByCtx(r.Context()) fi, err := getFullInfoByCtx(r.Context())
// get room if err != nil {
if role == "mime" { abortWithError(w, err.Error())
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 return
} }
} else if role == "guesser" { fi, err = joinTeam(r.Context(), role, team)
if team == "blue" { if err != nil {
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()) abortWithError(w, err.Error())
return return
} }

View File

@ -63,6 +63,7 @@ func HandleHome(w http.ResponseWriter, r *http.Request) {
return return
} }
fi, _ := getFullInfoByCtx(r.Context()) fi, _ := getFullInfoByCtx(r.Context())
log.Debug("data debug", "fi", fi)
if err := tmpl.ExecuteTemplate(w, "base", fi); err != nil { if err := tmpl.ExecuteTemplate(w, "base", fi); err != nil {
log.Error("failed to exec templ;", "error", err, "templ", "base") log.Error("failed to exec templ;", "error", err, "templ", "base")
} }

View File

@ -31,6 +31,11 @@ func StrToWordColor(s string) WordColor {
} }
} }
type Team struct {
Guessers []string
Mime string
}
type Room struct { type Room struct {
ID string `json:"id" db:"id"` ID string `json:"id" db:"id"`
CreatedAt time.Time `json:"created_at" db:"created_at"` CreatedAt time.Time `json:"created_at" db:"created_at"`
@ -40,10 +45,12 @@ type Room struct {
CreatorName string `json:"creator_name"` CreatorName string `json:"creator_name"`
PlayerList []string `json:"player_list"` PlayerList []string `json:"player_list"`
TeamTurn string TeamTurn string
RedMime string RedTeam Team
BlueMime string BlueTeam Team
RedGuessers []string // RedMime string
BlueGuessers []string // BlueMime string
// RedGuessers []string
// BlueGuessers []string
Cards []WordCard Cards []WordCard
GameSettings *GameSettings `json:"settings"` GameSettings *GameSettings `json:"settings"`
Result uint8 // 0 for unknown; 1 is win for red; 2 if for blue; Result uint8 // 0 for unknown; 1 is win for red; 2 if for blue;

View File

@ -75,13 +75,15 @@ func MakeTestState() *FullInfo {
{Word: "tomato", Color: "red"}, {Word: "tomato", Color: "red"},
{Word: "cloud", Color: "white"}, {Word: "cloud", Color: "white"},
} }
redTeam := Team{Guessers: []string{"Adam", "Eve"}, Mime: "Serpent"}
blueTeam := Team{Guessers: []string{"Abel", "Kain"}}
room := &Room{ room := &Room{
ID: "test-id", ID: "test-id",
CreatedAt: time.Now(), CreatedAt: time.Now(),
CreatorName: "test-name", CreatorName: "test-name",
Cards: cards, Cards: cards,
RedGuessers: []string{"Adam", "Eve"}, RedTeam: redTeam,
BlueGuessers: []string{"Abel", "Kain"}, BlueTeam: blueTeam,
} }
us := &UserState{ us := &UserState{
Username: "test-name", Username: "test-name",

View File

@ -22,3 +22,16 @@ func StrInSlice(key string, sl []string) bool {
} }
return false 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
}