package lobby import ( "context" "gitea/price-is-wrong/pkg/lib/db" lobby "gitea/price-is-wrong/pkg/state/lobby/internal" "slices" ) func (l *Lobby) Join(ctx context.Context, id int) error { return l.upsertEvent(ctx, &lobby.PlayerJoin{ID: id}) } func (l *Lobby) Leave(ctx context.Context, id int) error { return l.upsertEvent(ctx, &lobby.PlayerLeave{ID: id}) } func (l *Lobby) Close(ctx context.Context) error { return l.upsertEvent(ctx, &lobby.Close{}) } func (l *Lobby) upsertEvent(ctx context.Context, e lobby.Event) error { if err := upsertEvent(ctx, l.id, e); err != nil { return err } l2, err := openID(ctx, l.id) if err != nil { return err } *l = *l2 return nil } func upsertEvent(ctx context.Context, lobbyID int, e lobby.Event) error { b, err := lobby.MarshalEvent(e) if err != nil { return err } _, err = db.From(ctx).ExecContext(ctx, ` INSERT INTO lobby_events (lobby_id, payload) VALUES (?, ?) `, lobbyID, b) return err } func (l *Lobby) apply(e lobby.Event) error { switch e := e.(type) { case *lobby.PlayerJoin: if !slices.Contains(l.Players, e.ID) { l.Players = append(l.Players, e.ID) } case *lobby.PlayerLeave: l.Players = slices.DeleteFunc(l.Players, func(id int) bool { return id == e.ID }) } return nil }