diff --git a/cmd/server/game.go b/cmd/server/game.go index 1f8296c..a47bfe1 100644 --- a/cmd/server/game.go +++ b/cmd/server/game.go @@ -6,12 +6,14 @@ import ( "fmt" "io" "log" + "time" ) type UserGameServer struct { - ID string - Session Session - games Games + ID string + Session Session + games Games + lastPoll time.Time } func NewUserGameServer(ctx context.Context, session Session, games Games) (*UserGameServer, error) { @@ -29,6 +31,28 @@ func NewUserGameServer(ctx context.Context, session Session, games Games) (*User }, nil } +func (ugs *UserGameServer) More(ctx context.Context) error { + defer func() { + ugs.lastPoll = time.Now() + }() + + for { + select { + case <-ctx.Done(): + return ctx.Err() + case <-time.After(time.Second * 1): + } + + if events, err := ugs.games.GameEvents(ctx, ugs.ID, ugs.lastPoll); err != nil { + return err + } else if len(events) == 0 { + continue + } + + return nil + } +} + func (ugs *UserGameServer) Listen(ctx context.Context, can context.CancelFunc, reader func(context.Context) ([]byte, error)) { defer can() if err := ugs.listen(ctx, reader); err != nil && ctx.Err() == nil { diff --git a/cmd/server/ws.go b/cmd/server/ws.go index 5378a9d..c5aa93a 100644 --- a/cmd/server/ws.go +++ b/cmd/server/ws.go @@ -9,7 +9,6 @@ import ( "slices" "strconv" "strings" - "time" "github.com/coder/websocket" ) @@ -25,35 +24,21 @@ func (s *S) serveWS(w http.ResponseWriter, r *http.Request) error { } defer c.CloseNow() - gameServer, err := NewUserGameServer(r.Context(), s.Session(r.Context()), s.games) + ugs, err := NewUserGameServer(r.Context(), s.Session(r.Context()), s.games) if err != nil { return err } - game := gameServer.ID + game := ugs.ID ctx, can := context.WithCancel(r.Context()) defer can() - go gameServer.Listen(ctx, can, func(ctx context.Context) ([]byte, error) { + go ugs.Listen(ctx, can, func(ctx context.Context) ([]byte, error) { _, b, err := c.Read(ctx) return b, err }) - var last time.Time - for { - select { - case <-ctx.Done(): - return ctx.Err() - case <-time.After(time.Second * 1): - } - - if events, err := s.games.GameEvents(ctx, game, last); err != nil { - return err - } else if len(events) == 0 { - continue - } - last = time.Now() - + for ugs.More(ctx) == nil { gameState, err := s.games.GameState(ctx, game) if err != nil { return err @@ -162,4 +147,6 @@ func (s *S) serveWS(w http.ResponseWriter, r *http.Request) error { return err } } + + return ctx.Err() }