Add GitHub update check

This commit is contained in:
2026-03-10 21:40:39 +01:00
parent c93e930286
commit eb923a0c57
7 changed files with 97 additions and 4 deletions

49
main.js
View File

@@ -11,6 +11,7 @@ import { path7za } from "7zip-bin";
import node7z from "node-7z"; import node7z from "node-7z";
const { extractFull } = node7z; const { extractFull } = node7z;
import packageJson from "./package.json" with { type: "json" }; import packageJson from "./package.json" with { type: "json" };
import semverGt from "semver/functions/gt.js";
const __filename = fileURLToPath(import.meta.url); const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename); const __dirname = path.dirname(__filename);
@@ -79,6 +80,9 @@ async function createWindow() {
mainWindow.once("ready-to-show", () => { mainWindow.once("ready-to-show", () => {
mainWindow.show(); mainWindow.show();
if (!isDev) {
verifyUpdate();
}
}); });
} }
@@ -115,6 +119,51 @@ app.on("open-url", (event, url) => {
handleNxmUrl(url); handleNxmUrl(url);
}); });
async function verifyUpdate() {
const GITHUB_URL = "https://api.github.com/repos/Gabi-Zar/Silk-Fly-Launcher/releases";
const res = await fetch(GITHUB_URL, {
headers: {
"User-Agent": userAgent,
Accept: "application/vnd.github+json",
},
});
if (!res.ok) {
if (res.status == 403) {
mainWindow.webContents.send("showToast", "Github has blocked the application. Please try again later.", "error");
}
throw new Error(`GitHub API error: ${res.status}`);
}
const releases = await res.json();
const prerelease = releases.find((r) => r.prerelease);
const release = releases.find((r) => !r.prerelease && !r.draft);
let prereleaseVersion;
let releaseVersion;
let latestVersion;
if (prerelease) {
prereleaseVersion = prerelease.tag_name.replace(/^v/, "");
latestVersion = prereleaseVersion;
}
if (release) {
releaseVersion = release.tag_name.replace(/^v/, "");
latestVersion = releaseVersion;
}
if (prereleaseVersion && releaseVersion) {
latestVersion = semverGt(prereleaseVersion, releaseVersion) ? prereleaseVersion : releaseVersion;
}
if (latestVersion != VERSION) {
mainWindow.webContents.send(
"showBanner",
`Update v${latestVersion} is available on <a href="" class="link" onclick="electronAPI.openExternalLink('https://github.com/Gabi-Zar/Silk-Fly-Launcher/releases/tag/v${latestVersion}')">GitHub</a>! Your current version is ${VERSION}.`,
);
}
}
////////////////////////////////////////////////////// //////////////////////////////////////////////////////
///////////////// SAVING AND LOADING ///////////////// ///////////////// SAVING AND LOADING /////////////////
ipcMain.handle("save-path", (event, path) => { ipcMain.handle("save-path", (event, path) => {

7
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "silkflylauncher", "name": "silkflylauncher",
"version": "1.0.0", "version": "1.0.0-dev",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "silkflylauncher", "name": "silkflylauncher",
"version": "1.0.0", "version": "1.0.0-dev",
"license": "GPL-3.0", "license": "GPL-3.0",
"dependencies": { "dependencies": {
"@nexusmods/nexus-api": "^1.1.5", "@nexusmods/nexus-api": "^1.1.5",
@@ -14,7 +14,8 @@
"electron-store": "^11.0.2", "electron-store": "^11.0.2",
"graphql": "^16.12.0", "graphql": "^16.12.0",
"graphql-request": "^7.4.0", "graphql-request": "^7.4.0",
"node-7z": "^3.0.0" "node-7z": "^3.0.0",
"semver": "^7.7.4"
}, },
"devDependencies": { "devDependencies": {
"@electron-forge/cli": "^7.11.1", "@electron-forge/cli": "^7.11.1",

View File

@@ -30,7 +30,8 @@
"electron-store": "^11.0.2", "electron-store": "^11.0.2",
"graphql": "^16.12.0", "graphql": "^16.12.0",
"graphql-request": "^7.4.0", "graphql-request": "^7.4.0",
"node-7z": "^3.0.0" "node-7z": "^3.0.0",
"semver": "^7.7.4"
}, },
"AES-key-nexus-api": "__AES_KEY__" "AES-key-nexus-api": "__AES_KEY__"
} }

View File

@@ -34,6 +34,11 @@ contextBridge.exposeInMainWorld("electronAPI", {
callback(message, type, duration); callback(message, type, duration);
}); });
}, },
onShowBanner: (callback) => {
ipcRenderer.on("showBanner", (event, message) => {
callback(message);
});
},
}); });
contextBridge.exposeInMainWorld("bepinex", { contextBridge.exposeInMainWorld("bepinex", {

View File

@@ -58,6 +58,10 @@
<!-- Main content --> <!-- Main content -->
<main class="content"> <main class="content">
<div class="banner-div" id="banner-div">
<p id="banner-text"></p>
<button class="default-button square-button" onclick="hideBanner()">X</button>
</div>
<h1 id="title">Silk Fly Launcher</h1> <h1 id="title">Silk Fly Launcher</h1>
<div class="view" id="view"></div> <div class="view" id="view"></div>
<div class="toast-div" id="toast-div"></div> <div class="toast-div" id="toast-div"></div>

View File

@@ -739,6 +739,23 @@ function showToast(message, type = "info", duration = 3000) {
electronAPI.onShowToast(showToast); electronAPI.onShowToast(showToast);
function showBanner(message) {
const bannerDiv = document.getElementById("banner-div");
const bannerText = document.getElementById("banner-text");
console.log(bannerDiv);
bannerText.innerHTML = message;
bannerDiv.classList.add("show");
}
electronAPI.onShowBanner(showBanner);
function hideBanner() {
const bannerDiv = document.getElementById("banner-div");
bannerDiv.classList.remove("show");
}
function changeModsPage(offsetChange) { function changeModsPage(offsetChange) {
if (oldPage == "mods-installed") { if (oldPage == "mods-installed") {
if (offsetChange == "min") { if (offsetChange == "min") {

View File

@@ -447,3 +447,19 @@ body {
.long-text { .long-text {
overflow-wrap: anywhere; overflow-wrap: anywhere;
} }
.banner-div {
display: none;
align-items: center;
justify-content: space-between;
border: 1px solid var(--secondary-color);
background: var(--primary-color);
margin-bottom: 20px;
height: 64px;
border-radius: 12px;
padding: 10px;
}
.banner-div.show {
display: flex;
}