GameState uses GameEvents

main
Bel LaPointe 2024-12-15 08:49:43 -07:00
parent 1c6025e78c
commit d1c4738796
1 changed files with 37 additions and 44 deletions

View File

@ -142,18 +142,22 @@ type (
EventType int EventType int
EventPlayerJoin struct { EventPlayerJoin struct {
Type EventType Type EventType
ID string Timestamp time.Time
ID string
} }
EventPlayerLeave struct { EventPlayerLeave struct {
Type EventType Type EventType
ID string Timestamp time.Time
ID string
} }
EventGameComplete struct { EventGameComplete struct {
Type EventType Type EventType
Timestamp time.Time
} }
EventAssignmentRotation struct { EventAssignmentRotation struct {
Type EventType Type EventType
Timestamp time.Time
Killer string Killer string
Victim string Victim string
KillWord KillWord KillWord KillWord
@ -183,7 +187,7 @@ func (games Games) GameEvents(ctx context.Context, id string, since time.Time) (
if err := rows.Scan(&timestamp, &b); err != nil { if err := rows.Scan(&timestamp, &b); err != nil {
return err return err
} }
event, err := parseEvent(b) event, err := parseEvent(b, timestamp)
results = append(results, event) results = append(results, event)
return err return err
}, ` }, `
@ -197,7 +201,7 @@ func (games Games) GameEvents(ctx context.Context, id string, since time.Time) (
return results, err return results, err
} }
func parseEvent(b []byte) (Event, error) { func parseEvent(b []byte, timestamp time.Time) (Event, error) {
var peek struct { var peek struct {
Type EventType Type EventType
} }
@ -206,21 +210,25 @@ func parseEvent(b []byte) (Event, error) {
} }
switch peek.Type { switch peek.Type {
case PlayerJoin: case PlayerJoin:
var playerJoin EventPlayerJoin var v EventPlayerJoin
err := json.Unmarshal(b, &playerJoin) err := json.Unmarshal(b, &v)
return playerJoin, err v.Timestamp = timestamp
return v, err
case PlayerLeave: case PlayerLeave:
var playerLeave EventPlayerLeave var v EventPlayerLeave
err := json.Unmarshal(b, &playerLeave) err := json.Unmarshal(b, &v)
return playerLeave, err v.Timestamp = timestamp
return v, err
case GameComplete: case GameComplete:
var gameComplete EventGameComplete var v EventGameComplete
err := json.Unmarshal(b, &gameComplete) err := json.Unmarshal(b, &v)
return gameComplete, err v.Timestamp = timestamp
return v, err
case AssignmentRotation: case AssignmentRotation:
var assignmentRotation EventAssignmentRotation var v EventAssignmentRotation
err := json.Unmarshal(b, &assignmentRotation) err := json.Unmarshal(b, &v)
return assignmentRotation, err v.Timestamp = timestamp
return v, err
} }
return nil, fmt.Errorf("unknown event type %d: %s", peek.Type, b) return nil, fmt.Errorf("unknown event type %d: %s", peek.Type, b)
} }
@ -228,30 +236,22 @@ func parseEvent(b []byte) (Event, error) {
func (games Games) GameState(ctx context.Context, id string) (GameState, error) { func (games Games) GameState(ctx context.Context, id string) (GameState, error) {
result := GameState{Players: map[string]PlayerState{}} result := GameState{Players: map[string]PlayerState{}}
err := games.db.Query(ctx, func(rows *sql.Rows) error { events, err := games.GameEvents(ctx, id, time.Time{})
var timestamp time.Time if err != nil {
var payload []byte return result, err
if err := rows.Scan(&timestamp, &payload); err != nil { }
return err
}
event, err := parseEvent(payload)
if err != nil {
return err
}
for _, event := range events {
switch event.(type) { switch event.(type) {
case EventPlayerJoin: case EventPlayerJoin:
playerJoin := event.(EventPlayerJoin) playerJoin := event.(EventPlayerJoin)
result.Players[playerJoin.ID] = PlayerState{} result.Players[playerJoin.ID] = PlayerState{}
return nil
case EventPlayerLeave: case EventPlayerLeave:
playerLeave := event.(EventPlayerLeave) playerLeave := event.(EventPlayerLeave)
delete(result.Players, playerLeave.ID) delete(result.Players, playerLeave.ID)
return nil
case EventGameComplete: case EventGameComplete:
result.Completed = timestamp gameComplete := event.(EventGameComplete)
return nil result.Completed = gameComplete.Timestamp
case EventAssignmentRotation: case EventAssignmentRotation:
result.Started = true result.Started = true
assignmentRotation := event.(EventAssignmentRotation) assignmentRotation := event.(EventAssignmentRotation)
@ -260,7 +260,7 @@ func (games Games) GameState(ctx context.Context, id string) (GameState, error)
} else if _, ok := result.Players[assignmentRotation.Victim]; !ok { } else if _, ok := result.Players[assignmentRotation.Victim]; !ok {
} else { } else {
killer.Kills = append(killer.Kills, Kill{ killer.Kills = append(killer.Kills, Kill{
Timestamp: timestamp, Timestamp: assignmentRotation.Timestamp,
Victim: assignmentRotation.Victim, Victim: assignmentRotation.Victim,
KillWord: assignmentRotation.KillWord, KillWord: assignmentRotation.KillWord,
}) })
@ -277,17 +277,10 @@ func (games Games) GameState(ctx context.Context, id string) (GameState, error)
player.KillWords = v player.KillWords = v
result.Players[k] = player result.Players[k] = player
} }
return nil
default: default:
return fmt.Errorf("unknown event type %T: %s", event, payload) return GameState{}, fmt.Errorf("unknown event type %T", event)
} }
}
return nil
}, `
SELECT timestamp, payload
FROM events
WHERE game_uuid=?
`, id)
return result, err return result, err
} }