diff --git a/cmd/server/games.go b/cmd/server/games.go index 5c371ac..0e202a1 100644 --- a/cmd/server/games.go +++ b/cmd/server/games.go @@ -169,6 +169,7 @@ func (games Games) GameByName(ctx context.Context, name string) (string, error) type ( GameState struct { + ID string Started bool Completed time.Time Players map[string]PlayerState @@ -231,6 +232,7 @@ type ( EventGameReset struct { Type EventType Timestamp time.Time + ID string } 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) { - result := GameState{Players: map[string]PlayerState{}} + result := GameState{ID: id, Players: map[string]PlayerState{}} events, err := games.GameEvents(ctx, id, time.Time{}) if err != nil { @@ -368,7 +370,7 @@ func (games Games) GameState(ctx context.Context, id string) (GameState, error) result.Players[k] = player } case EventGameReset: - return GameState{}, fmt.Errorf("not impl") + return games.GameState(ctx, e.ID) default: 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) } -func (games Games) CreateEventGameReset(ctx context.Context, id string, killer, victim, word string, points int) error { - return fmt.Errorf("not impl") +func (games Games) CreateEventGameReset(ctx context.Context, gid string) error { + 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 { @@ -683,24 +707,6 @@ func (games Games) createEvent(ctx context.Context, id string, v any) error { `, 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) (string, error) { - 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 +func (games *Games) Reset(ctx context.Context, gid string) error { + return games.CreateEventGameReset(ctx, gid) } diff --git a/cmd/server/games_test.go b/cmd/server/games_test.go index 2ec69a3..091520a 100644 --- a/cmd/server/games_test.go +++ b/cmd/server/games_test.go @@ -150,10 +150,12 @@ func TestGames(t *testing.T) { 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) } else if state, err := games.GameState(ctx, id); err != nil { 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 { t.Fatal("reset game is started", state.Started) } else if !state.Completed.IsZero() { diff --git a/cmd/server/usergameserver.go b/cmd/server/usergameserver.go index 3378564..470cc6b 100644 --- a/cmd/server/usergameserver.go +++ b/cmd/server/usergameserver.go @@ -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 { return err } else if gameState.Completed.IsZero() { - } else if _, err := ugs.games.Reset(ctx, ugs.ID); err != nil { - return err // TODO ugs.ID = newid but for everyone + } else if err := ugs.games.Reset(ctx, ugs.ID); err != nil { + return err } } else { return fmt.Errorf("UNKNOWN: %+v", m) @@ -133,6 +133,7 @@ func (ugs *UserGameServer) State(ctx context.Context) (UserGameState, error) { if err != nil { return UserGameState{}, err } + ugs.ID = gameState.ID if complete := !gameState.Completed.IsZero(); complete { return UserGameState(gameState), nil