diff --git a/scripts/build.mts b/scripts/build.mts index 8936728..ce24951 100644 --- a/scripts/build.mts +++ b/scripts/build.mts @@ -1,15 +1,20 @@ import { BuildContext, BuildOptions, context } from "esbuild"; -const NodeCommonOpts: BuildOptions = { - format: "cjs", - platform: "node", - external: ["electron"], +const CommonOpts: BuildOptions = { minify: true, bundle: true, sourcemap: "linked", logLevel: "info" }; +const NodeCommonOpts: BuildOptions = { + ...CommonOpts, + format: "cjs", + platform: "node", + external: ["electron"], + target: ["esnext"], +}; + const contexts = [] as BuildContext[]; async function createContext(options: BuildOptions) { contexts.push(await context(options)); @@ -25,6 +30,12 @@ await Promise.all([ ...NodeCommonOpts, entryPoints: ["src/preload/index.ts"], outfile: "dist/js/preload.js" + }), + createContext({ + ...CommonOpts, + entryPoints: ["src/renderer/index.ts"], + outfile: "dist/js/renderer.js", + format: "iife", }) ]); diff --git a/src/main/ipc.ts b/src/main/ipc.ts index 4eee396..b295ea6 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -1,13 +1,31 @@ -import { app, ipcMain } from "electron"; +import { app, ipcMain, shell } from "electron"; +import { readFileSync } from "fs"; import { join } from "path"; -import { GET_PRELOAD_FILE, RELAUNCH } from "../shared/IpcEvents"; +import { GET_RENDERER_SCRIPT, GET_SETTINGS, GET_VENCORD_PRELOAD_FILE, RELAUNCH, SET_SETTINGS, SHOW_IN_FOLDER } from "../shared/IpcEvents"; import { VENCORD_FILES_DIR } from "./constants"; +import { PlainSettings, setSettings } from "./settings"; -ipcMain.on(GET_PRELOAD_FILE, e => { +ipcMain.on(GET_VENCORD_PRELOAD_FILE, e => { e.returnValue = join(VENCORD_FILES_DIR, "preload.js"); }); +ipcMain.on(GET_RENDERER_SCRIPT, e => { + e.returnValue = readFileSync(join(__dirname, "renderer.js"), "utf-8"); +}); + +ipcMain.on(GET_SETTINGS, e => { + e.returnValue = PlainSettings; +}); + +ipcMain.handle(SET_SETTINGS, (_, settings) => { + setSettings(settings); +}); + ipcMain.handle(RELAUNCH, () => { app.relaunch(); app.exit(); }); + +ipcMain.handle(SHOW_IN_FOLDER, (_, path) => { + shell.showItemInFolder(path); +}); diff --git a/src/main/mainWindow.ts b/src/main/mainWindow.ts index 6d02549..702b617 100644 --- a/src/main/mainWindow.ts +++ b/src/main/mainWindow.ts @@ -142,7 +142,11 @@ export function createMainWindow() { initTray(win); initWindowOpenHandler(win); - win.loadURL("https://discord.com/app"); + const subdomain = Settings.discordBranch === "canary" || Settings.discordBranch === "ptb" + ? `${Settings.discordBranch}.` + : ""; + + win.loadURL(`https://${subdomain}discord.com/app`); return win; } diff --git a/src/main/settings.ts b/src/main/settings.ts index 318b058..14ab407 100644 --- a/src/main/settings.ts +++ b/src/main/settings.ts @@ -13,24 +13,36 @@ interface Settings { width: number; height: number; }; + discordBranch: "stable" | "canary" | "ptb"; } -let settings = {} as Settings; +export let PlainSettings = {} as Settings; try { const content = readFileSync(SETTINGS_FILE, "utf8"); try { - settings = JSON.parse(content); + PlainSettings = JSON.parse(content); } catch (err) { console.error("Failed to parse settings.json:", err); } } catch { } -export const Settings = new Proxy(settings, { - set(target, prop, value) { - Reflect.set(target, prop, value); +function makeSettingsProxy(settings: Settings) { + return new Proxy(settings, { + set(target, prop, value) { + Reflect.set(target, prop, value); - writeFileSync(SETTINGS_FILE, JSON.stringify(target, null, 4)); + writeFileSync(SETTINGS_FILE, JSON.stringify(target, null, 4)); + + return true; + } + }); +} + +export let Settings = makeSettingsProxy(PlainSettings); + +export function setSettings(settings: Settings) { + writeFileSync(SETTINGS_FILE, JSON.stringify(settings, null, 4)); + PlainSettings = settings; + Settings = makeSettingsProxy(settings); +} - return true; - } -}); diff --git a/src/preload/VencordDesktop.ts b/src/preload/VencordDesktop.ts index d2089a9..7d896d0 100644 --- a/src/preload/VencordDesktop.ts +++ b/src/preload/VencordDesktop.ts @@ -1,9 +1,17 @@ import { ipcRenderer } from "electron"; -import { RELAUNCH } from "../shared/IpcEvents"; +import type { Settings } from "../main/settings"; +import { GET_SETTINGS, RELAUNCH, SET_SETTINGS, SHOW_IN_FOLDER } from "../shared/IpcEvents"; export const VencordDesktop = { app: { relaunch: () => ipcRenderer.invoke(RELAUNCH) + }, + files: { + showInFolder: (path: string) => ipcRenderer.invoke(SHOW_IN_FOLDER, path) + }, + settings: { + get: () => ipcRenderer.sendSync(GET_SETTINGS), + set: (settings: typeof Settings) => ipcRenderer.invoke(SET_SETTINGS, settings) } } diff --git a/src/preload/index.ts b/src/preload/index.ts index 6dd7605..3df5a9a 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -1,7 +1,9 @@ -import { contextBridge, ipcRenderer } from "electron"; -import { GET_PRELOAD_FILE } from "../shared/IpcEvents"; +import { contextBridge, ipcRenderer, webFrame } from "electron"; +import { GET_RENDERER_SCRIPT, GET_VENCORD_PRELOAD_FILE } from "../shared/IpcEvents"; import { VencordDesktop } from "./VencordDesktop"; contextBridge.exposeInMainWorld("VencordDesktop", VencordDesktop); -require(ipcRenderer.sendSync(GET_PRELOAD_FILE)); +require(ipcRenderer.sendSync(GET_VENCORD_PRELOAD_FILE)); + +webFrame.executeJavaScript(ipcRenderer.sendSync(GET_RENDERER_SCRIPT)); diff --git a/src/renderer/index.ts b/src/renderer/index.ts new file mode 100644 index 0000000..109aa48 --- /dev/null +++ b/src/renderer/index.ts @@ -0,0 +1 @@ +console.log("read if cute :3"); diff --git a/src/shared/IpcEvents.ts b/src/shared/IpcEvents.ts index 35e4d87..b973ee7 100644 --- a/src/shared/IpcEvents.ts +++ b/src/shared/IpcEvents.ts @@ -1,2 +1,6 @@ -export const GET_PRELOAD_FILE = "VCD_GET_PRELOAD_FILE"; +export const GET_VENCORD_PRELOAD_FILE = "VCD_GET_VC_PRELOAD_FILE"; +export const GET_RENDERER_SCRIPT = "VCD_GET_RENDERER_SCRIPT"; export const RELAUNCH = "VCD_RELAUNCH"; +export const SHOW_IN_FOLDER = "VCD_SHOW_IN_FOLDER"; +export const GET_SETTINGS = "VCD_GET_SETTINGS"; +export const SET_SETTINGS = "VCD_SET_SETTINGS";