diff options
| author | Kurt Himebauch <136133082+xXJSONDeruloXx@users.noreply.github.com> | 2026-09-11 10:51:55 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-09-11 10:51:55 -0400 |
| commit | bc73d150230f92d614962f7384a7430cf64dcd14 (patch) | |
| tree | b6ec78ab8663c3da2e0745db8fb98bbb7303e6e2 /src/utils/nowPlaying.ts | |
| parent | 904e2e6131071c3b132d3148947b613c2830b1bb (diff) | |
| parent | 6597df7865b4eb5fce574d5efda1e33680df4357 (diff) | |
| download | decky-lsfg-vk-bc73d150230f92d614962f7384a7430cf64dcd14.tar.gz decky-lsfg-vk-bc73d150230f92d614962f7384a7430cf64dcd14.zip | |
Merge pull request #263 from xXJSONDeruloXx/v2-now-playing
flatpak correctness, ui alignment, tests
Diffstat (limited to 'src/utils/nowPlaying.ts')
| -rw-r--r-- | src/utils/nowPlaying.ts | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/utils/nowPlaying.ts b/src/utils/nowPlaying.ts new file mode 100644 index 0000000..2e0a876 --- /dev/null +++ b/src/utils/nowPlaying.ts @@ -0,0 +1,63 @@ +import type { FlatpakApp, RunningFlatpakApp } from "../api/lsfgApi"; +import type { GameTarget } from "../hooks/useGameConfiguration"; + +export type NowPlayingTarget = + | { + kind: "flatpak"; + app: FlatpakApp; + launcher: GameTarget | null; + } + | { + kind: "steam"; + game: GameTarget; + }; + +function numericValue(value: number | null | undefined): number { + return typeof value === "number" && Number.isFinite(value) ? value : -1; +} + +function numericPid(value: string | undefined): number { + return value && /^\d+$/.test(value) ? Number(value) : -1; +} + +export function selectMostRecentRunningFlatpak( + apps: FlatpakApp[], + runningApps: RunningFlatpakApp[], +): FlatpakApp | null { + const candidates = runningApps + .map((running) => ({ + running, + app: apps.find((app) => app.app_id === running.app_id) || null, + })) + .filter((candidate): candidate is { running: RunningFlatpakApp; app: FlatpakApp } => candidate.app !== null); + const activeCandidates = candidates.filter(({ running }) => running.active); + const eligibleCandidates = activeCandidates.length > 0 + ? activeCandidates + : candidates.length === 1 + ? candidates + : []; + + eligibleCandidates.sort((a, b) => { + const startDifference = numericValue(b.running.start_time) - numericValue(a.running.start_time); + if (startDifference !== 0) return startDifference; + const pidDifference = numericPid(b.running.pid) - numericPid(a.running.pid); + if (pidDifference !== 0) return pidDifference; + return a.running.app_id.localeCompare(b.running.app_id); + }); + + return eligibleCandidates[0]?.app || null; +} + +export function resolveNowPlayingTarget( + runningGame: GameTarget | null, + runningFlatpak: FlatpakApp | null, +): NowPlayingTarget | null { + if (runningGame && !runningGame.nonSteam) { + return runningGame.configured ? { kind: "steam", game: runningGame } : null; + } + if (runningFlatpak) { + return { kind: "flatpak", app: runningFlatpak, launcher: runningGame?.nonSteam ? runningGame : null }; + } + if (runningGame?.configured) return { kind: "steam", game: runningGame }; + return null; +} |
