2021-12-24 21:56:49 +00:00
|
|
|
// Modules to control application life and create native browser window
|
2023-05-08 19:24:30 +00:00
|
|
|
import {BrowserWindow, app, crashReporter, session} from "electron";
|
2021-12-26 19:15:18 +00:00
|
|
|
import "v8-compile-cache";
|
2024-06-01 09:56:19 +00:00
|
|
|
import "./discord/extensions/csp.js";
|
|
|
|
import "./tray.js";
|
2024-05-15 16:14:49 +00:00
|
|
|
import fs from "fs";
|
2024-06-01 09:56:19 +00:00
|
|
|
import {createCustomWindow, createNativeWindow, createTransparentWindow} from "./discord/window.js";
|
2022-08-25 14:42:54 +00:00
|
|
|
import path from "path";
|
2024-06-01 09:56:19 +00:00
|
|
|
import {createTManagerWindow} from "./themeManager/main.js";
|
|
|
|
import {createSplashWindow} from "./splash/main.js";
|
|
|
|
import {createSetupWindow} from "./setup/main.js";
|
2024-05-15 16:14:49 +00:00
|
|
|
import {
|
|
|
|
setConfig,
|
|
|
|
checkForDataFolder,
|
|
|
|
checkIfConfigExists,
|
|
|
|
checkIfConfigIsBroken,
|
|
|
|
getConfig,
|
|
|
|
firstRun,
|
|
|
|
getConfigLocation
|
2024-06-01 09:56:19 +00:00
|
|
|
} from "./common/config.js";
|
|
|
|
import {injectElectronFlags} from "./common/flags.js";
|
|
|
|
import {setLang} from "./common/lang.js";
|
|
|
|
import {installModLoader} from "./discord/extensions/mods.js";
|
2023-05-08 19:24:30 +00:00
|
|
|
export let iconPath: string;
|
2024-06-14 12:57:34 +00:00
|
|
|
import type {Settings} from "./types/settings";
|
|
|
|
export let settings: Settings;
|
2023-05-08 19:24:30 +00:00
|
|
|
export let customTitlebar: boolean;
|
2024-04-05 10:04:00 +00:00
|
|
|
|
2024-06-14 12:57:34 +00:00
|
|
|
app.on("render-process-gone", (_event, _webContents, details) => {
|
2023-06-17 16:33:07 +00:00
|
|
|
if (details.reason == "crashed") {
|
|
|
|
app.relaunch();
|
|
|
|
}
|
|
|
|
});
|
2023-05-08 19:24:30 +00:00
|
|
|
async function args(): Promise<void> {
|
|
|
|
let argNum = 2;
|
2023-04-25 08:57:49 +00:00
|
|
|
if (process.argv[0] == "electron") argNum++;
|
2024-06-14 12:57:34 +00:00
|
|
|
const args = process.argv[argNum];
|
2023-04-25 08:57:49 +00:00
|
|
|
if (args == undefined) return;
|
|
|
|
if (args.startsWith("--")) return; //electron flag
|
|
|
|
if (args.includes("=")) {
|
2024-06-14 12:57:34 +00:00
|
|
|
const e = args.split("=");
|
|
|
|
setConfig(e[0] as keyof Settings, e[1]);
|
2023-05-08 19:24:30 +00:00
|
|
|
console.log(`Setting ${e[0]} to ${e[1]}`);
|
2023-04-25 08:57:49 +00:00
|
|
|
app.relaunch();
|
|
|
|
app.exit();
|
2023-05-14 11:42:15 +00:00
|
|
|
} else if (args == "themes") {
|
2024-06-14 12:57:34 +00:00
|
|
|
await app.whenReady().then(async () => {
|
|
|
|
await createTManagerWindow();
|
2023-05-14 11:42:15 +00:00
|
|
|
});
|
2023-04-25 08:57:49 +00:00
|
|
|
}
|
|
|
|
}
|
2024-06-15 08:20:44 +00:00
|
|
|
export async function init(): Promise<void> {
|
|
|
|
if (getConfig("skipSplash") == false) {
|
|
|
|
void createSplashWindow(); // REVIEW - Awaiting will hang at start
|
|
|
|
}
|
|
|
|
if (firstRun == true) {
|
|
|
|
setLang(new Intl.DateTimeFormat().resolvedOptions().locale);
|
|
|
|
await createSetupWindow();
|
|
|
|
}
|
|
|
|
switch (getConfig("windowStyle")) {
|
|
|
|
case "default":
|
|
|
|
createCustomWindow();
|
|
|
|
customTitlebar = true;
|
|
|
|
break;
|
|
|
|
case "native":
|
|
|
|
createNativeWindow();
|
|
|
|
break;
|
|
|
|
case "transparent":
|
|
|
|
createTransparentWindow();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
createCustomWindow();
|
|
|
|
customTitlebar = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2024-06-14 12:57:34 +00:00
|
|
|
await args(); // i want my top level awaits - IMPLEMENTED :)
|
2024-06-15 08:20:44 +00:00
|
|
|
if (!app.requestSingleInstanceLock()) {
|
2023-08-20 19:14:26 +00:00
|
|
|
// if value isn't set after 3.2.4
|
2022-12-13 18:45:21 +00:00
|
|
|
// kill if 2nd instance
|
|
|
|
app.quit();
|
|
|
|
} else {
|
2023-08-20 19:14:26 +00:00
|
|
|
app.commandLine.appendSwitch("disable-features", "WidgetLayering"); // fix dev tools layers
|
2022-12-13 18:45:21 +00:00
|
|
|
// Your data now belongs to CCP
|
2022-12-24 18:46:58 +00:00
|
|
|
crashReporter.start({uploadToServer: false});
|
2024-04-29 17:14:29 +00:00
|
|
|
// enable pulseaudio audio sharing on linux
|
|
|
|
if (process.platform === "linux") {
|
|
|
|
app.commandLine.appendSwitch("enable-features", "PulseaudioLoopbackForScreenShare");
|
|
|
|
app.commandLine.appendSwitch("disable-features", "WebRtcAllowInputVolumeAdjustment");
|
|
|
|
}
|
2023-08-05 12:07:42 +00:00
|
|
|
// enable webrtc capturer for wayland
|
2023-03-09 15:50:17 +00:00
|
|
|
if (process.platform === "linux" && process.env.XDG_SESSION_TYPE?.toLowerCase() === "wayland") {
|
2024-04-29 17:14:29 +00:00
|
|
|
app.commandLine.appendSwitch("enable-features", "WebRTCPipeWireCapturer");
|
2023-08-05 12:07:42 +00:00
|
|
|
console.log("Wayland detected, using PipeWire for video capture.");
|
|
|
|
}
|
2023-06-10 17:43:59 +00:00
|
|
|
// work around chrome 66 disabling autoplay by default
|
|
|
|
app.commandLine.appendSwitch("autoplay-policy", "no-user-gesture-required");
|
|
|
|
// WinRetrieveSuggestionsOnlyOnDemand: Work around electron 13 bug w/ async spellchecking on Windows.
|
|
|
|
// HardwareMediaKeyHandling,MediaSessionService: Prevent Discord from registering as a media service.
|
|
|
|
app.commandLine.appendSwitch(
|
|
|
|
"disable-features",
|
|
|
|
"WinRetrieveSuggestionsOnlyOnDemand,HardwareMediaKeyHandling,MediaSessionService"
|
|
|
|
);
|
2024-06-15 08:22:03 +00:00
|
|
|
app.commandLine.appendSwitch("enable-transparent-visuals");
|
2022-12-13 18:45:21 +00:00
|
|
|
checkForDataFolder();
|
|
|
|
checkIfConfigExists();
|
2024-04-05 10:04:00 +00:00
|
|
|
checkIfConfigIsBroken();
|
2022-12-13 18:45:21 +00:00
|
|
|
injectElectronFlags();
|
2024-05-15 16:14:49 +00:00
|
|
|
console.log("[Config Manager] Current config: " + fs.readFileSync(getConfigLocation(), "utf-8"));
|
2024-06-14 12:57:34 +00:00
|
|
|
void app.whenReady().then(async () => {
|
|
|
|
// REVIEW - Awaiting the line above will cause a hang at startup
|
|
|
|
if (getConfig("customIcon") !== null) {
|
|
|
|
iconPath = getConfig("customIcon");
|
2022-12-13 18:45:21 +00:00
|
|
|
} else {
|
2024-05-15 18:14:18 +00:00
|
|
|
iconPath = path.join(import.meta.dirname, "../", "/assets/desktop.png");
|
2022-03-04 17:53:18 +00:00
|
|
|
}
|
2024-06-15 08:22:03 +00:00
|
|
|
async function init(): Promise<void> {
|
|
|
|
if (getConfig("skipSplash") == false) {
|
|
|
|
void createSplashWindow(); // REVIEW - Awaiting will hang at start
|
|
|
|
}
|
|
|
|
if (firstRun == true) {
|
|
|
|
setLang(new Intl.DateTimeFormat().resolvedOptions().locale);
|
|
|
|
await createSetupWindow();
|
|
|
|
}
|
|
|
|
switch (getConfig("windowStyle")) {
|
|
|
|
case "default":
|
|
|
|
createCustomWindow();
|
|
|
|
customTitlebar = true;
|
|
|
|
break;
|
|
|
|
case "native":
|
|
|
|
createNativeWindow();
|
|
|
|
break;
|
|
|
|
case "transparent":
|
|
|
|
createTransparentWindow();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
createCustomWindow();
|
|
|
|
customTitlebar = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Patch for linux bug to insure things are loaded before window creation (fixes transparency on some linux systems)
|
|
|
|
await new Promise<void>((resolve) => setTimeout(() => (init(), resolve()), 1500));
|
2022-12-13 18:45:21 +00:00
|
|
|
await installModLoader();
|
2023-05-08 19:24:30 +00:00
|
|
|
session.fromPartition("some-partition").setPermissionRequestHandler((_webContents, permission, callback) => {
|
2022-12-13 18:45:21 +00:00
|
|
|
if (permission === "notifications") {
|
|
|
|
// Approves the permissions request
|
|
|
|
callback(true);
|
|
|
|
}
|
|
|
|
if (permission === "media") {
|
|
|
|
// Approves the permissions request
|
|
|
|
callback(true);
|
|
|
|
}
|
|
|
|
});
|
2024-06-14 12:57:34 +00:00
|
|
|
app.on("activate", function () {
|
|
|
|
// REVIEW - I don't think it really matters if this promise is voided
|
|
|
|
if (BrowserWindow.getAllWindows().length === 0) void init();
|
2022-12-13 18:45:21 +00:00
|
|
|
});
|
2022-03-04 17:53:18 +00:00
|
|
|
});
|
2022-12-13 19:23:17 +00:00
|
|
|
}
|