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
	 Grail Finder
					Grail Finder