GameReset event
parent
54116131b3
commit
bf3b341b69
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue