/* * Vencord, a modification for Discord's desktop app * Copyright (c) 2023 Vendicated and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import { app, net, protocol } from "electron"; import { join } from "path"; import { pathToFileURL } from "url"; import { initCsp } from "./csp"; import { ensureSafePath } from "./ipcMain"; import { RendererSettings } from "./settings"; import { IS_VANILLA, THEMES_DIR } from "./utils/constants"; import { installExt } from "./utils/extensions"; if (!IS_VANILLA && !IS_EXTENSION) { app.whenReady().then(() => { protocol.handle("vencord", ({ url: unsafeUrl }) => { let url = decodeURI(unsafeUrl).slice("vencord://".length).replace(/\?v=\d+$/, ""); if (url.endsWith("/")) url = url.slice(0, -1); if (url.startsWith("/themes/")) { const theme = url.slice("/themes/".length); const safeUrl = ensureSafePath(THEMES_DIR, theme); if (!safeUrl) { return new Response(null, { status: 404 }); } return net.fetch(pathToFileURL(safeUrl).toString()); } // Source Maps! Maybe there's a better way but since the renderer is executed // from a string I don't think any other form of sourcemaps would work switch (url) { case "renderer.js.map": case "preload.js.map": case "patcher.js.map": case "main.js.map": return net.fetch(pathToFileURL(join(__dirname, url)).toString()); default: return new Response(null, { status: 404 }); } }); protocol.handle("equicord", ({ url: unsafeUrl }) => { let url = decodeURI(unsafeUrl).slice("equicord://".length).replace(/\?v=\d+$/, ""); if (url.endsWith("/")) url = url.slice(0, -1); if (url.startsWith("/themes/")) { const theme = url.slice("/themes/".length); const safeUrl = ensureSafePath(THEMES_DIR, theme); if (!safeUrl) { return new Response(null, { status: 404 }); } return net.fetch(pathToFileURL(safeUrl).toString()); } // Source Maps! Maybe there's a better way but since the renderer is executed // from a string I don't think any other form of sourcemaps would work switch (url) { case "renderer.js.map": case "preload.js.map": case "patcher.js.map": case "main.js.map": return net.fetch(pathToFileURL(join(__dirname, url)).toString()); default: return new Response(null, { status: 404 }); } }); try { if (RendererSettings.store.enableReactDevtools) installExt("fmkadmapgofadopljbjfkapdkoienihi") .then(() => console.info("[Equicord] Installed React Developer Tools")) .catch(err => console.error("[Equicord] Failed to install React Developer Tools", err)); } catch { } initCsp(); }); } if (IS_DISCORD_DESKTOP) { require("./patcher"); }