Feat: switch team; team model
This commit is contained in:
@ -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}}
|
||||||
|
@ -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">
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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")
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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",
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user