Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ import { initDiscordRpc } from "./native/discordRpc";
import { initTray } from "./native/tray";
import { BUILD_URL, createMainWindow, mainWindow } from "./native/window";

// Added by ICEBADGERR 02/10/2026
import { detectRunningGame } from "./native/gameDetection";

// Squirrel-specific logic
// create/remove shortcuts on Windows when installing / uninstalling
// we just need to close out of the app immediately
Expand All @@ -28,6 +31,9 @@ if (acquiredLock) {
// start auto update logic
updateElectronApp();

//Variable to check the current game process that is running
let currentGame: string | null = null;

// create and configure the app when electron is ready
app.on("ready", () => {
// enable auto start on Windows and MacOS
Expand All @@ -42,6 +48,21 @@ if (acquiredLock) {
initTray();
initDiscordRpc();

//Detect game that is being played code
setInterval(async () => {
const game = await detectRunningGame();

//Only log if it is changed
if (game !== currentGame) {
currentGame = game;
if (game) {
console.log('Now Playing:', game);
} else{
console.log('Stopped Playing');
}
}
}, 5000); //Checks every 5 seconds

// Windows specific fix for notifications
if (process.platform === "win32") {
app.setAppUserModelId("chat.stoat.notifications");
Expand Down
31 changes: 31 additions & 0 deletions src/native/gameDetection.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { exec } from 'child_process';
import { promisify } from 'util';

const execAsync = promisify(exec)

//Simple detect list
const KNOWN_GAMES: Record<string, string> = {
'steam.exe': 'Steam',
'discord.exe': 'Discord',
'code': 'VS Code (replace with actual game later)'
// Add more later
};

export async function detectRunningGame(): Promise<string | null> {
try{
//For linux
const { stdout } = await execAsync('ps aux');
const lowerOutput = stdout.toLowerCase();

for (const [processName, gameName] of Object.entries(KNOWN_GAMES)) {
if (lowerOutput.includes(processName.toLowerCase())) {
return gameName;
}
}

return null;
} catch (error) {
console.error('Error deteching game:', error);
return null;
}
}
Loading