diff --git a/cmd/server/games.go b/cmd/server/games.go index 1135143..07783c3 100644 --- a/cmd/server/games.go +++ b/cmd/server/games.go @@ -666,3 +666,25 @@ func (games Games) createEvent(ctx context.Context, id string, v any) error { ) VALUES (?, ?, ?) `, 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 +} diff --git a/cmd/server/games_test.go b/cmd/server/games_test.go index 971c945..2ec69a3 100644 --- a/cmd/server/games_test.go +++ b/cmd/server/games_test.go @@ -149,6 +149,26 @@ func TestGames(t *testing.T) { } else if state.Completed.IsZero() { t.Fatal("state.Completed is zero") } + + if id, 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.Started { + t.Fatal("reset game is started", state.Started) + } else if !state.Completed.IsZero() { + t.Fatal("reset game is complete", state.Completed) + } else if len(state.Players) != 4 { + t.Fatal("reset game doesnt have all players", len(state.Players)) + } else if p := state.Players["p1"]; !p.Empty() { + t.Fatal("reset game missing p1", p) + } else if p := state.Players["p2"]; !p.Empty() { + t.Fatal("reset game missing p2", p) + } else if p := state.Players["p3"]; !p.Empty() { + t.Fatal("reset game missing p3", p) + } else if p := state.Players["p4"]; !p.Empty() { + t.Fatal("reset game missing p4", p) + } }) } diff --git a/cmd/server/usergameserver.go b/cmd/server/usergameserver.go index 103ea0b..3378564 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 { - return fmt.Errorf("not impl: new game: %+v", m) + } else if _, err := ugs.games.Reset(ctx, ugs.ID); err != nil { + return err // TODO ugs.ID = newid but for everyone } } else { return fmt.Errorf("UNKNOWN: %+v", m)