import { gameRepository } from "@main/repository"; import { generateYML } from "../helpers/generate-lutris-yaml"; import path from "node:path"; import fs from "node:fs"; import { writeFile } from "node:fs/promises"; import { spawnSync, exec } from "node:child_process"; import { registerEvent } from "../register-event"; import { shell } from "electron"; import { getDownloadsPath } from "../helpers/get-downloads-path"; const openGameInstaller = async ( _event: Electron.IpcMainInvokeEvent, gameId: number ) => { const game = await gameRepository.findOne({ where: { id: gameId } }); if (!game) return true; const gamePath = path.join( game.downloadPath ?? (await getDownloadsPath()), game.folderName ); if (!fs.existsSync(gamePath)) { await gameRepository.delete({ id: gameId }); return true; } const setupPath = path.join(gamePath, "setup.exe"); if (!fs.existsSync(setupPath)) { shell.openPath(gamePath); return true; } if (process.platform === "win32") { shell.openPath(setupPath); return true; } if (spawnSync("which", ["lutris"]).status === 0) { const ymlPath = path.join(gamePath, "setup.yml"); await writeFile(ymlPath, generateYML(game)); exec(`lutris --install "${ymlPath}"`); return true; } if (spawnSync("which", ["wine"]).status === 0) { exec(`wine "${setupPath}"`); return true; } return false; }; registerEvent(openGameInstaller, { name: "openGameInstaller", });