GameState uses GameEvents
parent
1c6025e78c
commit
d1c4738796
|
|
@ -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(×tamp, &b); err != nil {
|
if err := rows.Scan(×tamp, &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(×tamp, &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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue