diff --git a/src/main/utils/vencordLoader.ts b/src/main/utils/vencordLoader.ts new file mode 100644 index 0000000..43af374 --- /dev/null +++ b/src/main/utils/vencordLoader.ts @@ -0,0 +1,68 @@ +/* + * SPDX-License-Identifier: GPL-3.0 + * Aerocord, a vesktop fork for older microsoft NT releases such as NT 6.0, 6.1, 6.2 and 6.3. + * Credits to vendicated and the rest of the vesktop contribuitors for making Vesktop! + */ + +import { existsSync, mkdirSync } from "fs"; +import { join } from "path"; + +import { USER_AGENT, VENCORD_FILES_DIR } from "../constants"; +import { downloadFile, fetchie } from "./http"; + +const API_BASE = "https://api.github.com"; + +export const FILES_TO_DOWNLOAD = [ + "vencordDesktopMain.js", + "vencordDesktopPreload.js", + "vencordDesktopRenderer.js", + "vencordDesktopRenderer.css" +]; + +export interface ReleaseData { + name: string; + tag_name: string; + html_url: string; + assets: Array<{ + name: string; + browser_download_url: string; + }>; +} + +export async function githubGet(endpoint: string) { + const opts: RequestInit = { + headers: { + Accept: "application/vnd.github+json", + "User-Agent": USER_AGENT + } + }; + + if (process.env.GITHUB_TOKEN) (opts.headers! as any).Authorization = `Bearer ${process.env.GITHUB_TOKEN}`; + + return fetchie(API_BASE + endpoint, opts, { retryOnNetworkError: true }); +} + +export async function downloadVencordFiles() { + const release = await githubGet("/repos/Vendicated/Vencord/releases/latest"); + + const { assets }: ReleaseData = await release.json(); + + await Promise.all( + assets + .filter(({ name }) => FILES_TO_DOWNLOAD.some(f => name.startsWith(f))) + .map(({ name, browser_download_url }) => + downloadFile(browser_download_url, join(VENCORD_FILES_DIR, name), {}, { retryOnNetworkError: true }) + ) + ); +} + +export function isValidVencordInstall(dir: string) { + return FILES_TO_DOWNLOAD.every(f => existsSync(join(dir, f))); +} + +export async function ensureVencordFiles() { + if (isValidVencordInstall(VENCORD_FILES_DIR)) return; + mkdirSync(VENCORD_FILES_DIR, { recursive: true }); + + await downloadVencordFiles(); +}