GameReset event

main
Bel LaPointe 2024-12-15 14:17:07 -07:00
parent 54116131b3
commit bf3b341b69
3 changed files with 36 additions and 27 deletions

View File

@ -169,6 +169,7 @@ func (games Games) GameByName(ctx context.Context, name string) (string, error)
type ( type (
GameState struct { GameState struct {
ID string
Started bool Started bool
Completed time.Time Completed time.Time
Players map[string]PlayerState Players map[string]PlayerState
@ -231,6 +232,7 @@ type (
EventGameReset struct { EventGameReset struct {
Type EventType Type EventType
Timestamp time.Time Timestamp time.Time
ID string
} }
AllKillWords map[string]KillWords AllKillWords map[string]KillWords
) )
@ -327,7 +329,7 @@ func parseEvent(b []byte, timestamp time.Time) (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{ID: id, Players: map[string]PlayerState{}}
events, err := games.GameEvents(ctx, id, time.Time{}) events, err := games.GameEvents(ctx, id, time.Time{})
if err != nil { if err != nil {
@ -368,7 +370,7 @@ func (games Games) GameState(ctx context.Context, id string) (GameState, error)
result.Players[k] = player result.Players[k] = player
} }
case EventGameReset: case EventGameReset:
return GameState{}, fmt.Errorf("not impl") return games.GameState(ctx, e.ID)
default: default:
return GameState{}, fmt.Errorf("unknown event type %T", event) return GameState{}, fmt.Errorf("unknown event type %T", event)
} }
@ -449,8 +451,30 @@ func (games Games) CreateEventAssignmentRotation(ctx context.Context, id string,
return games.createEvent(ctx, id, event) return games.createEvent(ctx, id, event)
} }
func (games Games) CreateEventGameReset(ctx context.Context, id string, killer, victim, word string, points int) error { func (games Games) CreateEventGameReset(ctx context.Context, gid string) error {
return fmt.Errorf("not impl") state, err := games.GameState(ctx, gid)
if err != nil {
return err
}
name, err := games.GameName(ctx, gid)
if err != nil {
return err
}
gid2, err := games.CreateGame(ctx, name)
if err != nil {
return err
}
for p := range state.Players {
if err := games.CreateEventPlayerJoin(ctx, gid2, p); err != nil {
return err
}
}
event := EventGameReset{
Type: GameReset,
Timestamp: time.Now(),
ID: gid2,
}
return games.createEvent(ctx, gid, event)
} }
func (words KillWords) Empty() bool { func (words KillWords) Empty() bool {
@ -683,24 +707,6 @@ func (games Games) createEvent(ctx context.Context, id string, v any) error {
`, id, time.Now(), payload) `, id, time.Now(), payload)
} }
// TODO not impl gotta be an event so existing websockets look at new game func (games *Games) Reset(ctx context.Context, gid string) error {
func (games *Games) Reset(ctx context.Context, gid string) (string, error) { return games.CreateEventGameReset(ctx, gid)
state, err := games.GameState(ctx, gid)
if err != nil {
return "", err
}
name, err := games.GameName(ctx, gid)
if err != nil {
return "", err
}
gid2, err := games.CreateGame(ctx, name)
if err != nil {
return "", err
}
for p := range state.Players {
if err := games.CreateEventPlayerJoin(ctx, gid2, p); err != nil {
return "", err
}
}
return gid2, nil
} }

View File

@ -150,10 +150,12 @@ func TestGames(t *testing.T) {
t.Fatal("state.Completed is zero") t.Fatal("state.Completed is zero")
} }
if id, err := games.Reset(ctx, id); err != nil { if err := games.Reset(ctx, id); err != nil {
t.Fatal(err) t.Fatal(err)
} else if state, err := games.GameState(ctx, id); err != nil { } else if state, err := games.GameState(ctx, id); err != nil {
t.Fatal(err) t.Fatal(err)
} else if state.ID == id {
t.Fatal("getting state for reset game didnt return state for new game")
} else if state.Started { } else if state.Started {
t.Fatal("reset game is started", state.Started) t.Fatal("reset game is started", state.Started)
} else if !state.Completed.IsZero() { } else if !state.Completed.IsZero() {

View File

@ -116,8 +116,8 @@ func (ugs *UserGameServer) listen(ctx context.Context, reader func(context.Conte
if gameState, err := ugs.games.GameState(ctx, ugs.ID); err != nil { if gameState, err := ugs.games.GameState(ctx, ugs.ID); err != nil {
return err return err
} else if gameState.Completed.IsZero() { } else if gameState.Completed.IsZero() {
} else if _, err := ugs.games.Reset(ctx, ugs.ID); err != nil { } else if err := ugs.games.Reset(ctx, ugs.ID); err != nil {
return err // TODO ugs.ID = newid but for everyone return err
} }
} else { } else {
return fmt.Errorf("UNKNOWN: %+v", m) return fmt.Errorf("UNKNOWN: %+v", m)
@ -133,6 +133,7 @@ func (ugs *UserGameServer) State(ctx context.Context) (UserGameState, error) {
if err != nil { if err != nil {
return UserGameState{}, err return UserGameState{}, err
} }
ugs.ID = gameState.ID
if complete := !gameState.Completed.IsZero(); complete { if complete := !gameState.Completed.IsZero(); complete {
return UserGameState(gameState), nil return UserGameState(gameState), nil