From 0d44fd56edbebaf126c0d54f2c09ef6440108d33 Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Sun, 15 Dec 2024 11:01:48 -0700 Subject: [PATCH] extract reading from websocket into UserGameServer --- cmd/server/game.go | 80 ++++++++++++++++++++++++++++++++++++++++++++++ cmd/server/ws.go | 73 +++++++----------------------------------- 2 files changed, 91 insertions(+), 62 deletions(-) create mode 100644 cmd/server/game.go diff --git a/cmd/server/game.go b/cmd/server/game.go new file mode 100644 index 0000000..1f8296c --- /dev/null +++ b/cmd/server/game.go @@ -0,0 +1,80 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "io" + "log" +) + +type UserGameServer struct { + ID string + Session Session + games Games +} + +func NewUserGameServer(ctx context.Context, session Session, games Games) (*UserGameServer, error) { + ids, err := games.GamesForUser(ctx, session.ID) + if err != nil { + return nil, err + } + if len(ids) == 0 { + return nil, fmt.Errorf("user %s is in zero games", session.ID) + } + return &UserGameServer{ + ID: ids[0], + Session: session, + games: games, + }, 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 { + log.Println(err) + } +} + +func (ugs *UserGameServer) listen(ctx context.Context, reader func(context.Context) ([]byte, error)) error { + for ctx.Err() == nil { + b, err := reader(ctx) + if err != nil { + return err + } + log.Printf("READ %s", b) + + var m map[string]string + if err := json.Unmarshal(b, &m); err != nil { + return err + } + log.Printf("UNMARSHAL %+v", m) + + if m["party"] == "start" { + if gameState, err := ugs.games.GameState(ctx, ugs.ID); err != nil { + return err + } else if gameState.Started { + } else if err := ugs.games.CreateEventAssignmentRotation(ctx, ugs.ID, "", "", "", 0); err != nil { + return err + } + } else if m["k"] != "" { + log.Println("TODO a kill occurred") + return io.EOF + } else if name := m["name"]; name != "" { + if err := ugs.games.UpdateUserName(ctx, ugs.Session.ID, name); err != nil { + return err + } + } else if m["again"] == "true" { + if gameState, err := ugs.games.GameState(ctx, ugs.ID); err != nil { + return err + } else if gameState.Completed.IsZero() { + } else { + log.Println("TODO new game") + return io.EOF + } + } else { + return fmt.Errorf("UNKNOWN: %+v", m) + } + } + return ctx.Err() +} diff --git a/cmd/server/ws.go b/cmd/server/ws.go index a9f6f5b..5378a9d 100644 --- a/cmd/server/ws.go +++ b/cmd/server/ws.go @@ -5,7 +5,6 @@ import ( "encoding/json" "fmt" "io" - "log" "net/http" "slices" "strconv" @@ -20,75 +19,25 @@ func isWS(r *http.Request) bool { } func (s *S) serveWS(w http.ResponseWriter, r *http.Request) error { - ctx, can := context.WithCancel(r.Context()) - defer can() - r = r.WithContext(ctx) - - session := s.Session(ctx) - games, err := s.games.GamesForUser(ctx, session.ID) - if err != nil { - return err - } - if len(games) == 0 { - return fmt.Errorf("user %s is in zero games", session.ID) - } - game := games[0] - c, err := websocket.Accept(w, r, nil) if err != nil { return err } defer c.CloseNow() - go func() { - defer can() - for { - _, b, err := c.Read(ctx) - if err != nil { - log.Println(err) - return - } - log.Printf("READ %s", b) + gameServer, err := NewUserGameServer(r.Context(), s.Session(r.Context()), s.games) + if err != nil { + return err + } + game := gameServer.ID - var m map[string]string - if err := json.Unmarshal(b, &m); err != nil { - log.Println(err) - return - } - log.Printf("UNMARSHAL %+v", m) + ctx, can := context.WithCancel(r.Context()) + defer can() - if m["party"] == "start" { - if gameState, err := s.games.GameState(ctx, game); err != nil { - log.Println(err) - return - } else if gameState.Started { - } else if err := s.games.CreateEventAssignmentRotation(ctx, game, "", "", "", 0); err != nil { - log.Println(err) - return - } - } else if m["k"] != "" { - log.Println("TODO a kill occurred") - return - } else if name := m["name"]; name != "" { - if err := s.games.UpdateUserName(ctx, s.Session(ctx).ID, name); err != nil { - log.Println(err) - return - } - } else if m["again"] == "true" { - if gameState, err := s.games.GameState(ctx, game); err != nil { - log.Println(err) - return - } else if gameState.Completed.IsZero() { - } else { - log.Println("TODO new game") - return - } - } else { - log.Printf("UNKNOWN: %+v", m) - return - } - } - }() + go gameServer.Listen(ctx, can, func(ctx context.Context) ([]byte, error) { + _, b, err := c.Read(ctx) + return b, err + }) var last time.Time for {