From 1c6025e78ce3b11e369846e439c14fc9d2e0869f Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Sun, 15 Dec 2024 08:44:51 -0700 Subject: [PATCH] refactor to share --- cmd/server/games.go | 106 +++++++++++++++++++++++++++++++------------- 1 file changed, 74 insertions(+), 32 deletions(-) diff --git a/cmd/server/games.go b/cmd/server/games.go index 46ddeaf..a547f70 100644 --- a/cmd/server/games.go +++ b/cmd/server/games.go @@ -168,6 +168,63 @@ const ( AssignmentRotation ) +type Event interface{ event() } + +func (EventPlayerJoin) event() {} +func (EventPlayerLeave) event() {} +func (EventGameComplete) event() {} +func (EventAssignmentRotation) event() {} + +func (games Games) GameEvents(ctx context.Context, id string, since time.Time) ([]Event, error) { + var results []Event + err := games.db.Query(ctx, func(rows *sql.Rows) error { + var timestamp time.Time + var b []byte + if err := rows.Scan(×tamp, &b); err != nil { + return err + } + event, err := parseEvent(b) + results = append(results, event) + return err + }, ` + SELECT + timestamp, + payload + FROM events + WHERE game_uuid=? and timestamp>? + ORDER BY timestamp ASC + `, id, since) + return results, err +} + +func parseEvent(b []byte) (Event, error) { + var peek struct { + Type EventType + } + if err := json.Unmarshal(b, &peek); err != nil { + return nil, err + } + switch peek.Type { + case PlayerJoin: + var playerJoin EventPlayerJoin + err := json.Unmarshal(b, &playerJoin) + return playerJoin, err + case PlayerLeave: + var playerLeave EventPlayerLeave + err := json.Unmarshal(b, &playerLeave) + return playerLeave, err + case GameComplete: + var gameComplete EventGameComplete + err := json.Unmarshal(b, &gameComplete) + return gameComplete, err + case AssignmentRotation: + var assignmentRotation EventAssignmentRotation + err := json.Unmarshal(b, &assignmentRotation) + return assignmentRotation, err + } + return nil, fmt.Errorf("unknown event type %d: %s", peek.Type, b) +} + func (games Games) GameState(ctx context.Context, id string) (GameState, error) { result := GameState{Players: map[string]PlayerState{}} @@ -178,41 +235,26 @@ func (games Games) GameState(ctx context.Context, id string) (GameState, error) return err } - var peek struct { - Type EventType - } - if err := json.Unmarshal(payload, &peek); err != nil { + event, err := parseEvent(payload) + if err != nil { return err } - switch peek.Type { - case PlayerJoin: - var playerJoin EventPlayerJoin - if err := json.Unmarshal(payload, &playerJoin); err != nil { - return err - } + switch event.(type) { + case EventPlayerJoin: + playerJoin := event.(EventPlayerJoin) result.Players[playerJoin.ID] = PlayerState{} return nil - case PlayerLeave: - var playerLeave EventPlayerLeave - if err := json.Unmarshal(payload, &playerLeave); err != nil { - return err - } + case EventPlayerLeave: + playerLeave := event.(EventPlayerLeave) delete(result.Players, playerLeave.ID) return nil - case GameComplete: - var gameComplete EventGameComplete - if err := json.Unmarshal(payload, &gameComplete); err != nil { - return err - } + case EventGameComplete: result.Completed = timestamp return nil - case AssignmentRotation: + case EventAssignmentRotation: result.Started = true - var assignmentRotation EventAssignmentRotation - if err := json.Unmarshal(payload, &assignmentRotation); err != nil { - return err - } + assignmentRotation := event.(EventAssignmentRotation) if killer, ok := result.Players[assignmentRotation.Killer]; !ok { } else if _, ok := result.Players[assignmentRotation.Victim]; !ok { @@ -237,7 +279,7 @@ func (games Games) GameState(ctx context.Context, id string) (GameState, error) } return nil default: - return fmt.Errorf("unknown event type %d: %s", peek.Type, payload) + return fmt.Errorf("unknown event type %T: %s", event, payload) } return nil @@ -278,12 +320,12 @@ func (games Games) CreateGame(ctx context.Context, name string) (string, error) func (games Games) CreateEventPlayerJoin(ctx context.Context, id string, player, name string) error { if err := games.db.Exec(ctx, ` - INSERT INTO users ( - uuid, - name - ) VALUES (?, ?) - ON CONFLICT DO UPDATE SET name=? WHERE uuid=?; - `, player, name, name, player); err != nil { + INSERT INTO users ( + uuid, + name + ) VALUES (?, ?) + ON CONFLICT DO UPDATE SET name=? WHERE uuid=?; + `, player, name, name, player); err != nil { return err } if err := games.db.Exec(ctx, `