Files
justthefrax/player.go
2025-01-06 09:25:14 -08:00

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)
}