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