109 lines
2.0 KiB
Go
109 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
)
|
|
|
|
var nextPlayerId uint = 1
|
|
|
|
type Player struct {
|
|
Client
|
|
|
|
Name string `json:"name"`
|
|
Team string `json:"team"`
|
|
Id uint `json:"id"`
|
|
}
|
|
|
|
func (p *Player) getClient() *Client { return &p.Client }
|
|
func (p *Player) String() string { return fmt.Sprintf("Player %d", p.Id) }
|
|
|
|
func (p *Player) handleMessage(env GameMessage) error {
|
|
game := p.Client.game
|
|
|
|
switch env.Type {
|
|
|
|
case "register":
|
|
m, err := parseSubMessage[RegisterMessage](env.Message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return p.handleRegisterMessage(*m)
|
|
|
|
case "reveal":
|
|
value, err := parseSubMessage[bool](env.Message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if game.activePlayer != p {
|
|
return fmt.Errorf("You are not the active player")
|
|
}
|
|
game.activePlayer = nil
|
|
game.reveal(*value)
|
|
return nil
|
|
|
|
default:
|
|
return fmt.Errorf("Unknown message")
|
|
}
|
|
|
|
}
|
|
|
|
func (p *Player) activate(story string) {
|
|
game := p.Client.game
|
|
game.activePlayer = p
|
|
|
|
log.Printf("Card for player %s: %s", p.Name, story)
|
|
msg := makeMessage("card", story)
|
|
p.send(msg)
|
|
}
|
|
|
|
func (p *Player) finish() {
|
|
p.Client.game.unregisterPlayer <- p
|
|
}
|
|
|
|
type RegisterMessage struct {
|
|
Name string `json: "name"`
|
|
Team string `json: "team"`
|
|
Token string `json: "token"`
|
|
}
|
|
|
|
func (p *Player) handleRegisterMessage(m RegisterMessage) error {
|
|
if p.Name != "" || p.Team != "" {
|
|
return fmt.Errorf("Already registered as %s:%s", p.Team, p.Name)
|
|
}
|
|
|
|
if !p.game.checkPlayerToken(m.Token) {
|
|
return fmt.Errorf("Incorrect token")
|
|
}
|
|
|
|
p.Name = m.Name
|
|
p.Team = m.Team
|
|
p.game.registerPlayer <- p
|
|
|
|
log.Printf("Player %d is %s:%s", p.Id, p.Team, p.Name)
|
|
|
|
msg := makeMessage("registered", p)
|
|
p.send(msg)
|
|
return nil
|
|
}
|
|
|
|
func servePlayerWs(game *Game, w http.ResponseWriter, r *http.Request) {
|
|
conn, err := upgrader.Upgrade(w, r, nil)
|
|
if err != nil {
|
|
log.Println(err)
|
|
return
|
|
}
|
|
|
|
id := nextPlayerId
|
|
nextPlayerId++
|
|
player := &Player{
|
|
Client: newClient(game, conn),
|
|
Id: id,
|
|
}
|
|
|
|
go writePump(player)
|
|
go readPump(player)
|
|
}
|