1.9 KiB
1.9 KiB
Game Activity
Status: Active Last updated: 2026-07-05
Overview
"Now playing" game detection: Electron foreground-window/process heuristics, RAWG metadata match via signaling server, and P2P game-activity broadcast to peers. Shown on profile cards and room sidebars.
Responsibilities
| Layer | Owns |
|---|---|
game-activity domain |
Scan loop, confidence scoring, P2P broadcast, user store updates |
| Electron IPC | get-running-process-names, get-active-game-candidate |
| Signaling server | POST /api/games/match (RAWG proxy + miss cache) |
| P2P | game-activity data-channel event |
Server API
POST /api/games/match
- Auth: Public
- Body:
{ processNames: string[], candidates?: { processName, score }[] }(bounded list sizes) - Response:
{ game: MatchedGame | null }— RAWG-backed title, cover art, store links
Misses cached in server SQLite (GameMatchMiss) to limit API calls.
Client detection
- Periodic scan (default 10 s, configurable 5–60 s in localStorage
metoyou_game_scan_interval_ms). - Ignores launcher/helper processes via
IGNORED_PROCESS_NAMESand regex patterns. - Electron: suppresses scan when MetoYou window is focused; prefers foreground-window candidate from
get-active-game-candidate. - Browser/Capacitor: no process scan — activity only from P2P peers.
P2P event
{ "type": "game-activity", "activity": { "game", "startedAt", "processName", ... } }
Peers merge into User.gameActivity in NgRx store.
Related
- signaling.md — not WS-relayed
- server-directory.md — API base URL for match endpoint
- Domain README:
toju-app/src/app/domains/game-activity/README.md
Changelog
| Date | Change |
|---|---|
| 2026-07-05 | Initial cross-context game-activity contract |