492bdb95e3
Receive real-time events from games (CS2, Dota 2, LoL, etc.) and drive LED effects through the existing color strip and value source pipelines. Core: - GameEventBus (thread-safe pub/sub) with standardized 23-type event vocabulary - GameAdapter ABC + AdapterRegistry + MappingAdapter (YAML-driven) - Built-in adapters: CS2 GSI, Dota 2 GSI, LoL Live Client, Generic Webhook - Community YAML adapters: Minecraft, Valorant, Rocket League - GameEventColorStripStream with 5 effects (flash/pulse/sweep/color_shift/breathing) - GameEventValueSource with EMA smoothing and timeout - 4 built-in effect presets (FPS Combat, MOBA Health, Racing, Generic Alert) - Auto-setup for Valve GSI games (Steam path detection, cfg file writing) - Demo capture engine exposed to non-demo mode Frontend: - Game tab in Streams tree navigation with integration cards - Game integration editor modal with adapter picker, config fields, event mappings - game_event source type in CSS and ValueSource editors - Setup instructions overlay (markdown rendered) - Live event monitor and connection test API: - Full CRUD for game integrations - Event ingestion endpoint (adapter-level auth) - Adapter metadata, presets, auto-setup, status/diagnostics endpoints
4.1 KiB
4.1 KiB
Feature Context: Game Integration
Configuration
- Development mode: Automated
- Execution mode: Orchestrator
- Strategy: Big Bang
- Build (frontend):
cd server && npm run build - Test:
cd server && py -3.13 -m pytest tests/ --no-cov -q - Lint:
cd server && ruff check src/ tests/ --fix - TypeScript:
cd server && npx tsc --noEmit
Architecture Decisions
Not a Capture Engine
Game events are discrete data points, not pixel buffers. The integration lives as a separate core/game_integration/ module with two output channels into existing pipelines:
GameEventColorStripSource/Stream— renders LED effects on game eventsGameEventValueSource— exposes game metrics as 0.0-1.0 scalars for parameter binding
Standardized Event Vocabulary
All adapters map game-specific data into universal event categories (health, kill, death, round_start, etc.). Users configure effects against categories, not game-specific IDs. This means a "health < 30% → flash red" config works across CS2, LoL, and any future game.
Three Adapter Tiers
- Built-in — CS2 GSI, LoL Live Client, Dota 2 GSI, generic webhook (ship with app)
- Community YAML — declarative adapter files mapping JSON paths to standard events (no code)
- Generic webhook — fallback with UI-guided JSON path mapping
Event Types
- Continuous (health, armor, mana, ammo) → best for ValueSource (drive brightness/speed/color)
- Trigger (kill, death, round_start, bomb_planted) → best for ColorStripStream (fire effects)
Tech Stack Context
Backend Patterns (from codebase analysis)
- Entity pattern: dataclass model (
storage/) + JSON/SQLite store (storage/*_store.py) + Pydantic schemas (api/schemas/) + routes (api/routes/) - Store base:
BaseSqliteStore[T]with write-through cache, RLock,_check_name_unique() - ID generation:
f"{prefix}_{uuid.uuid4().hex[:8]}" - Events:
fire_entity_event(entity_type, action, entity_id)for UI invalidation - ColorStripSource: inheritance with
_SOURCE_TYPE_MAPregistry,to_dict()/from_dict()/create_from_kwargs()/apply_update() - ColorStripStream:
_SIMPLE_STREAM_MAPincolor_strip_stream_manager.py - ValueSource: similar inheritance with
_VALUE_SOURCE_MAPregistry - NotificationColorStripStream: closest analog — event-driven, deque + lock, 30 FPS render loop, double-buffered output
- Bindable:
BindableFloat/BindableColorfor value source parameter binding - Dependencies:
init_dependencies()independencies.py, FastAPIDepends() - STORE_MAP: in
api/routes/system.pyfor backup/restore
Frontend Patterns
- Vanilla TypeScript modules, no framework
CardSectionfor entity lists with reconciliationModalbase class withsnapshotValues()for dirty checkTreeNavfor sidebar navigation in Streams tabDataCachefor state managementfetchWithAuth()for all API callst('key')for i18n, keys in en.json/ru.json/zh.jsonfire_entity_event→ frontend listens for cache invalidation- Icons from
core/icons.ts(SVG paths), NEVER emoji IconSelectfor predefined item grids,EntitySelectfor entity references
Current State
Feature not yet started. Branch created, plan files written.
Temporary Workarounds
None yet.
Cross-Phase Dependencies
- Phase 2 depends on Phase 1 (EventBus, AdapterRegistry)
- Phase 3 depends on Phase 1 (GameAdapter ABC, MappingAdapter)
- Phase 4 depends on Phase 1 (EventBus) and Phase 2 (GameIntegrationStore for config)
- Phase 5 depends on Phase 1 (EventBus) and Phase 2 (GameIntegrationStore)
- Phase 6 depends on Phase 2 (API endpoints) and Phase 3 (adapter metadata)
- Phase 7 depends on Phase 4 (CSS source type) and Phase 5 (value source type)
- Phase 8 depends on all prior phases
- Phases 4 and 5 are independent — can run in parallel
Deferred Work
None yet.
Failed Approaches
None yet.
Review Findings Log
None yet.
Phase Execution Log
| Phase | Agent Used | Test Writer | Parallel | Notes |
|---|