mchess-server/chess/player.go

102 lines
2.1 KiB
Go
Raw Normal View History

package chess
2023-04-18 20:19:28 +00:00
import (
"context"
2023-06-08 18:20:37 +00:00
"encoding/json"
"errors"
"log"
2023-06-25 14:11:29 +00:00
"mchess_server/api"
conn "mchess_server/connection"
2023-06-25 14:11:29 +00:00
"mchess_server/types"
2023-06-06 20:58:33 +00:00
"time"
2023-04-18 20:19:28 +00:00
"github.com/google/uuid"
"nhooyr.io/websocket"
2023-04-18 20:19:28 +00:00
)
type Player struct {
Uuid uuid.UUID
Conn *conn.Connection
InGame bool
wsConnEstablished chan bool
context context.Context
}
2023-04-18 20:19:28 +00:00
func NewPlayer(uuid uuid.UUID) *Player {
return &Player{
Uuid: uuid,
Conn: nil,
InGame: false,
wsConnEstablished: make(chan bool),
context: context.Background(),
}
}
func (p *Player) SetConnection(ctx context.Context, ws *websocket.Conn) {
p.Conn = conn.NewConnection(conn.WithWebsocket(ws), conn.WithContext(p.context))
p.context = ctx
p.wsConnEstablished <- true
}
2023-08-13 22:05:47 +00:00
func (p *Player) SendMoveAndPosition(move types.Move, boardPosition string) error {
2023-06-08 18:20:37 +00:00
messageToSend, err := json.Marshal(api.WebsocketMessage{
2023-10-12 19:03:12 +00:00
Type: api.MoveMessage,
Move: &move,
Position: &boardPosition,
2023-06-08 18:20:37 +00:00
})
if err != nil {
log.Println("Error while marshalling: ", err)
return err
}
err = p.writeMessage(messageToSend)
if err != nil {
log.Println("Error during message writing:", err)
return err
}
return nil
}
func (p *Player) writeMessage(msg []byte) error {
log.Printf("Writing message: %s to player %s", string(msg), p.Uuid.String())
return p.Conn.Write(p.context, msg)
}
2023-06-08 18:20:37 +00:00
func (p *Player) ReadMove() (types.Move, error) {
receivedMessage, err := p.readMessage()
2023-06-08 18:20:37 +00:00
if err != nil {
return types.Move{}, err
}
var msg api.WebsocketMessage
err = json.Unmarshal(receivedMessage, &msg)
if err != nil {
return types.Move{}, err
}
2023-10-12 19:03:12 +00:00
if !msg.IsValid() {
2023-06-08 18:20:37 +00:00
return types.Move{}, errors.New("not a valid move")
}
return *msg.Move, nil
}
func (p *Player) readMessage() ([]byte, error) {
msg, err := p.Conn.Read(p.context)
2023-06-08 18:20:37 +00:00
log.Printf("Reading message: %s from player %s", string(msg), p.Uuid.String())
return msg, err
}
2023-06-06 20:58:33 +00:00
func (p *Player) WaitForWebsocketConnection(c chan bool) {
timer := time.NewTimer(5 * time.Second)
2023-06-06 20:58:33 +00:00
select {
case <-p.wsConnEstablished:
c <- true
case <-timer.C:
return
}
}