haitop/src/updater/main.ts

113 lines
3.5 KiB
TypeScript
Raw Normal View History

2023-04-10 22:53:44 +02:00
/*
* SPDX-License-Identifier: GPL-3.0
2023-07-13 19:03:13 +02:00
* Vesktop, a desktop app aiming to give you a snappier Discord Experience
2023-04-10 22:53:44 +02:00
* Copyright (c) 2023 Vendicated and Vencord contributors
*/
import { app, BrowserWindow, ipcMain, shell } from "electron";
import { Settings } from "main/settings";
import { makeLinksOpenExternally } from "main/utils/makeLinksOpenExternally";
2023-04-10 22:53:44 +02:00
import { githubGet, ReleaseData } from "main/utils/vencordLoader";
import { join } from "path";
import { IpcEvents } from "shared/IpcEvents";
2023-06-23 17:20:54 +02:00
import { VIEW_DIR } from "shared/paths";
2023-04-10 22:53:44 +02:00
export interface UpdateData {
currentVersion: string;
latestVersion: string;
release: ReleaseData;
}
let updateData: UpdateData;
ipcMain.handle(IpcEvents.UPDATER_GET_DATA, () => updateData);
ipcMain.handle(IpcEvents.UPDATER_DOWNLOAD, () => {
2023-06-21 14:46:40 +02:00
const portable = !!process.env.PORTABLE_EXECUTABLE_FILE;
2023-04-10 22:53:44 +02:00
const { assets } = updateData.release;
const url = (() => {
switch (process.platform) {
case "win32":
2023-06-21 14:46:40 +02:00
return assets.find(a => {
if (!a.name.endsWith(".exe")) return false;
const isSetup = a.name.includes("Setup");
return portable ? !isSetup : isSetup;
})!.browser_download_url;
2023-04-10 22:53:44 +02:00
case "darwin":
return assets.find(a => a.name.endsWith(".dmg"))!.browser_download_url;
case "linux":
return updateData.release.html_url;
default:
throw new Error(`Unsupported platform: ${process.platform}`);
}
})();
shell.openExternal(url);
});
ipcMain.handle(IpcEvents.UPDATE_IGNORE, () => {
Settings.store.skippedUpdate = updateData.latestVersion;
});
function isOutdated(oldVersion: string, newVersion: string) {
const oldParts = oldVersion.split(".");
const newParts = newVersion.split(".");
if (oldParts.length !== newParts.length)
throw new Error(`Incompatible version strings (old: ${oldVersion}, new: ${newVersion})`);
for (let i = 0; i < oldParts.length; i++) {
const oldPart = Number(oldParts[i]);
const newPart = Number(newParts[i]);
if (isNaN(oldPart) || isNaN(newPart))
throw new Error(`Invalid version string (old: ${oldVersion}, new: ${newVersion})`);
if (oldPart < newPart) return true;
if (oldPart > newPart) return false;
}
return false;
}
export async function checkUpdates() {
// if (IS_DEV) return;
try {
2023-07-13 19:03:13 +02:00
const raw = await githubGet("/repos/Vencord/Vesktop/releases/latest");
2023-04-10 22:53:44 +02:00
const data = JSON.parse(raw.toString("utf-8")) as ReleaseData;
const oldVersion = app.getVersion();
const newVersion = data.tag_name.replace(/^v/, "");
updateData = {
currentVersion: oldVersion,
latestVersion: newVersion,
release: data
};
2023-04-10 22:53:44 +02:00
if (Settings.store.skippedUpdate !== newVersion && isOutdated(oldVersion, newVersion)) {
2023-04-10 22:53:44 +02:00
openNewUpdateWindow();
}
} catch (e) {
console.error("AppUpdater: Failed to check for updates\n", e);
}
}
function openNewUpdateWindow() {
const win = new BrowserWindow({
width: 500,
autoHideMenuBar: true,
alwaysOnTop: true,
2023-04-10 22:53:44 +02:00
webPreferences: {
preload: join(__dirname, "updaterPreload.js"),
nodeIntegration: false,
contextIsolation: true,
sandbox: true
2023-04-10 22:53:44 +02:00
}
});
makeLinksOpenExternally(win);
2023-06-23 17:20:54 +02:00
win.loadFile(join(VIEW_DIR, "updater.html"));
2023-04-10 22:53:44 +02:00
}