diff --git a/package-lock.json b/package-lock.json
index 6904b1a..a82d83c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
- "name": "ArmCord",
- "version": "3.1.0",
+ "name": "armcord",
+ "version": "3.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
- "name": "ArmCord",
- "version": "3.1.0",
+ "name": "armcord",
+ "version": "3.0.0",
"license": "OSL-3.0",
"dependencies": {
"electron-json-storage": "^4.5.0",
diff --git a/package.json b/package.json
index a856ce4..7d14046 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ArmCord",
- "version": "3.0.4",
+ "version": "3.0.3",
"description": "ArmCord is a custom client designed to enhance your Discord experience while keeping everything lightweight.",
"main": "ts-out/main.js",
"scripts": {
@@ -8,6 +8,7 @@
"watch": "tsc -w",
"start": "npm run build && electron ./ts-out/main.js",
"package": "npm run build && electron-builder"
+
},
"repository": {
"type": "git",
@@ -20,12 +21,12 @@
},
"homepage": "https://github.com/armcord/armcord#readme",
"devDependencies": {
+ "electron": "^16.0.7",
"@types/electron-json-storage": "^4.5.0",
"@types/node": "^14.18.2",
+ "typescript": "^4.5.4",
"copyfiles": "^2.4.1",
- "electron": "^16.0.7",
- "electron-builder": "^22.14.5",
- "typescript": "^4.5.4"
+ "electron-builder": "^22.14.5"
},
"dependencies": {
"electron-json-storage": "^4.5.0",
diff --git a/src/content/css/discord.css b/src/content/css/discord.css
index 2d3bdac..5d9fdfa 100644
--- a/src/content/css/discord.css
+++ b/src/content/css/discord.css
@@ -1,5 +1,5 @@
-.info-1sUqUG:last-child:before {
- content: "ArmCord Version: 3.1.0"!important;
+.info-1VyQPT:last-child:before {
+ content: "ArmCord Version: 3.0.0"!important;
height: auto;
line-height: 16px;
text-align: center;
diff --git a/src/content/settings.html b/src/content/settings.html
deleted file mode 100644
index 6fe5ab8..0000000
--- a/src/content/settings.html
+++ /dev/null
@@ -1 +0,0 @@
-
settings, really cool
\ No newline at end of file
diff --git a/src/content/setup.html b/src/content/setup.html
index f805f89..e83844a 100644
--- a/src/content/setup.html
+++ b/src/content/setup.html
@@ -42,10 +42,10 @@
} else {
console.log("Starting ArmCord Setup...");
document.getElementById("express").addEventListener("click", function () {
- window.armcordinternal.saveSettings(true, "stable", true, "cumcord");
+ window.armcord.saveSettings(true, "stable", true, "cumcord");
fade(document.getElementById("setup"));
setTimeout(function () {
- window.armcordinternal.restart()
+ window.armcord.restart()
}, 5000);
})
document.getElementById("full").addEventListener("click", function () {
@@ -90,18 +90,18 @@
.getElementById("next")
.addEventListener("click", function () {
var mod = document.getElementById("mod").value;
- window.armcordinternal.saveSettings(true, branch, true, mod);
+ window.armcord.saveSettings(true, branch, true, mod);
fade(document.getElementById("setup"));
setTimeout(function () {
- window.armcordinternal.restart();
+ window.armcord.restart();
}, 5000);
});
} else {
//saveSettings(customTitlebarSetting: boolean, channelSetting: string, armcordCSPSetting: boolean, modsSetting: string)
- window.armcordinternal.saveSettings(true, branch, true, "none");
+ window.armcord.saveSettings(true, branch, true, "none");
fade(document.getElementById("setup"));
setTimeout(function () {
- window.armcordinternal.restart()
+ window.armcord.restart()
}, 5000);
}
});
diff --git a/src/content/splash.html b/src/content/splash.html
index ba0327d..7c5c856 100644
--- a/src/content/splash.html
+++ b/src/content/splash.html
@@ -42,7 +42,7 @@
}
});
setTimeout(() => {
- window.armcordinternal.splashEnd();
+ window.armcord.splashEnd();
switch (window.armcord.channel) {
case "stable":
window.location.replace("https://discord.com/app");
diff --git a/src/ipc.ts b/src/ipc.ts
deleted file mode 100644
index 9b62ac0..0000000
--- a/src/ipc.ts
+++ /dev/null
@@ -1,70 +0,0 @@
-//ipc stuff
-import { app, ipcMain, shell, desktopCapturer } from "electron";
-import { mainWindow } from "./window";
-import { saveSettings, getVersion } from "./utils";
-import { settings, customTitlebar } from "./main";
-import { createSettingsWindow } from "./settings/main";
-export function registerIpc() {
- ipcMain.on("get-app-path", (event, arg) => {
- event.reply("app-path", app.getAppPath());
- });
- ipcMain.on("open-external-link", (event, href: string) => {
- shell.openExternal(href);
- });
- ipcMain.on("win-maximize", (event, arg) => {
- mainWindow.maximize();
- });
- ipcMain.on("win-isMaximized", (event, arg) => {
- event.returnValue = mainWindow.isMaximized();
- });
- ipcMain.on("win-minimize", (event, arg) => {
- mainWindow.minimize();
- });
- ipcMain.on("win-unmaximize", (event, arg) => {
- mainWindow.unmaximize();
- });
- ipcMain.on("win-show", (event, arg) => {
- mainWindow.show();
- });
- ipcMain.on("win-hide", (event, arg) => {
- mainWindow.hide();
- });
- ipcMain.on("get-app-version", (event) => {
- event.returnValue = getVersion();
- });
- ipcMain.on("splashEnd", (event, arg) => {
- mainWindow.setSize(800, 600);
- });
- ipcMain.on("restart", (event, arg) => {
- app.relaunch();
- app.exit();
- });
-
- ipcMain.on("saveSettings", (event, ...args) => {
- //@ts-ignore
- saveSettings(...args);
- });
- ipcMain.on("channel", (event) => {
- event.returnValue = settings.channel;
- });
- ipcMain.on("clientmod", (event, arg) => {
- event.returnValue = settings.mods;
- });
- ipcMain.on("titlebar", (event, arg) => {
- event.returnValue = customTitlebar;
- });
- ipcMain.on("openSettingsWindow", (event, arg) => {
- createSettingsWindow();
- });
- ipcMain.on("setting-armcordCSP", (event) => {
- if (settings.armcordCSP) {
- event.returnValue = true;
- } else {
- event.returnValue = false;
- }
- });
- ipcMain.handle("DESKTOP_CAPTURER_GET_SOURCES", (event, opts) =>
- desktopCapturer.getSources(opts)
- );
-
-}
diff --git a/src/main.ts b/src/main.ts
index de8e4db..16730e9 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -2,21 +2,24 @@
import {
app,
BrowserWindow,
+ ipcMain,
+ shell,
+ desktopCapturer,
session,
} from "electron";
import * as path from "path";
import "v8-compile-cache";
import * as storage from "electron-json-storage";
-import { getConfigUnsafe, setup } from "./utils";
+import { saveSettings, getVersion, setup, getConfigUnsafe } from "./utils";
import "./extensions/mods";
import "./extensions/plugin";
import "./tray";
-import { mainWindow, createCustomWindow, createNativeWindow } from "./window";
import "./shortcuts";
-export var contentPath: string;
+var contentPath: string;
var channel: string;
-export var settings: any;
-export var customTitlebar: boolean;
+export var mainWindow: BrowserWindow;
+var settings: any;
+
storage.has("settings", function (error, hasKey) {
if (error) throw error;
@@ -24,41 +27,119 @@ storage.has("settings", function (error, hasKey) {
console.log("First run of the ArmCord. Starting setup.");
setup();
contentPath = path.join(__dirname, "/content/setup.html");
- if (!contentPath.includes("ts-out")) {
- contentPath = path.join(__dirname, "/ts-out/content/setup.html");
- }
+ if(!contentPath.includes("ts-out")) {
+ contentPath = path.join(__dirname,"/ts-out/content/setup.html");
+ }
} else {
console.log("ArmCord has been run before. Skipping setup.");
- contentPath = path.join(__dirname, "/content/splash.html");
- if (!contentPath.includes("ts-out")) {
- contentPath = path.join(__dirname, "/ts-out/content/splash.html");
- }
+ contentPath = path.join(__dirname,"/content/splash.html");
+ if(!contentPath.includes("ts-out")) {
+ contentPath = path.join(__dirname,"/ts-out/content/splash.html");
}
-});
+}});
storage.get("settings", function (error, data: any) {
if (error) throw error;
console.log(data);
channel = data.channel;
settings = data;
+
});
-app.whenReady().then(async () => {
- if (await getConfigUnsafe("customTitlebar") == true) {
- console.log("Creating custom titlebar window.");
- customTitlebar = true;
- createCustomWindow();
- } else if (await getConfigUnsafe("customTitlebar") == "setup") {
- //rare case of setup window
- console.log("Creating setup window.");
- customTitlebar = true;
- createCustomWindow();
- } else {
- console.log("Creating native titlebar window.");
- customTitlebar = false;
- createNativeWindow();
+var titlebar:any = getConfigUnsafe("customTitlebar")
+console.log(!titlebar)
+function createWindow() {
+ mainWindow = new BrowserWindow({
+ width: 300,
+ height: 350,
+ title: "ArmCord",
+ darkTheme: true,
+ icon: path.join(__dirname, "/assets/icon_transparent.png"),
+ frame: !titlebar,
+ autoHideMenuBar: true,
+ webPreferences: {
+ preload: path.join(__dirname, "preload/preload.js"),
+ },
+ });
+ ipcMain.on("get-app-path", (event, arg) => {
+ event.reply("app-path", app.getAppPath());
+ });
+ ipcMain.on("open-external-link", (event, href: string) => {
+ shell.openExternal(href);
+ });
+ ipcMain.on("win-maximize", (event, arg) => {
+ mainWindow.maximize();
+ });
+ ipcMain.on("win-isMaximized", (event, arg) => {
+ event.returnValue = mainWindow.isMaximized();
+ });
+ ipcMain.on("win-minimize", (event, arg) => {
+ mainWindow.minimize();
+ });
+ ipcMain.on("win-unmaximize", (event, arg) => {
+ mainWindow.unmaximize();
+ });
+ ipcMain.on("win-show", (event, arg) => {
+ mainWindow.show();
+ });
+ ipcMain.on("win-hide", (event, arg) => {
+ mainWindow.hide();
+ });
+ ipcMain.on("get-app-version", (event) => {
+ event.returnValue = getVersion();
+ });
+ ipcMain.on("splashEnd", (event, arg) => {
+ mainWindow.setSize(800, 600);
+ });
+ ipcMain.on("restart", (event, arg) => {
+ app.relaunch();
+ app.exit();
+ });
+
+ ipcMain.on("saveSettings", (event, ...args) => {
+ //@ts-ignore
+ saveSettings(...args);
+ });
+ ipcMain.on("channel", (event) => {
+ event.returnValue = channel;
+ });
+ ipcMain.on("clientmod", (event, arg) => {
+ event.returnValue = settings.mods;
+ });
+
+ ipcMain.on("setting-armcordCSP", (event) => {
+ storage.get("settings", function (error, data: any) {
+ if (error) throw error;
+ if (data.armcordCSP) {
+ event.returnValue = true;
+ } else {
+ event.returnValue = false;
+ }
+ });
+ });
+ ipcMain.handle("DESKTOP_CAPTURER_GET_SOURCES", (event, opts) =>
+ desktopCapturer.getSources(opts)
+ );
+ mainWindow.webContents.userAgent =
+ "Mozilla/5.0 (X11; Linux x86) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"; //fake useragent for screenshare to work
+ mainWindow.webContents.setWindowOpenHandler(({ url }) => {
+ shell.openExternal(url);
+ return { action: "deny" };
+ });
+ console.log(contentPath)
+ try {
+ mainWindow.loadFile(contentPath);
+ } catch(e) {
+ console.log("Major error detected while starting up. User is most likely on Windows platform. Fallback to alternative startup.")
+ mainWindow.loadURL(`file://${__dirname}/ts-out/content/splash.html`);
}
+}
+
+app.whenReady().then(() => {
+ createWindow();
session
.fromPartition("some-partition")
.setPermissionRequestHandler((webContents, permission, callback) => {
+ const url = webContents.getURL(); //unused?
+
if (permission === "notifications") {
// Approves the permissions request
callback(true);
@@ -67,21 +148,21 @@ app.whenReady().then(async () => {
// Approves the permissions request
callback(true);
}
- });
- mainWindow.webContents.session.webRequest.onBeforeRequest(
- (details, callback) => {
- if (/api\/v\d\/science$/g.test(details.url))
- return callback({ cancel: true });
- return callback({});
- }
- );
- app.on("activate", function () {
- if (BrowserWindow.getAllWindows().length === 0)
- if (!settings.customTitlebar) {
- createNativeWindow();
- } else {
- createCustomWindow();
+ if (url.startsWith("discord://")) {
+ // Denies the permissions request
+ return callback(false);
}
+ if (url.startsWith("discord.com/science")) {
+ // Denies the permissions request
+ return callback(false);
+ }
+ if (url.startsWith("discord.com/tracing")) {
+ // Denies the permissions request
+ return callback(false);
+ }
+ });
+ app.on("activate", function () {
+ if (BrowserWindow.getAllWindows().length === 0) createWindow();
});
});
diff --git a/src/preload/bridge.ts b/src/preload/bridge.ts
index c65300f..5916881 100644
--- a/src/preload/bridge.ts
+++ b/src/preload/bridge.ts
@@ -11,22 +11,24 @@ contextBridge.exposeInMainWorld("armcord", {
},
titlebar: {
injectTitlebar: () => injectTitlebar(),
- isTitlebar: ipcRenderer.sendSync("titlebar"),
},
electron: process.versions.electron,
channel: ipcRenderer.sendSync("channel"),
version: ipcRenderer.sendSync("get-app-version", "app-version"),
getDisplayMediaSelector: getDisplayMediaSelector,
- openSettingsWindow: () => ipcRenderer.send("openSettingsWindow"),
+ restart: () => ipcRenderer.send("restart"),
+ saveSettings: (...args: any) => ipcRenderer.send("saveSettings", ...args),
+ splashEnd: () => ipcRenderer.send("splashEnd"),
});
-//to be only used inside armcord internal setup/splash etc
-if (
- window.location.href.indexOf("splash.html") > -1 ||
- window.location.href.indexOf("setup.html") > -1
-) {
- contextBridge.exposeInMainWorld("armcordinternal", {
- restart: () => ipcRenderer.send("restart"),
- saveSettings: (...args: any) => ipcRenderer.send("saveSettings", ...args),
- splashEnd: () => ipcRenderer.send("splashEnd"),
- });
-}
\ No newline at end of file
+contextBridge.exposeInMainWorld("electron", {
+ //deprecated, used for legacy purposes, will be removed in future versions
+ window: {
+ show: () => ipcRenderer.send("win-show"),
+ hide: () => ipcRenderer.send("win-hide"),
+ minimize: () => ipcRenderer.send("win-minimize"),
+ maximize: () => ipcRenderer.send("win-maximize"),
+ },
+ electron: process.versions.electron,
+ warning: 'This is a deprecated API and will be removed in future versions (3.0.0 --> 3.1.0).',
+ version: ipcRenderer.sendSync("get-app-version", "app-version"),
+});
diff --git a/src/preload/preload.ts b/src/preload/preload.ts
index ceea49a..3551d62 100644
--- a/src/preload/preload.ts
+++ b/src/preload/preload.ts
@@ -6,11 +6,6 @@ import { injectTitlebar } from "./titlebar";
import { sleep, addStyle } from "../utils";
import { ipcRenderer } from "electron";
-declare global {
- interface Window {
- armcord: any;
- }
-}
const clientMods = {
goosemod: "https://api.goosemod.com/inject.js",
cumcord:
@@ -31,9 +26,7 @@ console.log("ArmCord");
if (window.location.href.indexOf("splash.html") > -1) {
console.log("Skipping titlebar injection and client mod injection.");
} else {
- if (ipcRenderer.sendSync("titlebar")) {
- injectTitlebar();
- }
+ injectTitlebar();
sleep(5000).then(() => {
const cssPath = path.join(__dirname, "../", "/content/css/discord.css");
addStyle(fs.readFileSync(cssPath, "utf8"));
diff --git a/src/settings/main.ts b/src/settings/main.ts
deleted file mode 100644
index 3c503b0..0000000
--- a/src/settings/main.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { BrowserWindow, shell } from "electron";
-import path from "path";
-
-var settingsWindow;
-export function createSettingsWindow() {
- settingsWindow = new BrowserWindow({
- width: 500,
- height: 600,
- title: "ArmCord Settings",
- darkTheme: true,
- icon: path.join(__dirname, "/assets/icon_transparent.png"),
- frame: false,
- autoHideMenuBar: true,
- webPreferences: {
- preload: path.join(__dirname, "preload/preload.js"),
- },
- });
-
- settingsWindow.webContents.setWindowOpenHandler(({ url }) => {
- shell.openExternal(url);
- return { action: "deny" };
- });
-
- settingsWindow.loadFile("settings.html");
-}
diff --git a/src/settings/preload.ts b/src/settings/preload.ts
deleted file mode 100644
index d8ec246..0000000
--- a/src/settings/preload.ts
+++ /dev/null
@@ -1 +0,0 @@
-console.log("test")
\ No newline at end of file
diff --git a/src/shortcuts.ts b/src/shortcuts.ts
index 74221bd..6cf522e 100644
--- a/src/shortcuts.ts
+++ b/src/shortcuts.ts
@@ -1,18 +1,35 @@
-import { app } from "electron";
-import {mainWindow} from './window';
-//https://github.com/electron/electron/issues/1334#issuecomment-716080005
-// TO-DO add more
-app.on("web-contents-created", (webContentsCreatedEvent, webContents) => {
- webContents.on("before-input-event", (beforeInputEvent, input) => {
- // console.log('Main console::', input)
- const { code, alt, control, shift, meta } = input;
- // Shortcut: toggle devTools
- if (shift && control && !alt && !meta && code === "KeyI") {
- mainWindow.webContents.toggleDevTools();
- }
- // Shortcut: window reload
- if (shift && control && !alt && !meta && code === "KeyR") {
- mainWindow.reload();
- }
- });
-});
+
+import { Menu, MenuItem } from "electron";
+import { mainWindow } from "./main";
+const menu = new Menu();
+menu.append(
+ new MenuItem({
+ label: "ArmCord" + process.env.npm_package_version,
+ submenu: [
+ {
+ role: "toggleDevTools",
+ accelerator:
+ process.platform === "darwin" ? "Ctrl+Cmd+I" : "Ctrl+Shift+I",
+ click: () => {
+ mainWindow.webContents.toggleDevTools();
+ },
+ },
+ {
+ role: "toggleDevTools",
+ accelerator: "F12",
+ click: () => {
+ mainWindow.webContents.toggleDevTools();
+ },
+ },
+ {
+ role: "reload",
+ accelerator:
+ "Ctrl+F5",
+ click: () => {
+ mainWindow.webContents.reload();
+ },
+ },
+ ],
+ })
+);
+Menu.setApplicationMenu(menu);
\ No newline at end of file
diff --git a/src/tray.ts b/src/tray.ts
index f6de5af..8bd4057 100644
--- a/src/tray.ts
+++ b/src/tray.ts
@@ -1,5 +1,5 @@
import { app, Menu, Tray } from 'electron';
-import {mainWindow} from './window';
+import {mainWindow} from './main';
import * as path from 'path'
let tray = null
app.whenReady().then(() => {
diff --git a/src/utils.ts b/src/utils.ts
index 778284e..902a2d1 100644
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -1,8 +1,6 @@
import * as storage from "electron-json-storage";
import * as fs from "fs";
import { app } from "electron";
-import path from "path";
-export var firstRun: boolean;
//utillity 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) {
@@ -23,9 +21,9 @@ export function setup() {
{
customTitlebar: true,
channel: "stable",
- doneSetup: true,
+ firstRun: "done",
armcordCSP: true,
- mods: "cumcord",
+ mods: "cumcord"
},
function (error) {
if (error) throw error;
@@ -47,7 +45,7 @@ export function saveSettings(
{
customTitlebar: customTitlebarSetting,
channel: channelSetting,
- doneSetup: true,
+ firstRun: "done",
armcordCSP: armcordCSPSetting,
mods: modsSetting,
},
@@ -57,20 +55,15 @@ export function saveSettings(
);
}
export async function getConfigUnsafe(object: string) {
- try {
- const userDataPath = app.getPath("userData");
- const storagePath = path.join(userDataPath, "/storage/");
- let rawdata = fs.readFileSync(storagePath + "settings.json", "utf-8");
- let returndata = JSON.parse(rawdata);
- console.log(returndata[object]);
- return returndata[object];
- } catch (e) {
- console.log("Config probably doesn't exist yet. Returning setup value.");
- firstRun = true;
- return "setup";
- }
+ const userDataPath = app.getPath("userData");
+ const storagePath = userDataPath + "/storage/";
+ let rawdata = fs.readFileSync(storagePath + "settings.json", "utf-8");
+ let returndata = JSON.parse(rawdata);
+ console.log(returndata[object]);
+ return returndata[object]
}
export function getVersion() {
//to-do better way of doing this
- return "3.1.0";
+ return '3.0.1';
}
+
\ No newline at end of file
diff --git a/src/window.ts b/src/window.ts
deleted file mode 100644
index 13a60fa..0000000
--- a/src/window.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-// To allow seamless switching between custom titlebar and native os titlebar,
-// 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
-// I'm sorry for this mess but I'm not sure how to fix it.
-import { BrowserWindow, shell } from "electron";
-import path from "path";
-import { contentPath } from "./main";
-import { firstRun } from "./utils";
-import { registerIpc } from "./ipc";
-export let mainWindow: BrowserWindow;
-
-function doAfterDefiningTheWindow() {
- registerIpc();
- mainWindow.webContents.userAgent =
- "Mozilla/5.0 (X11; Linux x86) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"; //fake useragent for screenshare to work
- mainWindow.webContents.setWindowOpenHandler(({ url }) => {
- shell.openExternal(url);
- return { action: "deny" };
- });
-
- console.log(contentPath);
- try {
- mainWindow.loadFile(contentPath);
- } catch (e) {
- console.log(
- "Major error detected while starting up. User is most likely on Windows platform. Fallback to alternative startup."
- );
- console.log(process.platform);
- if (process.platform === "win32") {
- if (firstRun) {
- mainWindow.loadURL(`file://${__dirname}/content/setup.html`);
- } else {
- mainWindow.loadURL(`file://${__dirname}/content/splash.html`);
- }
- } else {
- if (firstRun) {
- mainWindow.loadURL(`file://${__dirname}/ts-out/content/setup.html`);
- } else {
- mainWindow.loadURL(`file://${__dirname}/ts-out/content/splash.html`);
- }
- }
- }
-}
-export function createCustomWindow() {
- mainWindow = new BrowserWindow({
- width: 300,
- height: 350,
- title: "ArmCord",
- darkTheme: true,
- icon: path.join(__dirname, "/assets/icon_transparent.png"),
- frame: false,
- autoHideMenuBar: true,
- webPreferences: {
- preload: path.join(__dirname, "preload/preload.js"),
- },
- });
- doAfterDefiningTheWindow();
-}
-export function createNativeWindow() {
- mainWindow = new BrowserWindow({
- width: 300,
- height: 350,
- title: "ArmCord",
- darkTheme: true,
- icon: path.join(__dirname, "/assets/icon_transparent.png"),
- frame: true,
- autoHideMenuBar: true,
- webPreferences: {
- preload: path.join(__dirname, "preload/preload.js"),
- },
- });
- doAfterDefiningTheWindow();
-}