Add cross-platform process scanning that detects running games and apps, then broadcasts them as Rich Presence activities via the existing Phase 1 pipeline (activityStore -> WS -> other users). - games.json dictionary with 26 entries (games, Spotify, VLC, OBS) - activityDetector module: polls OS process list every 15s via execFile, matches against dictionary, emits IPC on state change only - IPC bridge in main.ts/preload.ts with cleanup on quit - Frontend activityBridge subscribes to IPC and feeds activityStore - Supports Windows (tasklist CSV), macOS (ps -c), Linux (ps)
31 lines
993 B
TypeScript
31 lines
993 B
TypeScript
import type { Activity } from '@backspace/shared';
|
|
import { useActivityStore } from '../stores/activityStore';
|
|
|
|
let unsubscribe: (() => void) | null = null;
|
|
|
|
export function initActivityBridge(): void {
|
|
if (unsubscribe) return; // already initialized
|
|
if (!window.backspace?.onActivityDetected) return; // not Electron
|
|
|
|
// Subscribe to future activity changes from main process
|
|
unsubscribe = window.backspace.onActivityDetected((activity) => {
|
|
if (activity) {
|
|
useActivityStore.getState().pushActivities([activity as Activity]);
|
|
} else {
|
|
useActivityStore.getState().pushActivities([]);
|
|
}
|
|
});
|
|
|
|
// Request current state (handles instance-switch: game was already running)
|
|
window.backspace.getCurrentActivity?.().then((activity: unknown) => {
|
|
if (activity) {
|
|
useActivityStore.getState().pushActivities([activity as Activity]);
|
|
}
|
|
}).catch(() => {});
|
|
}
|
|
|
|
export function teardownActivityBridge(): void {
|
|
unsubscribe?.();
|
|
unsubscribe = null;
|
|
}
|