Vesktop/src/main/utils/vencordLoader.ts

68 lines
1.9 KiB
TypeScript
Raw Normal View History

2023-04-09 22:49:50 +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-09 22:49:50 +02:00
* Copyright (c) 2023 Vendicated and Vencord contributors
*/
2023-04-04 00:41:52 +02:00
import { existsSync, mkdirSync } from "fs";
import type { RequestOptions } from "https";
2023-04-04 00:41:52 +02:00
import { join } from "path";
2023-04-09 22:49:50 +02:00
2023-04-04 00:41:52 +02:00
import { USER_AGENT, VENCORD_FILES_DIR } from "../constants";
import { downloadFile, simpleGet } from "./http";
2023-04-10 22:53:44 +02:00
const API_BASE = "https://api.github.com";
2023-04-04 00:41:52 +02:00
export const FILES_TO_DOWNLOAD = [
"vencordDesktopMain.js",
"vencordDesktopPreload.js",
"vencordDesktopRenderer.js",
"vencordDesktopRenderer.css"
];
2023-04-04 00:41:52 +02:00
2023-04-10 22:53:44 +02:00
export interface ReleaseData {
name: string;
tag_name: string;
html_url: string;
assets: Array<{
name: string;
browser_download_url: string;
}>;
}
2023-04-04 00:41:52 +02:00
export async function githubGet(endpoint: string) {
const opts: RequestOptions = {
2023-04-04 00:41:52 +02:00
headers: {
Accept: "application/vnd.github+json",
"User-Agent": USER_AGENT
}
};
if (process.env.GITHUB_TOKEN) opts.headers!.Authorization = `Bearer ${process.env.GITHUB_TOKEN}`;
return simpleGet(API_BASE + endpoint, opts);
2023-04-04 00:41:52 +02:00
}
export async function downloadVencordFiles() {
2023-04-10 22:53:44 +02:00
const release = await githubGet("/repos/Vendicated/Vencord/releases/latest");
2023-04-04 00:41:52 +02:00
2023-04-10 22:53:44 +02:00
const { assets } = JSON.parse(release.toString("utf-8")) as ReleaseData;
2023-04-04 00:41:52 +02:00
await Promise.all(
assets
2023-04-09 22:49:50 +02:00
.filter(({ name }) => FILES_TO_DOWNLOAD.some(f => name.startsWith(f)))
.map(({ name, browser_download_url }) => downloadFile(browser_download_url, join(VENCORD_FILES_DIR, name)))
2023-04-04 00:41:52 +02:00
);
}
2023-08-12 03:13:03 +02:00
export function isValidVencordInstall(dir: string) {
return FILES_TO_DOWNLOAD.every(f => existsSync(join(dir, f)));
}
2023-04-04 00:41:52 +02:00
export async function ensureVencordFiles() {
2023-08-12 03:13:03 +02:00
if (isValidVencordInstall(VENCORD_FILES_DIR)) return;
2023-04-04 00:41:52 +02:00
mkdirSync(VENCORD_FILES_DIR, { recursive: true });
await downloadVencordFiles();
}