mirror of
https://github.com/smartfrigde/armcord.git
synced 2024-08-14 23:56:58 +00:00
[*] ESLint: The Lintening (#393)
* [*] ESLint: The Lintening * Missed a couple unused vals in utils * [*] Tend to DeepScan remarks * [*] sigh, remove some duplicate crap
This commit is contained in:
parent
974f90fd35
commit
a2a997df30
22 changed files with 1091 additions and 293 deletions
35
.eslintrc.yml
Normal file
35
.eslintrc.yml
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
extends: eslint-config-dmitmel/presets/node
|
||||||
|
env:
|
||||||
|
browser: true
|
||||||
|
plugins: ["prettier"]
|
||||||
|
|
||||||
|
settings:
|
||||||
|
node:
|
||||||
|
tryExtensions: [".tsx", ".ts", ".jsx", ".js", ".json", ".node"]
|
||||||
|
|
||||||
|
ignorePatterns: ["src/arrpc/**"]
|
||||||
|
|
||||||
|
rules:
|
||||||
|
prettier/prettier:
|
||||||
|
- error
|
||||||
|
node/no-unsupported-features/es-syntax:
|
||||||
|
- error
|
||||||
|
- ignores:
|
||||||
|
- modules
|
||||||
|
|
||||||
|
overrides:
|
||||||
|
- files: "**/*.ts*"
|
||||||
|
extends:
|
||||||
|
- eslint-config-dmitmel/presets/typescript-addon
|
||||||
|
parserOptions:
|
||||||
|
project: "tsconfig.json"
|
||||||
|
sourceType: module
|
||||||
|
rules:
|
||||||
|
eqeqeq: 0
|
||||||
|
require-await: 0
|
||||||
|
no-undefined: 0
|
||||||
|
node/no-unsupported-features/es-syntax: 0
|
||||||
|
"@typescript-eslint/no-dynamic-delete": 0
|
||||||
|
"@typescript-eslint/no-explicit-any": 0
|
||||||
|
"@typescript-eslint/no-non-null-asserted-optional-chain": 0
|
||||||
|
"@typescript-eslint/naming-convention": 0
|
10
package.json
10
package.json
|
@ -3,6 +3,9 @@
|
||||||
"version": "3.2.0",
|
"version": "3.2.0",
|
||||||
"description": "ArmCord is a custom client designed to enhance your Discord experience while keeping everything lightweight.",
|
"description": "ArmCord is a custom client designed to enhance your Discord experience while keeping everything lightweight.",
|
||||||
"main": "ts-out/main.js",
|
"main": "ts-out/main.js",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18.0.0"
|
||||||
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "tsc && copyfiles -u 1 src/**/*.html src/**/**/*.css src/**/**/*.js ts-out/ && copyfiles package.json ts-out/ && copyfiles assets/**/** ts-out/",
|
"build": "tsc && copyfiles -u 1 src/**/*.html src/**/**/*.css src/**/**/*.js ts-out/ && copyfiles package.json ts-out/ && copyfiles assets/**/** ts-out/",
|
||||||
"watch": "tsc -w",
|
"watch": "tsc -w",
|
||||||
|
@ -11,6 +14,7 @@
|
||||||
"package": "npm run build && electron-builder",
|
"package": "npm run build && electron-builder",
|
||||||
"packageQuick": "npm run build && electron-builder --dir",
|
"packageQuick": "npm run build && electron-builder --dir",
|
||||||
"format": "prettier --write src *.json",
|
"format": "prettier --write src *.json",
|
||||||
|
"lint": "eslint src --ext .js,.jsx,.ts,.tsx --ignore-path .gitignore",
|
||||||
"CIbuild": "npm run build && electron-builder --linux zip && electron-builder --windows zip && electron-builder --macos zip",
|
"CIbuild": "npm run build && electron-builder --linux zip && electron-builder --windows zip && electron-builder --macos zip",
|
||||||
"prepare": "git config --local core.hooksPath .hooks/"
|
"prepare": "git config --local core.hooksPath .hooks/"
|
||||||
},
|
},
|
||||||
|
@ -27,10 +31,16 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^18.11.9",
|
"@types/node": "^18.11.9",
|
||||||
"@types/ws": "^8.5.3",
|
"@types/ws": "^8.5.3",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^5.59.2",
|
||||||
|
"@typescript-eslint/parser": "^5.59.2",
|
||||||
"chalk-cli": "^5.0.0",
|
"chalk-cli": "^5.0.0",
|
||||||
"copyfiles": "^2.4.1",
|
"copyfiles": "^2.4.1",
|
||||||
"electron": "^24.1.2",
|
"electron": "^24.1.2",
|
||||||
"electron-builder": "^23.6.0",
|
"electron-builder": "^23.6.0",
|
||||||
|
"eslint": "^8.40.0",
|
||||||
|
"eslint-config-dmitmel": "github:dmitmel/eslint-config-dmitmel",
|
||||||
|
"eslint-plugin-node": "^11.1.0",
|
||||||
|
"eslint-plugin-prettier": "^4.2.1",
|
||||||
"prettier": "^2.7.1",
|
"prettier": "^2.7.1",
|
||||||
"typescript": "^4.9.3"
|
"typescript": "^4.9.3"
|
||||||
},
|
},
|
||||||
|
|
763
pnpm-lock.yaml
763
pnpm-lock.yaml
File diff suppressed because it is too large
Load diff
|
@ -65,7 +65,7 @@ function disableAutogain(constraints) {
|
||||||
|
|
||||||
function patchFunction(object, name, createNewFunction) {
|
function patchFunction(object, name, createNewFunction) {
|
||||||
if (name in object) {
|
if (name in object) {
|
||||||
var original = object[name];
|
const original = object[name];
|
||||||
object[name] = createNewFunction(original);
|
object[name] = createNewFunction(original);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import electron from "electron";
|
import electron from "electron";
|
||||||
import {getConfig} from "../utils";
|
import {getConfig} from "../utils";
|
||||||
|
|
||||||
const unstrictCSP = () => {
|
const unstrictCSP = (): void => {
|
||||||
console.log("Setting up CSP unstricter...");
|
console.log("Setting up CSP unstricter...");
|
||||||
|
|
||||||
electron.session.defaultSession.webRequest.onHeadersReceived(({responseHeaders, resourceType}, done) => {
|
electron.session.defaultSession.webRequest.onHeadersReceived(({responseHeaders, resourceType}, done) => {
|
||||||
|
@ -15,7 +15,7 @@ const unstrictCSP = () => {
|
||||||
responseHeaders["content-type"] = ["text/css"];
|
responseHeaders["content-type"] = ["text/css"];
|
||||||
}
|
}
|
||||||
|
|
||||||
done({responseHeaders});
|
return done({responseHeaders});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import {app, session} from "electron";
|
import {app, session} from "electron";
|
||||||
const userDataPath = app.getPath("userData");
|
const userDataPath = app.getPath("userData");
|
||||||
const pluginFolder = userDataPath + "/plugins/";
|
const pluginFolder = `${userDataPath}/plugins`;
|
||||||
if (!fs.existsSync(pluginFolder)) {
|
if (!fs.existsSync(pluginFolder)) {
|
||||||
fs.mkdirSync(pluginFolder);
|
fs.mkdirSync(pluginFolder);
|
||||||
console.log("Created missing plugin folder");
|
console.log("Created missing plugin folder");
|
||||||
|
@ -9,9 +9,9 @@ if (!fs.existsSync(pluginFolder)) {
|
||||||
app.whenReady().then(() => {
|
app.whenReady().then(() => {
|
||||||
fs.readdirSync(pluginFolder).forEach((file) => {
|
fs.readdirSync(pluginFolder).forEach((file) => {
|
||||||
try {
|
try {
|
||||||
const manifest = fs.readFileSync(`${userDataPath}/plugins/${file}/manifest.json`, "utf8");
|
const manifest = fs.readFileSync(`${pluginFolder}/${file}/manifest.json`, "utf8");
|
||||||
var pluginFile = JSON.parse(manifest);
|
const pluginFile = JSON.parse(manifest);
|
||||||
session.defaultSession.loadExtension(`${userDataPath}/plugins/${file}`);
|
session.defaultSession.loadExtension(`${pluginFolder}/${file}`);
|
||||||
console.log(`[Mod loader] Loaded ${pluginFile.name} made by ${pluginFile.author}`);
|
console.log(`[Mod loader] Loaded ${pluginFile.name} made by ${pluginFile.author}`);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
|
|
87
src/ipc.ts
87
src/ipc.ts
|
@ -1,44 +1,42 @@
|
||||||
//ipc stuff
|
//ipc stuff
|
||||||
import {app, ipcMain, shell, desktopCapturer, nativeImage, screen} from "electron";
|
import {app, desktopCapturer, ipcMain, nativeImage, shell} from "electron";
|
||||||
import {mainWindow} from "./window";
|
import {mainWindow} from "./window";
|
||||||
import {
|
import {
|
||||||
setConfigBulk,
|
|
||||||
getVersion,
|
|
||||||
getConfig,
|
getConfig,
|
||||||
setLang,
|
|
||||||
getLang,
|
|
||||||
getWindowState,
|
|
||||||
packageVersion,
|
|
||||||
getDisplayVersion,
|
getDisplayVersion,
|
||||||
|
getLang,
|
||||||
|
getVersion,
|
||||||
|
getWindowState,
|
||||||
modInstallState,
|
modInstallState,
|
||||||
installModLoader
|
packageVersion,
|
||||||
|
setConfigBulk,
|
||||||
|
setLang
|
||||||
} from "./utils";
|
} from "./utils";
|
||||||
import {customTitlebar} from "./main";
|
import {customTitlebar} from "./main";
|
||||||
import {createSettingsWindow} from "./settings/main";
|
import {createSettingsWindow} from "./settings/main";
|
||||||
import os from "os";
|
import os from "os";
|
||||||
import fs from "fs";
|
|
||||||
import path from "path";
|
import path from "path";
|
||||||
export function registerIpc() {
|
export function registerIpc(): void {
|
||||||
ipcMain.on("get-app-path", (event, arg) => {
|
ipcMain.on("get-app-path", (event) => {
|
||||||
event.reply("app-path", app.getAppPath());
|
event.reply("app-path", app.getAppPath());
|
||||||
});
|
});
|
||||||
ipcMain.on("setLang", (event, lang: string) => {
|
ipcMain.on("setLang", (_event, lang: string) => {
|
||||||
setLang(lang);
|
setLang(lang);
|
||||||
});
|
});
|
||||||
ipcMain.handle("getLang", (event, toGet: string) => {
|
ipcMain.handle("getLang", (_event, toGet: string) => {
|
||||||
return getLang(toGet);
|
return getLang(toGet);
|
||||||
});
|
});
|
||||||
ipcMain.on("open-external-link", (event, href: string) => {
|
ipcMain.on("open-external-link", (_event, href: string) => {
|
||||||
shell.openExternal(href);
|
shell.openExternal(href);
|
||||||
});
|
});
|
||||||
ipcMain.on("setPing", (event, pingCount: number) => {
|
ipcMain.on("setPing", (_event, pingCount: number) => {
|
||||||
switch (os.platform()) {
|
switch (os.platform()) {
|
||||||
case "linux" ?? "macos":
|
case "linux" ?? "macos":
|
||||||
app.setBadgeCount(pingCount);
|
app.setBadgeCount(pingCount);
|
||||||
break;
|
break;
|
||||||
case "win32":
|
case "win32":
|
||||||
if (pingCount > 0) {
|
if (pingCount > 0) {
|
||||||
var image = nativeImage.createFromPath(path.join(__dirname, "../", `/assets/ping.png`));
|
let image = nativeImage.createFromPath(path.join(__dirname, "../", `/assets/ping.png`));
|
||||||
mainWindow.setOverlayIcon(image, "badgeCount");
|
mainWindow.setOverlayIcon(image, "badgeCount");
|
||||||
} else {
|
} else {
|
||||||
mainWindow.setOverlayIcon(null, "badgeCount");
|
mainWindow.setOverlayIcon(null, "badgeCount");
|
||||||
|
@ -46,28 +44,28 @@ export function registerIpc() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ipcMain.on("win-maximize", (event, arg) => {
|
ipcMain.on("win-maximize", () => {
|
||||||
mainWindow.maximize();
|
mainWindow.maximize();
|
||||||
});
|
});
|
||||||
ipcMain.on("win-isMaximized", (event, arg) => {
|
ipcMain.on("win-isMaximized", (event) => {
|
||||||
event.returnValue = mainWindow.isMaximized();
|
event.returnValue = mainWindow.isMaximized();
|
||||||
});
|
});
|
||||||
ipcMain.on("win-isNormal", (event, arg) => {
|
ipcMain.on("win-isNormal", (event) => {
|
||||||
event.returnValue = mainWindow.isNormal();
|
event.returnValue = mainWindow.isNormal();
|
||||||
});
|
});
|
||||||
ipcMain.on("win-minimize", (event, arg) => {
|
ipcMain.on("win-minimize", () => {
|
||||||
mainWindow.minimize();
|
mainWindow.minimize();
|
||||||
});
|
});
|
||||||
ipcMain.on("win-unmaximize", (event, arg) => {
|
ipcMain.on("win-unmaximize", () => {
|
||||||
mainWindow.unmaximize();
|
mainWindow.unmaximize();
|
||||||
});
|
});
|
||||||
ipcMain.on("win-show", (event, arg) => {
|
ipcMain.on("win-show", () => {
|
||||||
mainWindow.show();
|
mainWindow.show();
|
||||||
});
|
});
|
||||||
ipcMain.on("win-hide", (event, arg) => {
|
ipcMain.on("win-hide", () => {
|
||||||
mainWindow.hide();
|
mainWindow.hide();
|
||||||
});
|
});
|
||||||
ipcMain.on("win-quit", (event, arg) => {
|
ipcMain.on("win-quit", () => {
|
||||||
app.exit();
|
app.exit();
|
||||||
});
|
});
|
||||||
ipcMain.on("get-app-version", (event) => {
|
ipcMain.on("get-app-version", (event) => {
|
||||||
|
@ -83,14 +81,19 @@ export function registerIpc() {
|
||||||
event.returnValue = packageVersion;
|
event.returnValue = packageVersion;
|
||||||
});
|
});
|
||||||
ipcMain.on("splashEnd", async () => {
|
ipcMain.on("splashEnd", async () => {
|
||||||
|
let width = 800,
|
||||||
|
height = 600,
|
||||||
|
isMaximized = true,
|
||||||
|
xValue = 0,
|
||||||
|
yValue = 0;
|
||||||
try {
|
try {
|
||||||
var width = (await getWindowState("width")) ?? 800;
|
width = (await getWindowState("width")) ?? 800;
|
||||||
var height = (await getWindowState("height")) ?? 600;
|
height = (await getWindowState("height")) ?? 600;
|
||||||
var isMaximized = (await getWindowState("isMaximized")) ?? false;
|
isMaximized = (await getWindowState("isMaximized")) ?? false;
|
||||||
var xValue = await getWindowState("x");
|
xValue = await getWindowState("x");
|
||||||
var yValue = await getWindowState("y");
|
yValue = await getWindowState("y");
|
||||||
} catch (e) {
|
} catch (_e) {
|
||||||
console.log("[Window state manager] No window state file found. Fallbacking to default values.");
|
console.log("[Window state manager] No window state file found. Falling back to default values.");
|
||||||
mainWindow.setSize(800, 600);
|
mainWindow.setSize(800, 600);
|
||||||
}
|
}
|
||||||
if (isMaximized) {
|
if (isMaximized) {
|
||||||
|
@ -102,11 +105,11 @@ export function registerIpc() {
|
||||||
console.log("[Window state manager] Not maximized.");
|
console.log("[Window state manager] Not maximized.");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ipcMain.on("restart", (event, arg) => {
|
ipcMain.on("restart", () => {
|
||||||
app.relaunch();
|
app.relaunch();
|
||||||
app.exit();
|
app.exit();
|
||||||
});
|
});
|
||||||
ipcMain.on("saveSettings", (event, args) => {
|
ipcMain.on("saveSettings", (_event, args) => {
|
||||||
setConfigBulk(args);
|
setConfigBulk(args);
|
||||||
});
|
});
|
||||||
ipcMain.on("minimizeToTray", async (event) => {
|
ipcMain.on("minimizeToTray", async (event) => {
|
||||||
|
@ -115,28 +118,28 @@ export function registerIpc() {
|
||||||
ipcMain.on("channel", async (event) => {
|
ipcMain.on("channel", async (event) => {
|
||||||
event.returnValue = await getConfig("channel");
|
event.returnValue = await getConfig("channel");
|
||||||
});
|
});
|
||||||
ipcMain.on("clientmod", async (event, arg) => {
|
ipcMain.on("clientmod", async (event) => {
|
||||||
event.returnValue = await getConfig("mods");
|
event.returnValue = await getConfig("mods");
|
||||||
});
|
});
|
||||||
ipcMain.on("legacyCapturer", async (event, arg) => {
|
ipcMain.on("legacyCapturer", async (event) => {
|
||||||
event.returnValue = await getConfig("useLegacyCapturer");
|
event.returnValue = await getConfig("useLegacyCapturer");
|
||||||
});
|
});
|
||||||
ipcMain.on("trayIcon", async (event, arg) => {
|
ipcMain.on("trayIcon", async (event) => {
|
||||||
event.returnValue = await getConfig("trayIcon");
|
event.returnValue = await getConfig("trayIcon");
|
||||||
});
|
});
|
||||||
ipcMain.on("disableAutogain", async (event, arg) => {
|
ipcMain.on("disableAutogain", async (event) => {
|
||||||
event.returnValue = await getConfig("disableAutogain");
|
event.returnValue = await getConfig("disableAutogain");
|
||||||
});
|
});
|
||||||
ipcMain.on("titlebar", (event, arg) => {
|
ipcMain.on("titlebar", (event) => {
|
||||||
event.returnValue = customTitlebar;
|
event.returnValue = customTitlebar;
|
||||||
});
|
});
|
||||||
ipcMain.on("mobileMode", async (event, arg) => {
|
ipcMain.on("mobileMode", async (event) => {
|
||||||
event.returnValue = await getConfig("mobileMode");
|
event.returnValue = await getConfig("mobileMode");
|
||||||
});
|
});
|
||||||
ipcMain.on("shouldPatch", async (event, arg) => {
|
ipcMain.on("shouldPatch", async (event) => {
|
||||||
event.returnValue = await getConfig("automaticPatches");
|
event.returnValue = await getConfig("automaticPatches");
|
||||||
});
|
});
|
||||||
ipcMain.on("openSettingsWindow", (event, arg) => {
|
ipcMain.on("openSettingsWindow", () => {
|
||||||
createSettingsWindow();
|
createSettingsWindow();
|
||||||
});
|
});
|
||||||
ipcMain.on("setting-armcordCSP", async (event) => {
|
ipcMain.on("setting-armcordCSP", async (event) => {
|
||||||
|
@ -146,5 +149,5 @@ export function registerIpc() {
|
||||||
event.returnValue = false;
|
event.returnValue = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ipcMain.handle("DESKTOP_CAPTURER_GET_SOURCES", (event, opts) => desktopCapturer.getSources(opts));
|
ipcMain.handle("DESKTOP_CAPTURER_GET_SOURCES", (_event, opts) => desktopCapturer.getSources(opts));
|
||||||
}
|
}
|
||||||
|
|
34
src/main.ts
34
src/main.ts
|
@ -1,34 +1,32 @@
|
||||||
// Modules to control application life and create native browser window
|
// Modules to control application life and create native browser window
|
||||||
import {app, BrowserWindow, crashReporter, session} from "electron";
|
import {BrowserWindow, app, crashReporter, session} from "electron";
|
||||||
import "v8-compile-cache";
|
import "v8-compile-cache";
|
||||||
import {
|
import {
|
||||||
|
Settings,
|
||||||
checkForDataFolder,
|
checkForDataFolder,
|
||||||
getConfig,
|
|
||||||
checkIfConfigExists,
|
checkIfConfigExists,
|
||||||
|
getConfig,
|
||||||
injectElectronFlags,
|
injectElectronFlags,
|
||||||
setConfig,
|
|
||||||
installModLoader,
|
installModLoader,
|
||||||
getConfigLocation
|
setConfig
|
||||||
} from "./utils";
|
} from "./utils";
|
||||||
import "./extensions/mods";
|
import "./extensions/mods";
|
||||||
import "./tray";
|
import "./tray";
|
||||||
import fs from "fs";
|
import {createCustomWindow, createNativeWindow, createTransparentWindow} from "./window";
|
||||||
import {createCustomWindow, createNativeWindow, createTransparentWindow, mainWindow} from "./window";
|
|
||||||
import path from "path";
|
import path from "path";
|
||||||
export var iconPath: string;
|
export let iconPath: string;
|
||||||
export var settings: any;
|
export let settings: any;
|
||||||
export var customTitlebar: boolean;
|
export let customTitlebar: boolean;
|
||||||
export var clientName: "ArmCord";
|
async function args(): Promise<void> {
|
||||||
async function args() {
|
let argNum = 2;
|
||||||
var argNum = 2;
|
|
||||||
if (process.argv[0] == "electron") argNum++;
|
if (process.argv[0] == "electron") argNum++;
|
||||||
var args = process.argv[argNum];
|
let args = process.argv[argNum];
|
||||||
if (args == undefined) return;
|
if (args == undefined) return;
|
||||||
if (args.startsWith("--")) return; //electron flag
|
if (args.startsWith("--")) return; //electron flag
|
||||||
if (args.includes("=")) {
|
if (args.includes("=")) {
|
||||||
var e = args.split("=");
|
let e = args.split("=");
|
||||||
await setConfig(e[0], e[1]);
|
await setConfig(e[0] as keyof Settings, e[1]);
|
||||||
console.log("Setting " + e[0] + " to " + e[1]);
|
console.log(`Setting ${e[0]} to ${e[1]}`);
|
||||||
app.relaunch();
|
app.relaunch();
|
||||||
app.exit();
|
app.exit();
|
||||||
}
|
}
|
||||||
|
@ -70,7 +68,7 @@ if (!app.requestSingleInstanceLock()) {
|
||||||
} else {
|
} else {
|
||||||
iconPath = path.join(__dirname, "../", "/assets/ac_icon_transparent.png");
|
iconPath = path.join(__dirname, "../", "/assets/ac_icon_transparent.png");
|
||||||
}
|
}
|
||||||
async function init() {
|
async function init(): Promise<void> {
|
||||||
switch (await getConfig("windowStyle")) {
|
switch (await getConfig("windowStyle")) {
|
||||||
case "default":
|
case "default":
|
||||||
createCustomWindow();
|
createCustomWindow();
|
||||||
|
@ -93,7 +91,7 @@ if (!app.requestSingleInstanceLock()) {
|
||||||
}
|
}
|
||||||
await init();
|
await init();
|
||||||
await installModLoader();
|
await installModLoader();
|
||||||
session.fromPartition("some-partition").setPermissionRequestHandler((webContents, permission, callback) => {
|
session.fromPartition("some-partition").setPermissionRequestHandler((_webContents, permission, callback) => {
|
||||||
if (permission === "notifications") {
|
if (permission === "notifications") {
|
||||||
// Approves the permissions request
|
// Approves the permissions request
|
||||||
callback(true);
|
callback(true);
|
||||||
|
|
16
src/menu.ts
16
src/menu.ts
|
@ -3,7 +3,7 @@ import {mainWindow} from "./window";
|
||||||
import {getConfig} from "./utils";
|
import {getConfig} from "./utils";
|
||||||
import {createSettingsWindow} from "./settings/main";
|
import {createSettingsWindow} from "./settings/main";
|
||||||
|
|
||||||
function paste(contents: any) {
|
function paste(contents: any): void {
|
||||||
const contentTypes = clipboard.availableFormats().toString();
|
const contentTypes = clipboard.availableFormats().toString();
|
||||||
//Workaround: fix pasting the images.
|
//Workaround: fix pasting the images.
|
||||||
if (contentTypes.includes("image/") && contentTypes.includes("text/html")) {
|
if (contentTypes.includes("image/") && contentTypes.includes("text/html")) {
|
||||||
|
@ -11,7 +11,7 @@ function paste(contents: any) {
|
||||||
}
|
}
|
||||||
contents.paste();
|
contents.paste();
|
||||||
}
|
}
|
||||||
export async function setMenu() {
|
export async function setMenu(): Promise<void> {
|
||||||
if ((await getConfig("alternativePaste")) == true) {
|
if ((await getConfig("alternativePaste")) == true) {
|
||||||
mainWindow.on("focus", function () {
|
mainWindow.on("focus", function () {
|
||||||
console.log("[Window state manager] Focus");
|
console.log("[Window state manager] Focus");
|
||||||
|
@ -39,7 +39,7 @@ export async function setMenu() {
|
||||||
globalShortcut.unregister("CmdOrCtrl+V");
|
globalShortcut.unregister("CmdOrCtrl+V");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
var template: Electron.MenuItemConstructorOptions[] = [
|
let template: Electron.MenuItemConstructorOptions[] = [
|
||||||
{
|
{
|
||||||
label: "ArmCord",
|
label: "ArmCord",
|
||||||
submenu: [
|
submenu: [
|
||||||
|
@ -48,28 +48,28 @@ export async function setMenu() {
|
||||||
{
|
{
|
||||||
label: "Developer tools",
|
label: "Developer tools",
|
||||||
accelerator: "CmdOrCtrl+Shift+I",
|
accelerator: "CmdOrCtrl+Shift+I",
|
||||||
click: function () {
|
click() {
|
||||||
BrowserWindow.getFocusedWindow()!.webContents.toggleDevTools();
|
BrowserWindow.getFocusedWindow()!.webContents.toggleDevTools();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Open settings",
|
label: "Open settings",
|
||||||
accelerator: "CmdOrCtrl+Shift+'",
|
accelerator: "CmdOrCtrl+Shift+'",
|
||||||
click: function () {
|
click() {
|
||||||
createSettingsWindow();
|
createSettingsWindow();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Reload",
|
label: "Reload",
|
||||||
accelerator: "CmdOrCtrl+R",
|
accelerator: "CmdOrCtrl+R",
|
||||||
click: function () {
|
click() {
|
||||||
mainWindow.reload();
|
mainWindow.reload();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Quit",
|
label: "Quit",
|
||||||
accelerator: "CmdOrCtrl+Q",
|
accelerator: "CmdOrCtrl+Q",
|
||||||
click: function () {
|
click() {
|
||||||
app.quit();
|
app.quit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -86,7 +86,7 @@ export async function setMenu() {
|
||||||
{
|
{
|
||||||
label: "Paste",
|
label: "Paste",
|
||||||
accelerator: "CmdOrCtrl+V",
|
accelerator: "CmdOrCtrl+V",
|
||||||
click: function () {
|
click() {
|
||||||
paste(mainWindow.webContents);
|
paste(mainWindow.webContents);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -9,7 +9,7 @@ interface IPCSources {
|
||||||
name: string;
|
name: string;
|
||||||
thumbnail: HTMLCanvasElement;
|
thumbnail: HTMLCanvasElement;
|
||||||
}
|
}
|
||||||
async function getDisplayMediaSelector() {
|
async function getDisplayMediaSelector(): Promise<string> {
|
||||||
const sources: IPCSources[] = await desktopCapturer.getSources({
|
const sources: IPCSources[] = await desktopCapturer.getSources({
|
||||||
types: ["screen", "window"]
|
types: ["screen", "window"]
|
||||||
});
|
});
|
||||||
|
@ -54,7 +54,7 @@ contextBridge.exposeInMainWorld("armcord", {
|
||||||
ipcRenderer.invoke("getLang", toGet).then((result) => {
|
ipcRenderer.invoke("getLang", toGet).then((result) => {
|
||||||
return result;
|
return result;
|
||||||
}),
|
}),
|
||||||
getDisplayMediaSelector: getDisplayMediaSelector,
|
getDisplayMediaSelector,
|
||||||
version: ipcRenderer.sendSync("get-app-version", "app-version"),
|
version: ipcRenderer.sendSync("get-app-version", "app-version"),
|
||||||
mods: ipcRenderer.sendSync("clientmod"),
|
mods: ipcRenderer.sendSync("clientmod"),
|
||||||
packageVersion: ipcRenderer.sendSync("get-package-version", "app-version"),
|
packageVersion: ipcRenderer.sendSync("get-package-version", "app-version"),
|
||||||
|
@ -63,9 +63,11 @@ contextBridge.exposeInMainWorld("armcord", {
|
||||||
});
|
});
|
||||||
let windowCallback: (arg0: object) => void;
|
let windowCallback: (arg0: object) => void;
|
||||||
contextBridge.exposeInMainWorld("ArmCordRPC", {
|
contextBridge.exposeInMainWorld("ArmCordRPC", {
|
||||||
listen: (callback: any) => (windowCallback = callback)
|
listen: (callback: any) => {
|
||||||
|
windowCallback = callback;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
ipcRenderer.on("rpc", (event, data: object) => {
|
ipcRenderer.on("rpc", (_event, data: object) => {
|
||||||
windowCallback(data);
|
windowCallback(data);
|
||||||
});
|
});
|
||||||
//to be only used inside armcord internal setup/splash etc
|
//to be only used inside armcord internal setup/splash etc
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
//Fixed context isolation version https://github.com/getferdi/ferdi/blob/develop/src/webview/screenshare.ts
|
//Fixed context isolation version https://github.com/getferdi/ferdi/blob/develop/src/webview/screenshare.ts
|
||||||
//original https://github.com/electron/electron/issues/16513#issuecomment-602070250
|
//original https://github.com/electron/electron/issues/16513#issuecomment-602070250
|
||||||
import {addStyle, addScript} from "../utils";
|
import {addScript, addStyle} from "../utils";
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
import {ipcRenderer} from "electron";
|
|
||||||
import {addStyle} from "../utils";
|
import {addStyle} from "../utils";
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import * as path from "path";
|
import * as path from "path";
|
||||||
export function injectMobileStuff() {
|
export function injectMobileStuff(): void {
|
||||||
document.addEventListener("DOMContentLoaded", function (event) {
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
const mobileCSS = path.join(__dirname, "../", "/content/css/mobile.css");
|
const mobileCSS = path.join(__dirname, "../", "/content/css/mobile.css");
|
||||||
addStyle(fs.readFileSync(mobileCSS, "utf8"));
|
addStyle(fs.readFileSync(mobileCSS, "utf8"));
|
||||||
// TO-DO: clicking on the logo, or additional button triggers ESC button to move around the UI quicker
|
// TO-DO: clicking on the logo, or additional button triggers ESC button to move around the UI quicker
|
||||||
|
|
|
@ -4,16 +4,16 @@
|
||||||
import {ipcRenderer} from "electron";
|
import {ipcRenderer} from "electron";
|
||||||
import {injectJS} from "../utils";
|
import {injectJS} from "../utils";
|
||||||
|
|
||||||
var patchEndpoint = "https://patch.armcord.xyz/";
|
const patchEndpoint = "https://patch.armcord.xyz";
|
||||||
var version = ipcRenderer.sendSync("get-app-version", "app-version");
|
const version = ipcRenderer.sendSync("get-app-version", "app-version");
|
||||||
if (ipcRenderer.sendSync("shouldPatch")) {
|
if (ipcRenderer.sendSync("shouldPatch")) {
|
||||||
document.addEventListener("DOMContentLoaded", function () {
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
fetch(patchEndpoint + version + "/info.json", {cache: "no-store"}) //lmao
|
fetch(`${patchEndpoint}/${version}/info.json`, {cache: "no-store"}) //lmao
|
||||||
.then((res) => res.json())
|
.then((res) => res.json())
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
if (res.patch == true) {
|
if (res.patch == true) {
|
||||||
console.log("Found a patch. Injecting...");
|
console.log("Found a patch. Injecting...");
|
||||||
injectJS(patchEndpoint + version + "/patch.js");
|
injectJS(`${patchEndpoint}/${version}/patch.js`);
|
||||||
} else {
|
} else {
|
||||||
console.log("No patches have been found.");
|
console.log("No patches have been found.");
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,9 +15,8 @@ if (ipcRenderer.sendSync("legacyCapturer")) {
|
||||||
import("./capturer");
|
import("./capturer");
|
||||||
}
|
}
|
||||||
|
|
||||||
var version = ipcRenderer.sendSync("displayVersion");
|
const version = ipcRenderer.sendSync("displayVersion");
|
||||||
var channel = ipcRenderer.sendSync("channel");
|
async function updateLang(): Promise<void> {
|
||||||
async function updateLang() {
|
|
||||||
if (window.location.href.indexOf("setup.html") > -1) {
|
if (window.location.href.indexOf("setup.html") > -1) {
|
||||||
console.log("Setup, skipping lang update");
|
console.log("Setup, skipping lang update");
|
||||||
} else {
|
} else {
|
||||||
|
@ -32,8 +31,8 @@ declare global {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log("ArmCord " + version);
|
console.log(`ArmCord ${version}`);
|
||||||
ipcRenderer.on("themeLoader", (event, message) => {
|
ipcRenderer.on("themeLoader", (_event, message) => {
|
||||||
addStyle(message);
|
addStyle(message);
|
||||||
});
|
});
|
||||||
if (window.location.href.indexOf("splash.html") > -1) {
|
if (window.location.href.indexOf("splash.html") > -1) {
|
||||||
|
|
|
@ -3,9 +3,9 @@ import {addStyle} from "../utils";
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import * as path from "path";
|
import * as path from "path";
|
||||||
import os from "os";
|
import os from "os";
|
||||||
export function injectTitlebar() {
|
export function injectTitlebar(): void {
|
||||||
document.addEventListener("DOMContentLoaded", function (event) {
|
document.addEventListener("DOMContentLoaded", function (_event) {
|
||||||
var elem = document.createElement("div");
|
const elem = document.createElement("div");
|
||||||
elem.innerHTML = `<nav class="titlebar">
|
elem.innerHTML = `<nav class="titlebar">
|
||||||
<div class="window-title" id="window-title"></div>
|
<div class="window-title" id="window-title"></div>
|
||||||
<div id="window-controls-container">
|
<div id="window-controls-container">
|
||||||
|
@ -28,9 +28,9 @@ export function injectTitlebar() {
|
||||||
document.body.setAttribute("customTitlebar", "");
|
document.body.setAttribute("customTitlebar", "");
|
||||||
document.body.setAttribute("armcord-platform", os.platform());
|
document.body.setAttribute("armcord-platform", os.platform());
|
||||||
|
|
||||||
var minimize = document.getElementById("minimize");
|
const minimize = document.getElementById("minimize");
|
||||||
var maximize = document.getElementById("maximize");
|
const maximize = document.getElementById("maximize");
|
||||||
var quit = document.getElementById("quit");
|
const quit = document.getElementById("quit");
|
||||||
|
|
||||||
minimize!.addEventListener("click", () => {
|
minimize!.addEventListener("click", () => {
|
||||||
ipcRenderer.send("win-minimize");
|
ipcRenderer.send("win-minimize");
|
||||||
|
@ -55,8 +55,8 @@ export function injectTitlebar() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function fixTitlebar() {
|
export function fixTitlebar(): void {
|
||||||
var elem = document.createElement("div");
|
const elem = document.createElement("div");
|
||||||
elem.innerHTML = `<nav class="titlebar">
|
elem.innerHTML = `<nav class="titlebar">
|
||||||
<div class="window-title" id="window-title"></div>
|
<div class="window-title" id="window-title"></div>
|
||||||
<div id="window-controls-container">
|
<div id="window-controls-container">
|
||||||
|
@ -72,9 +72,9 @@ export function fixTitlebar() {
|
||||||
} else {
|
} else {
|
||||||
document.getElementById("app-mount")!.prepend(elem);
|
document.getElementById("app-mount")!.prepend(elem);
|
||||||
}
|
}
|
||||||
var minimize = document.getElementById("minimize");
|
const minimize = document.getElementById("minimize");
|
||||||
var maximize = document.getElementById("maximize");
|
const maximize = document.getElementById("maximize");
|
||||||
var quit = document.getElementById("quit");
|
const quit = document.getElementById("quit");
|
||||||
|
|
||||||
minimize!.addEventListener("click", () => {
|
minimize!.addEventListener("click", () => {
|
||||||
ipcRenderer.send("win-minimize");
|
ipcRenderer.send("win-minimize");
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import {BrowserWindow, desktopCapturer, DesktopCapturerSource, ipcMain, session, shell} from "electron";
|
import {BrowserWindow, desktopCapturer, ipcMain, session} from "electron";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import {iconPath} from "../main";
|
import {iconPath} from "../main";
|
||||||
var capturerWindow: BrowserWindow;
|
let capturerWindow: BrowserWindow;
|
||||||
function registerCustomHandler() {
|
function registerCustomHandler(): void {
|
||||||
session.defaultSession.setDisplayMediaRequestHandler(async (request, callback) => {
|
session.defaultSession.setDisplayMediaRequestHandler(async (request, callback) => {
|
||||||
console.log(request);
|
console.log(request);
|
||||||
const sources = await desktopCapturer.getSources({
|
const sources = await desktopCapturer.getSources({
|
||||||
|
@ -23,11 +23,11 @@ function registerCustomHandler() {
|
||||||
preload: path.join(__dirname, "preload.js")
|
preload: path.join(__dirname, "preload.js")
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ipcMain.once("selectScreenshareSource", (event, id, name) => {
|
ipcMain.once("selectScreenshareSource", (_event, id, name) => {
|
||||||
//console.log(sources[id]);
|
//console.log(sources[id]);
|
||||||
//console.log(id);
|
//console.log(id);
|
||||||
capturerWindow.close();
|
capturerWindow.close();
|
||||||
var result = {id, name, width: 9999, height: 9999};
|
let result = {id, name, width: 9999, height: 9999};
|
||||||
callback({video: result});
|
callback({video: result});
|
||||||
});
|
});
|
||||||
capturerWindow.loadURL(`file://${__dirname}/picker.html`);
|
capturerWindow.loadURL(`file://${__dirname}/picker.html`);
|
||||||
|
|
|
@ -1,16 +1,15 @@
|
||||||
import {IpcMain, ipcRenderer} from "electron";
|
import {ipcRenderer} from "electron";
|
||||||
interface IPCSources {
|
interface IPCSources {
|
||||||
id: string;
|
id: string;
|
||||||
name: string;
|
name: string;
|
||||||
thumbnail: HTMLCanvasElement;
|
thumbnail: HTMLCanvasElement;
|
||||||
}
|
}
|
||||||
async function addDisplays() {
|
async function addDisplays(): Promise<void> {
|
||||||
ipcRenderer.once("getSources", (event, arg) => {
|
ipcRenderer.once("getSources", (_event, arg) => {
|
||||||
var sources: IPCSources[] = arg;
|
let sources: IPCSources[] = arg;
|
||||||
console.log(sources);
|
console.log(sources);
|
||||||
const selectionElem = document.createElement("div");
|
const selectionElem = document.createElement("div");
|
||||||
//@ts-ignore
|
selectionElem.classList.add("desktop-capturer-selection");
|
||||||
selectionElem.classList = ["desktop-capturer-selection"];
|
|
||||||
selectionElem.innerHTML = `<div class="desktop-capturer-selection__scroller">
|
selectionElem.innerHTML = `<div class="desktop-capturer-selection__scroller">
|
||||||
<ul class="desktop-capturer-selection__list">
|
<ul class="desktop-capturer-selection__list">
|
||||||
${sources
|
${sources
|
||||||
|
@ -39,7 +38,7 @@ async function addDisplays() {
|
||||||
const id = button.getAttribute("data-id");
|
const id = button.getAttribute("data-id");
|
||||||
const title = button.getAttribute("title");
|
const title = button.getAttribute("title");
|
||||||
if (id === "${CANCEL_ID}") {
|
if (id === "${CANCEL_ID}") {
|
||||||
new Error("Cancelled by user");
|
throw new Error("Cancelled by user");
|
||||||
} else {
|
} else {
|
||||||
ipcRenderer.sendSync("selectScreenshareSource", id, title);
|
ipcRenderer.sendSync("selectScreenshareSource", id, title);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,31 +1,27 @@
|
||||||
import {BrowserWindow, shell, ipcMain, app, clipboard} from "electron";
|
import {BrowserWindow, app, clipboard, ipcMain, shell} from "electron";
|
||||||
import {
|
import {
|
||||||
checkForDataFolder,
|
|
||||||
getConfig,
|
|
||||||
setConfigBulk,
|
|
||||||
Settings,
|
Settings,
|
||||||
getLang,
|
getConfig,
|
||||||
getVersion,
|
|
||||||
getConfigLocation,
|
getConfigLocation,
|
||||||
|
getDisplayVersion,
|
||||||
getLangName,
|
getLangName,
|
||||||
sleep,
|
getVersion,
|
||||||
getDisplayVersion
|
setConfigBulk,
|
||||||
|
sleep
|
||||||
} from "../utils";
|
} from "../utils";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import os from "os";
|
import os from "os";
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
import {mainWindow} from "../window";
|
let settingsWindow: BrowserWindow;
|
||||||
import {crash} from "process";
|
let instance = 0;
|
||||||
var settingsWindow: BrowserWindow;
|
|
||||||
var instance: number = 0;
|
|
||||||
//checkForDataFolder();
|
//checkForDataFolder();
|
||||||
const userDataPath = app.getPath("userData");
|
const userDataPath = app.getPath("userData");
|
||||||
const storagePath = path.join(userDataPath, "/storage/");
|
const storagePath = path.join(userDataPath, "/storage/");
|
||||||
const themesPath = path.join(userDataPath, "/themes/");
|
const themesPath = path.join(userDataPath, "/themes/");
|
||||||
const pluginsPath = path.join(userDataPath, "/plugins/");
|
const pluginsPath = path.join(userDataPath, "/plugins/");
|
||||||
export function createSettingsWindow() {
|
export function createSettingsWindow(): void {
|
||||||
console.log("Creating a settings window.");
|
console.log("Creating a settings window.");
|
||||||
instance = instance + 1;
|
instance += 1;
|
||||||
if (instance > 1) {
|
if (instance > 1) {
|
||||||
if (settingsWindow) {
|
if (settingsWindow) {
|
||||||
settingsWindow.show();
|
settingsWindow.show();
|
||||||
|
@ -45,11 +41,11 @@ export function createSettingsWindow() {
|
||||||
preload: path.join(__dirname, "preload.js")
|
preload: path.join(__dirname, "preload.js")
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
async function settingsLoadPage() {
|
async function settingsLoadPage(): Promise<void> {
|
||||||
settingsWindow.loadURL(`file://${__dirname}/settings.html`);
|
settingsWindow.loadURL(`file://${__dirname}/settings.html`);
|
||||||
}
|
}
|
||||||
const userDataPath = app.getPath("userData");
|
const userDataPath = app.getPath("userData");
|
||||||
const themesFolder = userDataPath + "/themes/";
|
const themesFolder = `${userDataPath}/themes/`;
|
||||||
if (!fs.existsSync(themesFolder)) {
|
if (!fs.existsSync(themesFolder)) {
|
||||||
fs.mkdirSync(themesFolder);
|
fs.mkdirSync(themesFolder);
|
||||||
console.log("Created missing theme folder");
|
console.log("Created missing theme folder");
|
||||||
|
@ -58,7 +54,7 @@ export function createSettingsWindow() {
|
||||||
fs.readdirSync(themesFolder).forEach((file) => {
|
fs.readdirSync(themesFolder).forEach((file) => {
|
||||||
try {
|
try {
|
||||||
const manifest = fs.readFileSync(`${themesFolder}/${file}/manifest.json`, "utf8");
|
const manifest = fs.readFileSync(`${themesFolder}/${file}/manifest.json`, "utf8");
|
||||||
var themeFile = JSON.parse(manifest);
|
let themeFile = JSON.parse(manifest);
|
||||||
settingsWindow.webContents.send(
|
settingsWindow.webContents.send(
|
||||||
"themeLoader",
|
"themeLoader",
|
||||||
fs.readFileSync(`${themesFolder}/${file}/${themeFile.theme}`, "utf-8")
|
fs.readFileSync(`${themesFolder}/${file}/${themeFile.theme}`, "utf-8")
|
||||||
|
@ -69,51 +65,41 @@ export function createSettingsWindow() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
ipcMain.on("saveSettings", (event, args: Settings) => {
|
ipcMain.on("saveSettings", (_event, args: Settings) => {
|
||||||
console.log(args);
|
console.log(args);
|
||||||
setConfigBulk(args);
|
setConfigBulk(args);
|
||||||
});
|
});
|
||||||
ipcMain.on("openStorageFolder", async (event) => {
|
ipcMain.on("openStorageFolder", async () => {
|
||||||
shell.showItemInFolder(storagePath);
|
shell.showItemInFolder(storagePath);
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
});
|
});
|
||||||
ipcMain.on("openThemesFolder", async (event) => {
|
ipcMain.on("openThemesFolder", async () => {
|
||||||
shell.showItemInFolder(themesPath);
|
shell.showItemInFolder(themesPath);
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
});
|
});
|
||||||
ipcMain.on("openPluginsFolder", async (event) => {
|
ipcMain.on("openPluginsFolder", async () => {
|
||||||
shell.showItemInFolder(pluginsPath);
|
shell.showItemInFolder(pluginsPath);
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
});
|
});
|
||||||
ipcMain.on("openCrashesFolder", async (event) => {
|
ipcMain.on("openCrashesFolder", async () => {
|
||||||
shell.showItemInFolder(path.join(app.getPath("temp"), app.getName() + " Crashes"));
|
shell.showItemInFolder(path.join(app.getPath("temp"), `${app.getName()} Crashes`));
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
});
|
});
|
||||||
ipcMain.on("getLangName", async (event) => {
|
ipcMain.on("getLangName", async (event) => {
|
||||||
event.returnValue = await getLangName();
|
event.returnValue = await getLangName();
|
||||||
});
|
});
|
||||||
ipcMain.on("crash", async (event) => {
|
ipcMain.on("crash", async () => {
|
||||||
process.crash();
|
process.crash();
|
||||||
});
|
});
|
||||||
ipcMain.handle("getSetting", (event, toGet: string) => {
|
ipcMain.handle("getSetting", (_event, toGet: keyof Settings) => {
|
||||||
return getConfig(toGet);
|
return getConfig(toGet);
|
||||||
});
|
});
|
||||||
ipcMain.on("copyDebugInfo", (event) => {
|
ipcMain.on("copyDebugInfo", () => {
|
||||||
let settingsFileContent = fs.readFileSync(getConfigLocation(), "utf-8");
|
let settingsFileContent = fs.readFileSync(getConfigLocation(), "utf-8");
|
||||||
clipboard.writeText(
|
clipboard.writeText(
|
||||||
"**OS:** " +
|
`**OS:** ${os.platform()} ${os.version()}\n**Architecture:** ${os.arch()}\n**ArmCord version:** ${getVersion()}\n**Electron version:** ${
|
||||||
os.platform() +
|
process.versions.electron
|
||||||
" " +
|
}\n\`${settingsFileContent}\``
|
||||||
os.version() +
|
|
||||||
"\n**Architecture:** " +
|
|
||||||
os.arch() +
|
|
||||||
"\n**ArmCord version:** " +
|
|
||||||
getVersion() +
|
|
||||||
"\n**Electron version:** " +
|
|
||||||
process.versions.electron +
|
|
||||||
"\n`" +
|
|
||||||
settingsFileContent +
|
|
||||||
"`"
|
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
settingsWindow.webContents.setWindowOpenHandler(({url}) => {
|
settingsWindow.webContents.setWindowOpenHandler(({url}) => {
|
||||||
|
@ -121,7 +107,7 @@ export function createSettingsWindow() {
|
||||||
return {action: "deny"};
|
return {action: "deny"};
|
||||||
});
|
});
|
||||||
settingsLoadPage();
|
settingsLoadPage();
|
||||||
settingsWindow.on("close", (event: Event) => {
|
settingsWindow.on("close", () => {
|
||||||
ipcMain.removeHandler("getSetting");
|
ipcMain.removeHandler("getSetting");
|
||||||
ipcMain.removeAllListeners("saveSettings");
|
ipcMain.removeAllListeners("saveSettings");
|
||||||
instance = 0;
|
instance = 0;
|
||||||
|
|
|
@ -16,6 +16,6 @@ contextBridge.exposeInMainWorld("settings", {
|
||||||
crash: () => ipcRenderer.send("crash")
|
crash: () => ipcRenderer.send("crash")
|
||||||
});
|
});
|
||||||
|
|
||||||
ipcRenderer.on("themeLoader", (event, message) => {
|
ipcRenderer.on("themeLoader", (_event, message) => {
|
||||||
addStyle(message);
|
addStyle(message);
|
||||||
});
|
});
|
||||||
|
|
36
src/tray.ts
36
src/tray.ts
|
@ -1,13 +1,13 @@
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import {app, Menu, Tray, nativeImage} from "electron";
|
import {Menu, Tray, app, nativeImage} from "electron";
|
||||||
import {createInviteWindow, mainWindow} from "./window";
|
import {createInviteWindow, mainWindow} from "./window";
|
||||||
import {getConfig, getConfigLocation, setWindowState, getDisplayVersion} from "./utils";
|
import {getConfig, getConfigLocation, getDisplayVersion, setWindowState} from "./utils";
|
||||||
import * as path from "path";
|
import * as path from "path";
|
||||||
import {createSettingsWindow} from "./settings/main";
|
import {createSettingsWindow} from "./settings/main";
|
||||||
export let tray: any = null;
|
export let tray: any = null;
|
||||||
app.whenReady().then(async () => {
|
app.whenReady().then(async () => {
|
||||||
let finishedSetup = await getConfig("doneSetup");
|
let finishedSetup = await getConfig("doneSetup");
|
||||||
var trayIcon = (await getConfig("trayIcon")) ?? "ac_plug_colored";
|
let trayIcon = (await getConfig("trayIcon")) ?? "ac_plug_colored";
|
||||||
let trayPath = nativeImage.createFromPath(path.join(__dirname, "../", `/assets/${trayIcon}.png`));
|
let trayPath = nativeImage.createFromPath(path.join(__dirname, "../", `/assets/${trayIcon}.png`));
|
||||||
let trayVerIcon;
|
let trayVerIcon;
|
||||||
trayVerIcon = function () {
|
trayVerIcon = function () {
|
||||||
|
@ -18,14 +18,15 @@ app.whenReady().then(async () => {
|
||||||
} else if (process.platform == "linux") {
|
} else if (process.platform == "linux") {
|
||||||
return trayPath.resize({height: 24});
|
return trayPath.resize({height: 24});
|
||||||
}
|
}
|
||||||
|
return undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (process.platform == "darwin" && trayPath.getSize().height > 22) trayPath = trayPath.resize({height: 22});
|
if (process.platform == "darwin" && trayPath.getSize().height > 22) trayPath = trayPath.resize({height: 22});
|
||||||
|
|
||||||
|
let clientName = (await getConfig("clientName")) ?? "ArmCord";
|
||||||
if ((await getConfig("windowStyle")) == "basic") {
|
if ((await getConfig("windowStyle")) == "basic") {
|
||||||
var clientName = (await getConfig("clientName")) ?? "ArmCord";
|
|
||||||
tray = new Tray(trayPath);
|
tray = new Tray(trayPath);
|
||||||
const contextMenu = function () {
|
function contextMenu(): Electron.Menu {
|
||||||
if (finishedSetup == false) {
|
if (finishedSetup == false) {
|
||||||
return Menu.buildFromTemplate([
|
return Menu.buildFromTemplate([
|
||||||
{
|
{
|
||||||
|
@ -34,7 +35,7 @@ app.whenReady().then(async () => {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: `Quit ${clientName}`,
|
label: `Quit ${clientName}`,
|
||||||
click: async function () {
|
async click() {
|
||||||
fs.unlink(await getConfigLocation(), (err) => {
|
fs.unlink(await getConfigLocation(), (err) => {
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
|
@ -48,17 +49,17 @@ app.whenReady().then(async () => {
|
||||||
return Menu.buildFromTemplate([
|
return Menu.buildFromTemplate([
|
||||||
{
|
{
|
||||||
label: `Open ${clientName}`,
|
label: `Open ${clientName}`,
|
||||||
click: function () {
|
click() {
|
||||||
mainWindow.show();
|
mainWindow.show();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: `Quit ${clientName}`,
|
label: `Quit ${clientName}`,
|
||||||
click: function () {
|
click() {
|
||||||
let [width, height] = mainWindow.getSize();
|
let [width, height] = mainWindow.getSize();
|
||||||
setWindowState({
|
setWindowState({
|
||||||
width: width,
|
width,
|
||||||
height: height,
|
height,
|
||||||
isMaximized: mainWindow.isMaximized(),
|
isMaximized: mainWindow.isMaximized(),
|
||||||
x: mainWindow.getPosition()[0],
|
x: mainWindow.getPosition()[0],
|
||||||
y: mainWindow.getPosition()[1]
|
y: mainWindow.getPosition()[1]
|
||||||
|
@ -68,12 +69,11 @@ app.whenReady().then(async () => {
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
tray.setToolTip(clientName);
|
tray.setToolTip(clientName);
|
||||||
tray.setContextMenu(contextMenu);
|
tray.setContextMenu(contextMenu);
|
||||||
} else {
|
} else {
|
||||||
var clientName = (await getConfig("clientName")) ?? "ArmCord";
|
|
||||||
tray = new Tray(trayPath);
|
tray = new Tray(trayPath);
|
||||||
if (finishedSetup == false) {
|
if (finishedSetup == false) {
|
||||||
const contextMenu = Menu.buildFromTemplate([
|
const contextMenu = Menu.buildFromTemplate([
|
||||||
|
@ -83,7 +83,7 @@ app.whenReady().then(async () => {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: `Quit ${clientName}`,
|
label: `Quit ${clientName}`,
|
||||||
click: async function () {
|
async click() {
|
||||||
fs.unlink(await getConfigLocation(), (err) => {
|
fs.unlink(await getConfigLocation(), (err) => {
|
||||||
if (err) throw err;
|
if (err) throw err;
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ app.whenReady().then(async () => {
|
||||||
} else {
|
} else {
|
||||||
const contextMenu = Menu.buildFromTemplate([
|
const contextMenu = Menu.buildFromTemplate([
|
||||||
{
|
{
|
||||||
label: `${clientName} ` + getDisplayVersion(),
|
label: `${clientName} ${getDisplayVersion()}`,
|
||||||
icon: trayVerIcon(),
|
icon: trayVerIcon(),
|
||||||
enabled: false
|
enabled: false
|
||||||
},
|
},
|
||||||
|
@ -106,19 +106,19 @@ app.whenReady().then(async () => {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: `Open ${clientName}`,
|
label: `Open ${clientName}`,
|
||||||
click: function () {
|
click() {
|
||||||
mainWindow.show();
|
mainWindow.show();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Open Settings",
|
label: "Open Settings",
|
||||||
click: function () {
|
click() {
|
||||||
createSettingsWindow();
|
createSettingsWindow();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Support Discord Server",
|
label: "Support Discord Server",
|
||||||
click: function () {
|
click() {
|
||||||
createInviteWindow("TnhxcqynZ2");
|
createInviteWindow("TnhxcqynZ2");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -127,7 +127,7 @@ app.whenReady().then(async () => {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: `Quit ${clientName}`,
|
label: `Quit ${clientName}`,
|
||||||
click: function () {
|
click() {
|
||||||
app.quit();
|
app.quit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
145
src/utils.ts
145
src/utils.ts
|
@ -1,31 +1,31 @@
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import {app, dialog, Rectangle} from "electron";
|
import {app, dialog} from "electron";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import fetch from "cross-fetch";
|
import fetch from "cross-fetch";
|
||||||
import extract from "extract-zip";
|
import extract from "extract-zip";
|
||||||
import util from "util";
|
import util from "util";
|
||||||
const streamPipeline = util.promisify(require("stream").pipeline);
|
const streamPipeline = util.promisify(require("stream").pipeline);
|
||||||
export var firstRun: boolean;
|
export let firstRun: boolean;
|
||||||
export var contentPath: string;
|
export let contentPath: string;
|
||||||
export var transparency: boolean;
|
export let transparency: boolean;
|
||||||
//utility functions that are used all over the codebase or just too obscure to be put in the file used in
|
//utility functions that are used all over the codebase or just too obscure to be put in the file used in
|
||||||
export function addStyle(styleString: string) {
|
export function addStyle(styleString: string): void {
|
||||||
const style = document.createElement("style");
|
const style = document.createElement("style");
|
||||||
style.textContent = styleString;
|
style.textContent = styleString;
|
||||||
document.head.append(style);
|
document.head.append(style);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function addScript(scriptString: string) {
|
export function addScript(scriptString: string): void {
|
||||||
var script = document.createElement("script");
|
let script = document.createElement("script");
|
||||||
script.textContent = scriptString;
|
script.textContent = scriptString;
|
||||||
document.body.append(script);
|
document.body.append(script);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function sleep(ms: number) {
|
export async function sleep(ms: number): Promise<void> {
|
||||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function checkIfConfigIsBroken() {
|
export async function checkIfConfigIsBroken(): Promise<void> {
|
||||||
if ((await getConfig("0")) == "d") {
|
if ((await getConfig("0")) == "d") {
|
||||||
console.log("Detected a corrupted config");
|
console.log("Detected a corrupted config");
|
||||||
setup();
|
setup();
|
||||||
|
@ -36,7 +36,7 @@ export async function checkIfConfigIsBroken() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function setup() {
|
export function setup(): void {
|
||||||
console.log("Setting up temporary ArmCord settings.");
|
console.log("Setting up temporary ArmCord settings.");
|
||||||
const defaults: Settings = {
|
const defaults: Settings = {
|
||||||
windowStyle: "default",
|
windowStyle: "default",
|
||||||
|
@ -55,7 +55,9 @@ export function setup() {
|
||||||
useLegacyCapturer: false,
|
useLegacyCapturer: false,
|
||||||
mobileMode: false,
|
mobileMode: false,
|
||||||
trayIcon: "default",
|
trayIcon: "default",
|
||||||
doneSetup: false
|
doneSetup: false,
|
||||||
|
clientName: "ArmCord",
|
||||||
|
customIcon: path.join(__dirname, "../", "/assets/ac_icon_transparent.png")
|
||||||
};
|
};
|
||||||
setConfigBulk({
|
setConfigBulk({
|
||||||
...defaults
|
...defaults
|
||||||
|
@ -63,12 +65,12 @@ export function setup() {
|
||||||
}
|
}
|
||||||
|
|
||||||
//Get the version value from the "package.json" file
|
//Get the version value from the "package.json" file
|
||||||
export var packageVersion = require("../package.json").version;
|
export const packageVersion = require("../package.json").version;
|
||||||
|
|
||||||
export function getVersion() {
|
export function getVersion(): string {
|
||||||
return packageVersion;
|
return packageVersion;
|
||||||
}
|
}
|
||||||
export function getDisplayVersion() {
|
export function getDisplayVersion(): string {
|
||||||
//Checks if the app version # has 4 sections (3.1.0.0) instead of 3 (3.1.0) / Shitty way to check if Kernel Mod is installed
|
//Checks if the app version # has 4 sections (3.1.0.0) instead of 3 (3.1.0) / Shitty way to check if Kernel Mod is installed
|
||||||
if ((app.getVersion() == packageVersion) == false) {
|
if ((app.getVersion() == packageVersion) == false) {
|
||||||
if ((app.getVersion() == process.versions.electron) == true) {
|
if ((app.getVersion() == process.versions.electron) == true) {
|
||||||
|
@ -80,7 +82,7 @@ export function getDisplayVersion() {
|
||||||
return packageVersion;
|
return packageVersion;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
export async function injectJS(inject: string) {
|
export async function injectJS(inject: string): Promise<void> {
|
||||||
const js = await (await fetch(`${inject}`)).text();
|
const js = await (await fetch(`${inject}`)).text();
|
||||||
|
|
||||||
const el = document.createElement("script");
|
const el = document.createElement("script");
|
||||||
|
@ -89,7 +91,7 @@ export async function injectJS(inject: string) {
|
||||||
|
|
||||||
document.body.appendChild(el);
|
document.body.appendChild(el);
|
||||||
}
|
}
|
||||||
export async function injectElectronFlags() {
|
export async function injectElectronFlags(): Promise<void> {
|
||||||
// MIT License
|
// MIT License
|
||||||
|
|
||||||
// Copyright (c) 2022 GooseNest
|
// Copyright (c) 2022 GooseNest
|
||||||
|
@ -135,43 +137,43 @@ export async function injectElectronFlags() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
export async function setLang(language: string) {
|
export async function setLang(language: string): Promise<void> {
|
||||||
const langConfigFile = path.join(app.getPath("userData"), "/storage/") + "lang.json";
|
const langConfigFile = `${path.join(app.getPath("userData"), "/storage/")}lang.json`;
|
||||||
if (!fs.existsSync(langConfigFile)) {
|
if (!fs.existsSync(langConfigFile)) {
|
||||||
fs.writeFileSync(langConfigFile, "{}", "utf-8");
|
fs.writeFileSync(langConfigFile, "{}", "utf-8");
|
||||||
}
|
}
|
||||||
let rawdata = fs.readFileSync(langConfigFile, "utf-8");
|
let rawdata = fs.readFileSync(langConfigFile, "utf-8");
|
||||||
let parsed = JSON.parse(rawdata);
|
let parsed = JSON.parse(rawdata);
|
||||||
parsed["lang"] = language;
|
parsed.lang = language;
|
||||||
let toSave = JSON.stringify(parsed, null, 4);
|
let toSave = JSON.stringify(parsed, null, 4);
|
||||||
fs.writeFileSync(langConfigFile, toSave, "utf-8");
|
fs.writeFileSync(langConfigFile, toSave, "utf-8");
|
||||||
}
|
}
|
||||||
var language: string;
|
let language: string;
|
||||||
export async function getLang(object: string) {
|
export async function getLang(object: string): Promise<string> {
|
||||||
if (language == undefined) {
|
if (language == undefined) {
|
||||||
try {
|
try {
|
||||||
const userDataPath = app.getPath("userData");
|
const userDataPath = app.getPath("userData");
|
||||||
const storagePath = path.join(userDataPath, "/storage/");
|
const storagePath = path.join(userDataPath, "/storage/");
|
||||||
const langConfigFile = storagePath + "lang.json";
|
const langConfigFile = `${storagePath}lang.json`;
|
||||||
let rawdata = fs.readFileSync(langConfigFile, "utf-8");
|
let rawdata = fs.readFileSync(langConfigFile, "utf-8");
|
||||||
let parsed = JSON.parse(rawdata);
|
let parsed = JSON.parse(rawdata);
|
||||||
language = parsed["lang"];
|
language = parsed.lang;
|
||||||
} catch (e) {
|
} catch (_e) {
|
||||||
console.log("Language config file doesn't exist. Fallback to English.");
|
console.log("Language config file doesn't exist. Fallback to English.");
|
||||||
language = "en-US";
|
language = "en-US";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (language.length == 2) {
|
if (language.length == 2) {
|
||||||
language = language + "-" + language.toUpperCase();
|
language = `${language}-${language.toUpperCase()}`;
|
||||||
}
|
}
|
||||||
var langPath = path.join(__dirname, "../", "/assets/lang/" + language + ".json");
|
let langPath = path.join(__dirname, "../", `/assets/lang/${language}.json`);
|
||||||
if (!fs.existsSync(langPath)) {
|
if (!fs.existsSync(langPath)) {
|
||||||
langPath = path.join(__dirname, "../", "/assets/lang/en-US.json");
|
langPath = path.join(__dirname, "../", "/assets/lang/en-US.json");
|
||||||
}
|
}
|
||||||
let rawdata = fs.readFileSync(langPath, "utf-8");
|
let rawdata = fs.readFileSync(langPath, "utf-8");
|
||||||
let parsed = JSON.parse(rawdata);
|
let parsed = JSON.parse(rawdata);
|
||||||
if (parsed[object] == undefined) {
|
if (parsed[object] == undefined) {
|
||||||
console.log(object + " is undefined in " + language);
|
console.log(`${object} is undefined in ${language}`);
|
||||||
langPath = path.join(__dirname, "../", "/assets/lang/en-US.json");
|
langPath = path.join(__dirname, "../", "/assets/lang/en-US.json");
|
||||||
rawdata = fs.readFileSync(langPath, "utf-8");
|
rawdata = fs.readFileSync(langPath, "utf-8");
|
||||||
parsed = JSON.parse(rawdata);
|
parsed = JSON.parse(rawdata);
|
||||||
|
@ -180,22 +182,22 @@ export async function getLang(object: string) {
|
||||||
return parsed[object];
|
return parsed[object];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
export async function getLangName() {
|
export async function getLangName(): Promise<string> {
|
||||||
if (language == undefined) {
|
if (language == undefined) {
|
||||||
try {
|
try {
|
||||||
const userDataPath = app.getPath("userData");
|
const userDataPath = app.getPath("userData");
|
||||||
const storagePath = path.join(userDataPath, "/storage/");
|
const storagePath = path.join(userDataPath, "/storage/");
|
||||||
const langConfigFile = storagePath + "lang.json";
|
const langConfigFile = `${storagePath}lang.json`;
|
||||||
let rawdata = fs.readFileSync(langConfigFile, "utf-8");
|
let rawdata = fs.readFileSync(langConfigFile, "utf-8");
|
||||||
let parsed = JSON.parse(rawdata);
|
let parsed = JSON.parse(rawdata);
|
||||||
language = parsed["lang"];
|
language = parsed.lang;
|
||||||
} catch (e) {
|
} catch (_e) {
|
||||||
console.log("Language config file doesn't exist. Fallback to English.");
|
console.log("Language config file doesn't exist. Fallback to English.");
|
||||||
language = "en-US";
|
language = "en-US";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (language.length == 2) {
|
if (language.length == 2) {
|
||||||
language = language + "-" + language.toUpperCase();
|
language = `${language}-${language.toUpperCase()}`;
|
||||||
}
|
}
|
||||||
return language;
|
return language;
|
||||||
}
|
}
|
||||||
|
@ -207,26 +209,26 @@ export interface WindowState {
|
||||||
y: number;
|
y: number;
|
||||||
isMaximized: boolean;
|
isMaximized: boolean;
|
||||||
}
|
}
|
||||||
export async function setWindowState(object: WindowState) {
|
export async function setWindowState(object: WindowState): Promise<void> {
|
||||||
const userDataPath = app.getPath("userData");
|
const userDataPath = app.getPath("userData");
|
||||||
const storagePath = path.join(userDataPath, "/storage/");
|
const storagePath = path.join(userDataPath, "/storage/");
|
||||||
const saveFile = storagePath + "window.json";
|
const saveFile = `${storagePath}window.json`;
|
||||||
let toSave = JSON.stringify(object, null, 4);
|
let toSave = JSON.stringify(object, null, 4);
|
||||||
fs.writeFileSync(saveFile, toSave, "utf-8");
|
fs.writeFileSync(saveFile, toSave, "utf-8");
|
||||||
}
|
}
|
||||||
export async function getWindowState(object: string) {
|
export async function getWindowState<K extends keyof WindowState>(object: K): Promise<WindowState[K]> {
|
||||||
const userDataPath = app.getPath("userData");
|
const userDataPath = app.getPath("userData");
|
||||||
const storagePath = path.join(userDataPath, "/storage/");
|
const storagePath = path.join(userDataPath, "/storage/");
|
||||||
const settingsFile = storagePath + "window.json";
|
const settingsFile = `${storagePath}window.json`;
|
||||||
let rawdata = fs.readFileSync(settingsFile, "utf-8");
|
let rawdata = fs.readFileSync(settingsFile, "utf-8");
|
||||||
let returndata = JSON.parse(rawdata);
|
let returndata = JSON.parse(rawdata);
|
||||||
console.log(returndata);
|
console.log(returndata);
|
||||||
console.log("[Window state manager] " + returndata);
|
console.log(`[Window state manager] ${returndata}`);
|
||||||
return returndata[object];
|
return returndata[object];
|
||||||
}
|
}
|
||||||
//ArmCord Settings/Storage manager
|
//ArmCord Settings/Storage manager
|
||||||
|
|
||||||
export function checkForDataFolder() {
|
export function checkForDataFolder(): void {
|
||||||
const dataPath = path.join(path.dirname(app.getPath("exe")), "armcord-data");
|
const dataPath = path.join(path.dirname(app.getPath("exe")), "armcord-data");
|
||||||
if (fs.existsSync(dataPath) && fs.statSync(dataPath).isDirectory()) {
|
if (fs.existsSync(dataPath) && fs.statSync(dataPath).isDirectory()) {
|
||||||
console.log("Found armcord-data folder. Running in portable mode.");
|
console.log("Found armcord-data folder. Running in portable mode.");
|
||||||
|
@ -235,6 +237,14 @@ export function checkForDataFolder() {
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Settings {
|
export interface Settings {
|
||||||
|
// Referenced for detecting a broken config.
|
||||||
|
"0"?: string;
|
||||||
|
// Referenced once for disabling mod updating.
|
||||||
|
noBundleUpdates?: boolean;
|
||||||
|
// Only used for external url warning dialog.
|
||||||
|
ignoreProtocolWarning?: boolean;
|
||||||
|
customIcon: string;
|
||||||
|
|
||||||
windowStyle: string;
|
windowStyle: string;
|
||||||
channel: string;
|
channel: string;
|
||||||
armcordCSP: boolean;
|
armcordCSP: boolean;
|
||||||
|
@ -252,33 +262,34 @@ export interface Settings {
|
||||||
disableAutogain: boolean;
|
disableAutogain: boolean;
|
||||||
trayIcon: string;
|
trayIcon: string;
|
||||||
doneSetup: boolean;
|
doneSetup: boolean;
|
||||||
|
clientName: string;
|
||||||
}
|
}
|
||||||
export function getConfigLocation() {
|
export function getConfigLocation(): string {
|
||||||
const userDataPath = app.getPath("userData");
|
const userDataPath = app.getPath("userData");
|
||||||
const storagePath = path.join(userDataPath, "/storage/");
|
const storagePath = path.join(userDataPath, "/storage/");
|
||||||
return storagePath + "settings.json";
|
return `${storagePath}settings.json`;
|
||||||
}
|
}
|
||||||
export async function getConfig(object: string) {
|
export async function getConfig<K extends keyof Settings>(object: K): Promise<Settings[K]> {
|
||||||
let rawdata = fs.readFileSync(getConfigLocation(), "utf-8");
|
let rawdata = fs.readFileSync(getConfigLocation(), "utf-8");
|
||||||
let returndata = JSON.parse(rawdata);
|
let returndata = JSON.parse(rawdata);
|
||||||
console.log("[Config manager] " + object + ": " + returndata[object]);
|
console.log(`[Config manager] ${object}: ${returndata[object]}`);
|
||||||
return returndata[object];
|
return returndata[object];
|
||||||
}
|
}
|
||||||
export async function setConfig(object: string, toSet: any) {
|
export async function setConfig<K extends keyof Settings>(object: K, toSet: Settings[K]): Promise<void> {
|
||||||
let rawdata = fs.readFileSync(getConfigLocation(), "utf-8");
|
let rawdata = fs.readFileSync(getConfigLocation(), "utf-8");
|
||||||
let parsed = JSON.parse(rawdata);
|
let parsed = JSON.parse(rawdata);
|
||||||
parsed[object] = toSet;
|
parsed[object] = toSet;
|
||||||
let toSave = JSON.stringify(parsed, null, 4);
|
let toSave = JSON.stringify(parsed, null, 4);
|
||||||
fs.writeFileSync(getConfigLocation(), toSave, "utf-8");
|
fs.writeFileSync(getConfigLocation(), toSave, "utf-8");
|
||||||
}
|
}
|
||||||
export async function setConfigBulk(object: Settings) {
|
export async function setConfigBulk(object: Settings): Promise<void> {
|
||||||
let toSave = JSON.stringify(object, null, 4);
|
let toSave = JSON.stringify(object, null, 4);
|
||||||
fs.writeFileSync(getConfigLocation(), toSave, "utf-8");
|
fs.writeFileSync(getConfigLocation(), toSave, "utf-8");
|
||||||
}
|
}
|
||||||
export async function checkIfConfigExists() {
|
export async function checkIfConfigExists(): Promise<void> {
|
||||||
const userDataPath = app.getPath("userData");
|
const userDataPath = app.getPath("userData");
|
||||||
const storagePath = path.join(userDataPath, "/storage/");
|
const storagePath = path.join(userDataPath, "/storage/");
|
||||||
const settingsFile = storagePath + "settings.json";
|
const settingsFile = `${storagePath}settings.json`;
|
||||||
|
|
||||||
if (!fs.existsSync(settingsFile)) {
|
if (!fs.existsSync(settingsFile)) {
|
||||||
if (!fs.existsSync(storagePath)) {
|
if (!fs.existsSync(storagePath)) {
|
||||||
|
@ -288,27 +299,25 @@ export async function checkIfConfigExists() {
|
||||||
console.log("First run of the ArmCord. Starting setup.");
|
console.log("First run of the ArmCord. Starting setup.");
|
||||||
setup();
|
setup();
|
||||||
firstRun = true;
|
firstRun = true;
|
||||||
|
} else if ((await getConfig("doneSetup")) == false) {
|
||||||
|
console.log("First run of the ArmCord. Starting setup.");
|
||||||
|
setup();
|
||||||
|
firstRun = true;
|
||||||
} else {
|
} else {
|
||||||
if ((await getConfig("doneSetup")) == false) {
|
console.log("ArmCord has been run before. Skipping setup.");
|
||||||
console.log("First run of the ArmCord. Starting setup.");
|
|
||||||
setup();
|
|
||||||
firstRun = true;
|
|
||||||
} else {
|
|
||||||
console.log("ArmCord has been run before. Skipping setup.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mods
|
// Mods
|
||||||
async function updateModBundle() {
|
async function updateModBundle(): Promise<void> {
|
||||||
if ((await getConfig("noBundleUpdates")) == undefined ?? false) {
|
if ((await getConfig("noBundleUpdates")) == undefined ?? false) {
|
||||||
try {
|
try {
|
||||||
console.log("Downloading mod bundle");
|
console.log("Downloading mod bundle");
|
||||||
const distFolder = app.getPath("userData") + "/plugins/loader/dist/";
|
const distFolder = `${app.getPath("userData")}/plugins/loader/dist/`;
|
||||||
while (!fs.existsSync(distFolder)) {
|
while (!fs.existsSync(distFolder)) {
|
||||||
//waiting
|
//waiting
|
||||||
}
|
}
|
||||||
var name: string = await getConfig("mods");
|
let name: string = await getConfig("mods");
|
||||||
const clientMods = {
|
const clientMods = {
|
||||||
vencord: "https://github.com/Vendicated/Vencord/releases/download/devbuild/browser.js",
|
vencord: "https://github.com/Vendicated/Vencord/releases/download/devbuild/browser.js",
|
||||||
cordwood: "https://raw.githubusercontent.com/Cordwood/builds/master/index.js",
|
cordwood: "https://raw.githubusercontent.com/Cordwood/builds/master/index.js",
|
||||||
|
@ -319,10 +328,10 @@ async function updateModBundle() {
|
||||||
cordwood: "https://armcord.xyz/placeholder.css",
|
cordwood: "https://armcord.xyz/placeholder.css",
|
||||||
shelter: "https://armcord.xyz/placeholder.css"
|
shelter: "https://armcord.xyz/placeholder.css"
|
||||||
};
|
};
|
||||||
var bundle: string = await (await fetch(clientMods[name as keyof typeof clientMods])).text();
|
let bundle: string = await (await fetch(clientMods[name as keyof typeof clientMods])).text();
|
||||||
fs.writeFileSync(distFolder + "bundle.js", bundle, "utf-8");
|
fs.writeFileSync(`${distFolder}bundle.js`, bundle, "utf-8");
|
||||||
var css: string = await (await fetch(clientModsCss[name as keyof typeof clientModsCss])).text();
|
let css: string = await (await fetch(clientModsCss[name as keyof typeof clientModsCss])).text();
|
||||||
fs.writeFileSync(distFolder + "bundle.css", css, "utf-8");
|
fs.writeFileSync(`${distFolder}bundle.css`, css, "utf-8");
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log("[Mod loader] Failed to install mods");
|
console.log("[Mod loader] Failed to install mods");
|
||||||
console.error(e);
|
console.error(e);
|
||||||
|
@ -336,25 +345,25 @@ async function updateModBundle() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export var modInstallState: string;
|
export let modInstallState: string;
|
||||||
export async function installModLoader() {
|
export async function installModLoader(): Promise<void> {
|
||||||
if ((await getConfig("mods")) == "none") {
|
if ((await getConfig("mods")) == "none") {
|
||||||
modInstallState = "none";
|
modInstallState = "none";
|
||||||
fs.rmSync(app.getPath("userData") + "/plugins/loader", {recursive: true, force: true});
|
fs.rmSync(`${app.getPath("userData")}/plugins/loader`, {recursive: true, force: true});
|
||||||
import("./extensions/plugin");
|
import("./extensions/plugin");
|
||||||
console.log("[Mod loader] Skipping");
|
console.log("[Mod loader] Skipping");
|
||||||
} else {
|
} else {
|
||||||
const pluginFolder = app.getPath("userData") + "/plugins/";
|
const pluginFolder = `${app.getPath("userData")}/plugins/`;
|
||||||
if (!fs.existsSync(pluginFolder + "loader") || !fs.existsSync(pluginFolder + "loader/dist/" + "bundle.css")) {
|
if (!fs.existsSync(`${pluginFolder}loader`) || !fs.existsSync(`${pluginFolder}loader/dist/bundle.css`)) {
|
||||||
try {
|
try {
|
||||||
fs.rmSync(app.getPath("userData") + "/plugins/loader", {recursive: true, force: true});
|
fs.rmSync(`${app.getPath("userData")}/plugins/loader`, {recursive: true, force: true});
|
||||||
modInstallState = "installing";
|
modInstallState = "installing";
|
||||||
var zipPath = app.getPath("temp") + "/" + "loader.zip";
|
let zipPath = `${app.getPath("temp")}/loader.zip`;
|
||||||
if (!fs.existsSync(pluginFolder)) {
|
if (!fs.existsSync(pluginFolder)) {
|
||||||
fs.mkdirSync(pluginFolder);
|
fs.mkdirSync(pluginFolder);
|
||||||
console.log("[Mod loader] Created missing plugin folder");
|
console.log("[Mod loader] Created missing plugin folder");
|
||||||
}
|
}
|
||||||
var loaderZip = await fetch("https://armcord.xyz/loader.zip");
|
let loaderZip = await fetch("https://armcord.xyz/loader.zip");
|
||||||
if (!loaderZip.ok) throw new Error(`unexpected response ${loaderZip.statusText}`);
|
if (!loaderZip.ok) throw new Error(`unexpected response ${loaderZip.statusText}`);
|
||||||
await streamPipeline(loaderZip.body, fs.createWriteStream(zipPath));
|
await streamPipeline(loaderZip.body, fs.createWriteStream(zipPath));
|
||||||
await extract(zipPath, {dir: path.join(app.getPath("userData"), "plugins")});
|
await extract(zipPath, {dir: path.join(app.getPath("userData"), "plugins")});
|
||||||
|
|
|
@ -2,19 +2,19 @@
|
||||||
// I had to add most of the window creation code here to split both into seperete functions
|
// I had to add most of the window creation code here to split both into seperete functions
|
||||||
// WHY? Because I can't use the same code for both due to annoying bug with value `frame` not responding to variables
|
// WHY? Because I can't use the same code for both due to annoying bug with value `frame` not responding to variables
|
||||||
// I'm sorry for this mess but I'm not sure how to fix it.
|
// I'm sorry for this mess but I'm not sure how to fix it.
|
||||||
import {BrowserWindow, shell, app, dialog, nativeImage} from "electron";
|
import {BrowserWindow, app, dialog, nativeImage, shell} from "electron";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import {
|
import {
|
||||||
checkIfConfigIsBroken,
|
checkIfConfigIsBroken,
|
||||||
|
contentPath,
|
||||||
firstRun,
|
firstRun,
|
||||||
getConfig,
|
getConfig,
|
||||||
contentPath,
|
modInstallState,
|
||||||
setConfig,
|
setConfig,
|
||||||
setLang,
|
setLang,
|
||||||
setWindowState,
|
setWindowState,
|
||||||
transparency,
|
|
||||||
sleep,
|
sleep,
|
||||||
modInstallState
|
transparency
|
||||||
} from "./utils";
|
} from "./utils";
|
||||||
import {registerIpc} from "./ipc";
|
import {registerIpc} from "./ipc";
|
||||||
import {setMenu} from "./menu";
|
import {setMenu} from "./menu";
|
||||||
|
@ -26,13 +26,13 @@ import {iconPath} from "./main";
|
||||||
export let mainWindow: BrowserWindow;
|
export let mainWindow: BrowserWindow;
|
||||||
export let inviteWindow: BrowserWindow;
|
export let inviteWindow: BrowserWindow;
|
||||||
|
|
||||||
var osType = os.type();
|
let osType = os.type();
|
||||||
contextMenu({
|
contextMenu({
|
||||||
showSaveImageAs: true,
|
showSaveImageAs: true,
|
||||||
showCopyImageAddress: true,
|
showCopyImageAddress: true,
|
||||||
showSearchWithGoogle: false,
|
showSearchWithGoogle: false,
|
||||||
showSearchWithDuckDuckGo: false,
|
showSearchWithDuckDuckGo: false,
|
||||||
prepend: (defaultActions, parameters, browserWindow) => [
|
prepend: (_defaultActions, parameters) => [
|
||||||
{
|
{
|
||||||
label: "Search with Google",
|
label: "Search with Google",
|
||||||
// Only show it when right-clicking text
|
// Only show it when right-clicking text
|
||||||
|
@ -51,7 +51,7 @@ contextMenu({
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
async function doAfterDefiningTheWindow() {
|
async function doAfterDefiningTheWindow(): Promise<void> {
|
||||||
if (await getConfig("startMinimized")) {
|
if (await getConfig("startMinimized")) {
|
||||||
mainWindow.hide();
|
mainWindow.hide();
|
||||||
} else {
|
} else {
|
||||||
|
@ -66,7 +66,7 @@ async function doAfterDefiningTheWindow() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
var ignoreProtocolWarning = await getConfig("ignoreProtocolWarning");
|
let ignoreProtocolWarning = await getConfig("ignoreProtocolWarning");
|
||||||
await checkIfConfigIsBroken();
|
await checkIfConfigIsBroken();
|
||||||
registerIpc();
|
registerIpc();
|
||||||
if (await getConfig("mobileMode")) {
|
if (await getConfig("mobileMode")) {
|
||||||
|
@ -75,11 +75,11 @@ async function doAfterDefiningTheWindow() {
|
||||||
} else {
|
} else {
|
||||||
// A little sloppy but it works :p
|
// A little sloppy but it works :p
|
||||||
if (osType == "Windows_NT") {
|
if (osType == "Windows_NT") {
|
||||||
osType = "Windows " + os.release().split(".")[0] + " (" + os.release() + ")";
|
osType = `Windows ${os.release().split(".")[0]} (${os.release()})`;
|
||||||
}
|
}
|
||||||
mainWindow.webContents.userAgent = `Mozilla/5.0 (X11; ${osType} ${os.arch()}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36`; //fake useragent for screenshare to work
|
mainWindow.webContents.userAgent = `Mozilla/5.0 (X11; ${osType} ${os.arch()}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36`; //fake useragent for screenshare to work
|
||||||
}
|
}
|
||||||
app.on("second-instance", (event, commandLine, workingDirectory, additionalData) => {
|
app.on("second-instance", (_event, _commandLine, _workingDirectory, additionalData) => {
|
||||||
// Print out data received from the second instance.
|
// Print out data received from the second instance.
|
||||||
console.log(additionalData);
|
console.log(additionalData);
|
||||||
|
|
||||||
|
@ -102,37 +102,33 @@ async function doAfterDefiningTheWindow() {
|
||||||
return {action: "allow"};
|
return {action: "allow"};
|
||||||
if (url.startsWith("https:") || url.startsWith("http:") || url.startsWith("mailto:")) {
|
if (url.startsWith("https:") || url.startsWith("http:") || url.startsWith("mailto:")) {
|
||||||
shell.openExternal(url);
|
shell.openExternal(url);
|
||||||
|
} else if (ignoreProtocolWarning) {
|
||||||
|
shell.openExternal(url);
|
||||||
} else {
|
} else {
|
||||||
if (ignoreProtocolWarning) {
|
const options = {
|
||||||
shell.openExternal(url);
|
type: "question",
|
||||||
} else {
|
buttons: ["Yes, please", "No, I don't"],
|
||||||
const options = {
|
defaultId: 1,
|
||||||
type: "question",
|
title: url,
|
||||||
buttons: ["Yes, please", "No, I don't"],
|
message: `Do you want to open ${url}?`,
|
||||||
defaultId: 1,
|
detail: "This url was detected to not use normal browser protocols. It could mean that this url leads to a local program on your computer. Please check if you recognise it, before proceeding!",
|
||||||
title: url,
|
checkboxLabel: "Remember my answer and ignore this warning for future sessions",
|
||||||
message: `Do you want to open ${url}?`,
|
checkboxChecked: false
|
||||||
detail: "This url was detected to not use normal browser protocols. It could mean that this url leads to a local program on your computer. Please check if you recognise it, before proceeding!",
|
};
|
||||||
checkboxLabel: "Remember my answer and ignore this warning for future sessions",
|
|
||||||
checkboxChecked: false
|
|
||||||
};
|
|
||||||
|
|
||||||
dialog.showMessageBox(mainWindow, options).then(({response, checkboxChecked}) => {
|
dialog.showMessageBox(mainWindow, options).then(({response, checkboxChecked}) => {
|
||||||
console.log(response, checkboxChecked);
|
console.log(response, checkboxChecked);
|
||||||
if (checkboxChecked) {
|
if (checkboxChecked) {
|
||||||
if (response == 0) {
|
|
||||||
setConfig("ignoreProtocolWarning", true);
|
|
||||||
} else {
|
|
||||||
setConfig("ignoreProtocolWarning", false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (response == 0) {
|
if (response == 0) {
|
||||||
shell.openExternal(url);
|
setConfig("ignoreProtocolWarning", true);
|
||||||
} else {
|
} else {
|
||||||
return;
|
setConfig("ignoreProtocolWarning", false);
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
}
|
if (response == 0) {
|
||||||
|
shell.openExternal(url);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
return {action: "deny"};
|
return {action: "deny"};
|
||||||
});
|
});
|
||||||
|
@ -147,8 +143,8 @@ async function doAfterDefiningTheWindow() {
|
||||||
);
|
);
|
||||||
|
|
||||||
if ((await getConfig("trayIcon")) == "default" || (await getConfig("dynamicIcon"))) {
|
if ((await getConfig("trayIcon")) == "default" || (await getConfig("dynamicIcon"))) {
|
||||||
mainWindow.webContents.on("page-favicon-updated", async (event) => {
|
mainWindow.webContents.on("page-favicon-updated", async () => {
|
||||||
var faviconBase64 = await mainWindow.webContents.executeJavaScript(`
|
let faviconBase64 = await mainWindow.webContents.executeJavaScript(`
|
||||||
var getFavicon = function(){
|
var getFavicon = function(){
|
||||||
var favicon = undefined;
|
var favicon = undefined;
|
||||||
var nodeList = document.getElementsByTagName("link");
|
var nodeList = document.getElementsByTagName("link");
|
||||||
|
@ -163,7 +159,7 @@ async function doAfterDefiningTheWindow() {
|
||||||
}
|
}
|
||||||
getFavicon()
|
getFavicon()
|
||||||
`);
|
`);
|
||||||
var buf = new Buffer(faviconBase64.replace(/^data:image\/\w+;base64,/, ""), "base64");
|
let buf = Buffer.from(faviconBase64.replace(/^data:image\/\w+;base64,/, ""), "base64");
|
||||||
fs.writeFileSync(path.join(app.getPath("temp"), "/", "tray.png"), buf, "utf-8");
|
fs.writeFileSync(path.join(app.getPath("temp"), "/", "tray.png"), buf, "utf-8");
|
||||||
let trayPath = nativeImage.createFromPath(path.join(app.getPath("temp"), "/", "tray.png"));
|
let trayPath = nativeImage.createFromPath(path.join(app.getPath("temp"), "/", "tray.png"));
|
||||||
if (process.platform === "darwin" && trayPath.getSize().height > 22)
|
if (process.platform === "darwin" && trayPath.getSize().height > 22)
|
||||||
|
@ -178,7 +174,7 @@ async function doAfterDefiningTheWindow() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
const userDataPath = app.getPath("userData");
|
const userDataPath = app.getPath("userData");
|
||||||
const themesFolder = userDataPath + "/themes/";
|
const themesFolder = `${userDataPath}/themes/`;
|
||||||
if (!fs.existsSync(themesFolder)) {
|
if (!fs.existsSync(themesFolder)) {
|
||||||
fs.mkdirSync(themesFolder);
|
fs.mkdirSync(themesFolder);
|
||||||
console.log("Created missing theme folder");
|
console.log("Created missing theme folder");
|
||||||
|
@ -187,7 +183,7 @@ async function doAfterDefiningTheWindow() {
|
||||||
fs.readdirSync(themesFolder).forEach((file) => {
|
fs.readdirSync(themesFolder).forEach((file) => {
|
||||||
try {
|
try {
|
||||||
const manifest = fs.readFileSync(`${themesFolder}/${file}/manifest.json`, "utf8");
|
const manifest = fs.readFileSync(`${themesFolder}/${file}/manifest.json`, "utf8");
|
||||||
var themeFile = JSON.parse(manifest);
|
let themeFile = JSON.parse(manifest);
|
||||||
mainWindow.webContents.send(
|
mainWindow.webContents.send(
|
||||||
"themeLoader",
|
"themeLoader",
|
||||||
fs.readFileSync(`${themesFolder}/${file}/${themeFile.theme}`, "utf-8")
|
fs.readFileSync(`${themesFolder}/${file}/${themeFile.theme}`, "utf-8")
|
||||||
|
@ -202,8 +198,8 @@ async function doAfterDefiningTheWindow() {
|
||||||
mainWindow.on("close", async (e) => {
|
mainWindow.on("close", async (e) => {
|
||||||
let [width, height] = mainWindow.getSize();
|
let [width, height] = mainWindow.getSize();
|
||||||
await setWindowState({
|
await setWindowState({
|
||||||
width: width,
|
width,
|
||||||
height: height,
|
height,
|
||||||
isMaximized: mainWindow.isMaximized(),
|
isMaximized: mainWindow.isMaximized(),
|
||||||
x: mainWindow.getPosition()[0],
|
x: mainWindow.getPosition()[0],
|
||||||
y: mainWindow.getPosition()[1]
|
y: mainWindow.getPosition()[1]
|
||||||
|
@ -232,12 +228,11 @@ async function doAfterDefiningTheWindow() {
|
||||||
});
|
});
|
||||||
console.log(contentPath);
|
console.log(contentPath);
|
||||||
if ((await getConfig("inviteWebsocket")) == true) {
|
if ((await getConfig("inviteWebsocket")) == true) {
|
||||||
//@ts-ignore
|
|
||||||
require("arrpc");
|
require("arrpc");
|
||||||
//await startServer();
|
//await startServer();
|
||||||
}
|
}
|
||||||
if (firstRun) {
|
if (firstRun) {
|
||||||
await setLang(Intl.DateTimeFormat().resolvedOptions().locale);
|
await setLang(new Intl.DateTimeFormat().resolvedOptions().locale);
|
||||||
mainWindow.setSize(390, 470);
|
mainWindow.setSize(390, 470);
|
||||||
await mainWindow.loadFile(path.join(__dirname, "/content/setup.html"));
|
await mainWindow.loadFile(path.join(__dirname, "/content/setup.html"));
|
||||||
let trayPath = nativeImage.createFromPath(path.join(__dirname, "../", `/assets/ac_plug_colored.png`));
|
let trayPath = nativeImage.createFromPath(path.join(__dirname, "../", `/assets/ac_plug_colored.png`));
|
||||||
|
@ -245,6 +240,8 @@ async function doAfterDefiningTheWindow() {
|
||||||
if (process.platform === "win32" && trayPath.getSize().height > 32) trayPath = trayPath.resize({height: 32});
|
if (process.platform === "win32" && trayPath.getSize().height > 32) trayPath = trayPath.resize({height: 32});
|
||||||
tray.setImage(trayPath);
|
tray.setImage(trayPath);
|
||||||
} else if ((await getConfig("skipSplash")) == true) {
|
} else if ((await getConfig("skipSplash")) == true) {
|
||||||
|
// It's modified elsewhere.
|
||||||
|
// eslint-disable-next-line no-unmodified-loop-condition
|
||||||
while (modInstallState == "installing") {
|
while (modInstallState == "installing") {
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
}
|
}
|
||||||
|
@ -277,7 +274,7 @@ async function doAfterDefiningTheWindow() {
|
||||||
mainWindow.show();
|
mainWindow.show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
export function createCustomWindow() {
|
export function createCustomWindow(): void {
|
||||||
mainWindow = new BrowserWindow({
|
mainWindow = new BrowserWindow({
|
||||||
width: 300,
|
width: 300,
|
||||||
height: 350,
|
height: 350,
|
||||||
|
@ -296,7 +293,7 @@ export function createCustomWindow() {
|
||||||
});
|
});
|
||||||
doAfterDefiningTheWindow();
|
doAfterDefiningTheWindow();
|
||||||
}
|
}
|
||||||
export function createNativeWindow() {
|
export function createNativeWindow(): void {
|
||||||
mainWindow = new BrowserWindow({
|
mainWindow = new BrowserWindow({
|
||||||
width: 300,
|
width: 300,
|
||||||
height: 350,
|
height: 350,
|
||||||
|
@ -315,7 +312,7 @@ export function createNativeWindow() {
|
||||||
});
|
});
|
||||||
doAfterDefiningTheWindow();
|
doAfterDefiningTheWindow();
|
||||||
}
|
}
|
||||||
export function createTransparentWindow() {
|
export function createTransparentWindow(): void {
|
||||||
mainWindow = new BrowserWindow({
|
mainWindow = new BrowserWindow({
|
||||||
width: 300,
|
width: 300,
|
||||||
height: 350,
|
height: 350,
|
||||||
|
@ -334,7 +331,7 @@ export function createTransparentWindow() {
|
||||||
});
|
});
|
||||||
doAfterDefiningTheWindow();
|
doAfterDefiningTheWindow();
|
||||||
}
|
}
|
||||||
export function createInviteWindow(code: string) {
|
export function createInviteWindow(code: string): void {
|
||||||
inviteWindow = new BrowserWindow({
|
inviteWindow = new BrowserWindow({
|
||||||
width: 800,
|
width: 800,
|
||||||
height: 600,
|
height: 600,
|
||||||
|
@ -348,7 +345,7 @@ export function createInviteWindow(code: string) {
|
||||||
spellcheck: true
|
spellcheck: true
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
var formInviteURL = `https://discord.com/invite/${code}`;
|
let formInviteURL = `https://discord.com/invite/${code}`;
|
||||||
inviteWindow.webContents.session.webRequest.onBeforeRequest((details, callback) => {
|
inviteWindow.webContents.session.webRequest.onBeforeRequest((details, callback) => {
|
||||||
if (details.url.includes("ws://")) return callback({cancel: true});
|
if (details.url.includes("ws://")) return callback({cancel: true});
|
||||||
return callback({});
|
return callback({});
|
||||||
|
|
Loading…
Reference in a new issue