From cc543076c750c6563a9823c09cb9543b346bf8d9 Mon Sep 17 00:00:00 2001 From: GabiZar Date: Sat, 28 Mar 2026 13:18:09 +0100 Subject: [PATCH] Add Linux support, currently broken for Steam --- assets/icon.png | Bin 0 -> 21113 bytes forge.config.cjs | 30 ++++- main.js | 58 ++++++-- package-lock.json | 330 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 4 +- 5 files changed, 409 insertions(+), 13 deletions(-) create mode 100644 assets/icon.png diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0248e91b33eb7458cdf79a9934f43f57ff0f0a36 GIT binary patch literal 21113 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 By#xRN literal 0 HcmV?d00001 diff --git a/forge.config.cjs b/forge.config.cjs index fb9ba24..f7308c2 100644 --- a/forge.config.cjs +++ b/forge.config.cjs @@ -2,6 +2,7 @@ const { FusesPlugin } = require("@electron-forge/plugin-fuses"); const { FuseV1Options, FuseVersion } = require("@electron/fuses"); const fs = require("fs/promises"); const path = require("path"); +const packageJson = require("./package.json"); const buildTarget = process.env.BUILD_TARGET || "all"; @@ -20,10 +21,34 @@ if (buildTarget == "msi" || buildTarget == "all") { if (buildTarget == "zip" || buildTarget == "all") { makers.push({ name: "@electron-forge/maker-zip", - platforms: ["win32"], + platforms: ["win32", "linux"], }); } +if (buildTarget == "deb" || buildTarget == "all") { + makers.push({ + name: "@electron-forge/maker-deb", + config: { + options: { + bin: packageJson.productName, + name: packageJson.productName, + icon: "./assets/icon.png", + maintainer: "GabiZar", + homepage: "https://github.com/Gabi-Zar/Silk-Fly-Launcher", + }, + }, + }); +} + +async function fileExists(filePath) { + try { + await fs.access(filePath); + return true; + } catch { + return false; + } +} + module.exports = { packagerConfig: { asar: true, @@ -67,6 +92,9 @@ module.exports = { postMake: async (forgeConfig, makeResults) => { if (buildTarget == "msi" || buildTarget == "all") { const outDir = path.join(__dirname, "out", "make", "wix", "x64"); + if (!(await fileExists(outDir))) { + return; + } const files = await fs.readdir(outDir, { recursive: true }); const msiFile = path.join( outDir, diff --git a/main.js b/main.js index 47a9b68..5ec0647 100644 --- a/main.js +++ b/main.js @@ -13,7 +13,7 @@ const { extractFull } = node7z; import packageJson from "./package.json" with { type: "json" }; import semverGt from "semver/functions/gt.js"; import { randomUUID } from "crypto"; -import { unzip } from "zlib"; +import { spawn } from "child_process"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -42,7 +42,7 @@ let onlineTotalModsCount; let thunderstoreCachedModList; let thunderstoreTotalModsCount; -const bepinexFiles = [".doorstop_version", "changelog.txt", "doorstop_config.ini", "winhttp.dll"]; +const bepinexFiles = [".doorstop_version", "changelog.txt", "doorstop_config.ini", "winhttp.dll", "libdoorstop.so", "run_bepinex.sh"]; let bepinexVersion = bepinexStore.get("bepinex-version"); let bepinexBackupVersion; @@ -90,12 +90,12 @@ async function createWindow() { }); } -app.whenReady().then(() => { +app.whenReady().then(async () => { if (isDev) { app.setAsDefaultProtocolClient("nxm", process.execPath, [path.resolve(process.argv[1])]); } else { app.setAsDefaultProtocolClient("nxm"); - sevenZipPath = path7za.replace("\\app.asar\\node_modules", ""); + sevenZipPath = path7za.replace(path.join("app.asar", "node_modules"), ""); Menu.setApplicationMenu(null); } @@ -105,7 +105,10 @@ app.whenReady().then(() => { createWindow(); } - app.on("activate", () => { + app.on("activate", async () => { + if (process.platform === "linux") { + await fs.chmod(sevenZipPath, 0o755); + } if (BrowserWindow.getAllWindows().length === 0) { createWindow(); } @@ -378,7 +381,12 @@ async function installBepinex() { const release = await res.json(); - const asset = release.assets.find((a) => a.name.endsWith(".zip") && a.name.toLowerCase().includes("win_x64")); + let asset; + if (process.platform === "win32") { + asset = release.assets.find((a) => a.name.endsWith(".zip") && a.name.toLowerCase().includes("win_x64")); + } else if (process.platform === "linux") { + asset = release.assets.find((a) => a.name.endsWith(".zip") && a.name.toLowerCase().includes("linux_x64")); + } await downloadAndUnzip(asset.browser_download_url, silksongPath); @@ -945,7 +953,15 @@ ipcMain.handle("open-window", async (event, file) => { }); ipcMain.handle("launch-game", async (event, mode) => { - const silksongExecutablePath = path.join(loadSilksongPath(), "Hollow Knight Silksong.exe"); + let silksongExecutable; + if (process.platform === "win32") { + silksongExecutable = "Hollow Knight Silksong.exe"; + } else if (process.platform === "linux") { + silksongExecutable = "Hollow Knight Silksong"; + } + + const silksongExecutablePath = path.join(loadSilksongPath(), silksongExecutable); + const silksongScriptPath = path.join(loadSilksongPath(), "run_bepinex.sh"); const bepinexFolderPath = path.join(loadSilksongPath(), "BepInEx"); if (!fileExists(silksongExecutablePath)) { mainWindow.webContents.send("showToast", "Path to the game invalid", "warning"); @@ -954,22 +970,42 @@ ipcMain.handle("launch-game", async (event, mode) => { if (mode === "modded") { if (await fileExists(bepinexFolderPath)) { - await shell.openExternal(silksongExecutablePath); + if (process.platform === "win32") { + executeGame(silksongExecutablePath); + } + if (process.platform === "linux") { + executeGame(silksongScriptPath, [silksongExecutable]); + } } else { await installBepinex(); - await shell.openExternal(silksongExecutablePath); + if (process.platform === "win32") { + executeGame(silksongExecutablePath); + } + if (process.platform === "linux") { + executeGame(silksongScriptPath, [silksongExecutable]); + } } } if (mode === "vanilla") { if (await fileExists(bepinexFolderPath)) { await backupBepinex(); - await shell.openExternal(silksongExecutablePath); + executeGame(silksongExecutablePath); } else { - await shell.openExternal(silksongExecutablePath); + executeGame(silksongExecutablePath); } } }); +async function executeGame(path, args = []) { + await fs.chmod(path, 0o755); + const game = spawn(path, args, { + cwd: loadSilksongPath(), + detached: true, + stdio: "ignore", + }); + game.unref(); +} + async function downloadAndUnzip(url, toPath) { url = new URL(url); const fileName = url.pathname.split("/").pop(); diff --git a/package-lock.json b/package-lock.json index 0e72d76..f025766 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ }, "devDependencies": { "@electron-forge/cli": "^7.11.1", + "@electron-forge/maker-deb": "^7.11.1", "@electron-forge/maker-wix": "^7.11.1", "@electron-forge/maker-zip": "^7.11.1", "@electron-forge/plugin-auto-unpack-natives": "^7.11.1", @@ -170,6 +171,23 @@ "node": ">= 16.4.0" } }, + "node_modules/@electron-forge/maker-deb": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-7.11.1.tgz", + "integrity": "sha512-QTYiryQLYPDkq6pIfBmx0GQ6D8QatUkowH7rTlW5MnCUa0uumX0Xu7yGIjesuwW37fxT3Lv4xi+FSXMCm2eC1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/maker-base": "7.11.1", + "@electron-forge/shared-types": "7.11.1" + }, + "engines": { + "node": ">= 16.4.0" + }, + "optionalDependencies": { + "electron-installer-debian": "^3.2.0" + } + }, "node_modules/@electron-forge/maker-wix": { "version": "7.11.1", "resolved": "https://registry.npmjs.org/@electron-forge/maker-wix/-/maker-wix-7.11.1.tgz", @@ -1317,6 +1335,17 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/http-cache-semantics": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", @@ -2795,6 +2824,242 @@ "node": ">= 12.20.55" } }, + "node_modules/electron-installer-common": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/electron-installer-common/-/electron-installer-common-0.10.4.tgz", + "integrity": "sha512-8gMNPXfAqUE5CfXg8RL0vXpLE9HAaPkgLXVoHE3BMUzogMWenf4LmwQ27BdCUrEhkjrKl+igs2IHJibclR3z3Q==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@electron/asar": "^3.2.5", + "@malept/cross-spawn-promise": "^1.0.0", + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "glob": "^7.1.4", + "lodash": "^4.17.15", + "parse-author": "^2.0.0", + "semver": "^7.1.1", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "url": "https://github.com/electron-userland/electron-installer-common?sponsor=1" + }, + "optionalDependencies": { + "@types/fs-extra": "^9.0.1" + } + }, + "node_modules/electron-installer-common/node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/electron-installer-common/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-installer-debian": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/electron-installer-debian/-/electron-installer-debian-3.2.0.tgz", + "integrity": "sha512-58ZrlJ1HQY80VucsEIG9tQ//HrTlG6sfofA3nRGr6TmkX661uJyu4cMPPh6kXW+aHdq/7+q25KyQhDrXvRL7jw==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin", + "linux" + ], + "dependencies": { + "@malept/cross-spawn-promise": "^1.0.0", + "debug": "^4.1.1", + "electron-installer-common": "^0.10.2", + "fs-extra": "^9.0.0", + "get-folder-size": "^2.0.1", + "lodash": "^4.17.4", + "word-wrap": "^1.2.3", + "yargs": "^16.0.2" + }, + "bin": { + "electron-installer-debian": "src/cli.js" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-installer-debian/node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/electron-installer-debian/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/electron-installer-debian/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/electron-installer-debian/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-installer-debian/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-installer-debian/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-installer-debian/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/electron-installer-debian/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-installer-debian/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "optional": true, + "engines": { + "node": ">=10" + } + }, "node_modules/electron-store": { "version": "11.0.2", "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-11.0.2.tgz", @@ -3538,6 +3803,15 @@ "node": ">= 12" } }, + "node_modules/gar": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz", + "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -3548,6 +3822,21 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-folder-size": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz", + "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "gar": "^1.0.4", + "tiny-each-async": "2.0.3" + }, + "bin": { + "get-folder-size": "bin/get-folder-size" + } + }, "node_modules/get-package-info": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz", @@ -6779,6 +7068,14 @@ "dev": true, "license": "MIT" }, + "node_modules/tiny-each-async": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz", + "integrity": "sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -6792,6 +7089,28 @@ "node": ">=0.6.0" } }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/tmp-promise/node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14.14" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -7173,6 +7492,17 @@ "node": ">= 8" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", diff --git a/package.json b/package.json index 136024f..2895d5f 100644 --- a/package.json +++ b/package.json @@ -10,12 +10,14 @@ "package": "electron-forge package", "make": "electron-forge make", "make:msi": "cross-env BUILD_TARGET=msi electron-forge make", - "make:zip": "cross-env BUILD_TARGET=zip electron-forge make" + "make:zip": "cross-env BUILD_TARGET=zip electron-forge make", + "make:deb": "cross-env BUILD_TARGET=deb electron-forge make" }, "author": "GabiZar", "license": "GPL-3.0", "devDependencies": { "@electron-forge/cli": "^7.11.1", + "@electron-forge/maker-deb": "^7.11.1", "@electron-forge/maker-wix": "^7.11.1", "@electron-forge/maker-zip": "^7.11.1", "@electron-forge/plugin-auto-unpack-natives": "^7.11.1",