mirror of
https://github.com/smartfrigde/armcord.git
synced 2024-08-14 23:56:58 +00:00
Getting ready for 3.0
This commit is contained in:
parent
521278cf00
commit
1debbe60fe
14 changed files with 4036 additions and 154 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -1,3 +1,5 @@
|
|||
node_modules
|
||||
out/
|
||||
dist
|
||||
dist
|
||||
ts-out/
|
||||
ts-out
|
34
README.md
34
README.md
|
@ -1,37 +1,43 @@
|
|||
### THIS IS EXPERIMENTAL REWRITE CODE
|
||||
|
||||
<h1 align="center">
|
||||
<img src="https://armcord.vercel.app/armcord_full_logo.png" width="720">
|
||||
</h1>
|
||||
|
||||
ArmCord is a custom alternative Discord client made for people on lower-end devices and ARM architecture that want custom Discord experience. It uses [Cumcord](https://cumcord.com) for custom themes and plugins!
|
||||
ArmCord is a custom client designed to enhance your Discord experience while keeping everything lightweight.
|
||||
|
||||
# Features
|
||||
|
||||
* **Standalone client** - ArmCord is built as standalone client, it doesn't rely on original Discord client.
|
||||
* **Various mods built in** - Explore Cumcord/GooseMod/Flicker plugins and their features!
|
||||
* **Made for Privacy** - ArmCord automatically blocks Discord's trackers.
|
||||
* **Faster than normal Discord app** - ArmCord is using newer Electron than stock Discord app. This usually means increased performance and more stable experience.
|
||||
* **Designed to work anywhere** - ArmCord was initially created in mind to run on Arm64 Linux devices. We soon expanded our support to more platforms. We plan to support every platform that [Electron supports](https://www.electronjs.org/docs/latest/tutorial/support#supported-platforms).
|
||||
# How to run/install it?
|
||||
Check releases tab for precompiled packages for Linux, Windows and Mac OS (experimental).
|
||||
Alternatively you can run ArmCord from source (npm, nodejs required):
|
||||
1.Run `npm install`
|
||||
2.Run `npm start`
|
||||
3.Compile/Package with `npm run make`
|
||||
### Recommended:
|
||||
Check releases tab for precompiled packages for Linux, Windows and Mac OS (experimental).
|
||||
### Manual:
|
||||
Alternatively you can run ArmCord from source (npm, nodejs required):
|
||||
1.Clone ArmCord repo: `git clonehttps://github.com/ArmCord/ArmCord.git`
|
||||
2.Run `npm install` to install dependencies
|
||||
3.Compile/Package with `npm run package`
|
||||
|
||||
|
||||
# FAQ
|
||||
## 1.Will I get banned from using it?
|
||||
|
||||
-You are breaking Discord ToS since we are using Cumcord for themes and plugins. But no one ever got banned from using ArmCord or Cumcord. If you wish to remove Cumcord, you can find it in your mods folder.
|
||||
-You are breaking Discord ToS if you decided to use client mods. But no one ever got banned from using ArmCord or any of the client mods included. If you wish to remove mods, check our documentation.
|
||||
## 2.How does this work?
|
||||
|
||||
-We are using official web app and adding Cumcord it with some other tweaks.
|
||||
-We are using official web app and adding some magic powder to make it all work!
|
||||
## 3.Can I use this on other architectures or operating systems?
|
||||
|
||||
-Yes! ArmCord should work normally under Windows, ~~Mac OS~~ (Mac OS is broken see [#48](https://github.com/ArmCord/ArmCord/issues/48)), Linux as long as it has NodeJS, npm and Electron support.
|
||||
## 4.Code is big spaghetti.
|
||||
|
||||
-I'm aware. I'm slowly rewriting everything.
|
||||
|
||||
# Credits
|
||||
[ArmCord UI Elements and few features](https://github.com/kckarnige)
|
||||
[Cumcord](https://github.com/Cumcord/Cumcord)
|
||||
[GooseMod](https://github.com/GooseMod/GooseMod)
|
||||
[GooseMod Extension](https://github.com/GooseMod/extension)
|
||||
[electron-discord-webapp](https://github.com/SpacingBat3/electron-discord-webapp)
|
||||
[custom-electron-titlebar](https://github.com/AlexTorresSk/custom-electron-titlebar)
|
||||
[electron-localshortcut](https://github.com/parro-it/electron-localshortcut)
|
||||
[custom-electron-titlebar (css only)](https://github.com/AlexTorresSk/custom-electron-titlebar)
|
||||
[electron-builder](https://electron.build)
|
||||
|
|
BIN
build/icon.png
Normal file
BIN
build/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 81 KiB |
3916
package-lock.json
generated
3916
package-lock.json
generated
File diff suppressed because it is too large
Load diff
42
package.json
42
package.json
|
@ -1,13 +1,14 @@
|
|||
{
|
||||
"name": "armcord",
|
||||
"version": "3.0.0",
|
||||
"name": "ArmCord",
|
||||
"version": "2.9.9",
|
||||
"description": "ArmCord is a custom client designed to enhance your Discord experience while keeping everything lightweight.",
|
||||
"main": "dist/main.js",
|
||||
"main": "ts-out/main.js",
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"watch": "tsc -w",
|
||||
"start": "npm run build && npm run copy-files && electron ./dist/main.js",
|
||||
"copy-files": "copyfiles -u 1 src/**/*.html src/**/*.css dist/ && copyfiles package.json dist/ && copyfiles assets/** dist/"
|
||||
"start": "npm run build && npm run copy-files && electron ./ts-out/main.js",
|
||||
"package": "npm run build && npm run copy-files && electron-builder",
|
||||
"copy-files": "copyfiles -u 1 src/**/*.html src/**/*.css ts-out/ && copyfiles package.json ts-out/ && copyfiles assets/** ts-out/"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
@ -20,15 +21,32 @@
|
|||
},
|
||||
"homepage": "https://github.com/armcord/armcord#readme",
|
||||
"devDependencies": {
|
||||
"electron": "^16.0.7"
|
||||
},
|
||||
"dependencies": {
|
||||
"electron": "^16.0.7",
|
||||
"@types/electron-json-storage": "^4.5.0",
|
||||
"@types/node": "^14.18.2",
|
||||
"copyfiles": "^2.4.1",
|
||||
"electron-json-storage": "^4.5.0",
|
||||
"typescript": "^4.5.4",
|
||||
"v8-compile-cache": "^2.3.0",
|
||||
"ws": "^8.4.0"
|
||||
"copyfiles": "^2.4.1",
|
||||
"electron-builder": "^22.14.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"electron-json-storage": "^4.5.0",
|
||||
"v8-compile-cache": "^2.3.0"
|
||||
},
|
||||
"build": {
|
||||
"appId": "com.smartfridge.armcord",
|
||||
"productName": "ArmCord",
|
||||
"mac": {
|
||||
"category": "Network"
|
||||
},
|
||||
"linux": {
|
||||
"category": "Network",
|
||||
"maintainer": "smartfrigde@gmail.com",
|
||||
"target": [
|
||||
"deb",
|
||||
"tar.gz",
|
||||
"rpm",
|
||||
"AppImage"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,6 @@
|
|||
font-size: 12px;
|
||||
text-transform: none;
|
||||
}
|
||||
.notice-3bPHh-.colorDefault-22HBa0 {
|
||||
display: none;
|
||||
.notice-2HEN-u {
|
||||
display: none;
|
||||
}
|
|
@ -22,24 +22,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<script>
|
||||
function discord() {
|
||||
switch (window.armcord.channel) {
|
||||
case "stable":
|
||||
window.location.href = "https://discord.com/app";
|
||||
break;
|
||||
case "canary":
|
||||
window.location.href = "https://canary.discord.com/app";
|
||||
break;
|
||||
case "ptb":
|
||||
window.location.href = "https://ptb.discord.com/app";
|
||||
break;
|
||||
case "foss":
|
||||
window.location.href = "https://dev.fosscord.com/app";
|
||||
break;
|
||||
default:
|
||||
window.location.href = "https://discord.com/app";
|
||||
}
|
||||
}
|
||||
|
||||
function fade(element) {
|
||||
var op = 1; // initial opacity
|
||||
var timer = setInterval(function () {
|
||||
|
@ -58,6 +41,13 @@
|
|||
"You appear to be offline. Please connect to the internet and restart ArmCord Setup.";
|
||||
} else {
|
||||
console.log("Starting ArmCord Setup...");
|
||||
document.getElementById("express").addEventListener("click", function () {
|
||||
window.armcord.saveSettings(true, "stable", true, "cumcord");
|
||||
fade(document.getElementById("setup"));
|
||||
setTimeout(function () {
|
||||
window.armcord.restart()
|
||||
}, 5000);
|
||||
})
|
||||
document.getElementById("full").addEventListener("click", function () {
|
||||
document.getElementById("setup").innerHTML = `
|
||||
<p class="text-center setup-ask">Choose your Discord channel/instance:</p>
|
||||
|
@ -103,8 +93,7 @@
|
|||
window.armcord.saveSettings(true, branch, true, mod);
|
||||
fade(document.getElementById("setup"));
|
||||
setTimeout(function () {
|
||||
window.armcord.splashEnd();
|
||||
discord();
|
||||
window.armcord.restart();
|
||||
}, 5000);
|
||||
});
|
||||
} else {
|
||||
|
@ -112,8 +101,7 @@
|
|||
window.armcord.saveSettings(true, branch, true, "none");
|
||||
fade(document.getElementById("setup"));
|
||||
setTimeout(function () {
|
||||
window.armcord.splashEnd();
|
||||
discord();
|
||||
window.armcord.restart()
|
||||
}, 5000);
|
||||
}
|
||||
});
|
||||
|
|
49
src/main.ts
49
src/main.ts
|
@ -1,31 +1,26 @@
|
|||
// Modules to control application life and create native browser window
|
||||
import { app, BrowserWindow, ipcMain, shell, desktopCapturer } from "electron";
|
||||
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 { saveSettings } from "./utils";
|
||||
import { saveSettings, getVersion, setup } from "./utils";
|
||||
import "./extensions/mods";
|
||||
import "./extensions/plugin";
|
||||
import "./tray";
|
||||
import "./shortcuts";
|
||||
var contentPath: string = "null";
|
||||
var frame: boolean;
|
||||
var channel: string;
|
||||
var titlebar: boolean;
|
||||
export var mainWindow: BrowserWindow;
|
||||
var settings:any;
|
||||
storage.keys(function (error, keys) {
|
||||
if (error) throw error;
|
||||
var settings: any;
|
||||
|
||||
for (var key of keys) {
|
||||
console.log("There is a key called: " + key);
|
||||
}
|
||||
});
|
||||
storage.has("settings", function (error, hasKey) {
|
||||
if (error) throw error;
|
||||
|
||||
if (!hasKey) {
|
||||
console.log("First run of the ArmCord. Starting setup.");
|
||||
// setup(); will be done at setup
|
||||
setup();
|
||||
contentPath = __dirname + "/content/setup.html";
|
||||
} else {
|
||||
console.log("ArmCord has been run before. Skipping setup.");
|
||||
|
@ -80,17 +75,22 @@ function createWindow() {
|
|||
mainWindow.hide();
|
||||
});
|
||||
ipcMain.on("get-app-version", (event) => {
|
||||
event.returnValue = process.env.npm_package_version;
|
||||
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) => {
|
||||
|
@ -122,7 +122,32 @@ function createWindow() {
|
|||
|
||||
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);
|
||||
}
|
||||
if (permission === "media") {
|
||||
// Approves the permissions request
|
||||
callback(true);
|
||||
}
|
||||
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();
|
||||
});
|
||||
|
|
|
@ -10,12 +10,12 @@ contextBridge.exposeInMainWorld("armcord", {
|
|||
maximize: () => ipcRenderer.send("win-maximize"),
|
||||
},
|
||||
electron: process.versions.electron,
|
||||
channel: ipcRenderer.sendSync('channel'),
|
||||
channel: ipcRenderer.sendSync("channel"),
|
||||
version: ipcRenderer.sendSync("get-app-version", "app-version"),
|
||||
getDisplayMediaSelector: getDisplayMediaSelector,
|
||||
restart: () => ipcRenderer.send("restart"),
|
||||
saveSettings: (...args: any) => ipcRenderer.send("saveSettings", ...args),
|
||||
splashEnd: () => ipcRenderer.send("splashEnd"),
|
||||
loadDiscord: () => ipcRenderer.send("loadDiscord"),
|
||||
});
|
||||
contextBridge.exposeInMainWorld("electron", {
|
||||
//deprecated, used for legacy purposes, will be removed in future versions
|
||||
|
|
35
src/shortcuts.ts
Normal file
35
src/shortcuts.ts
Normal file
|
@ -0,0 +1,35 @@
|
|||
|
||||
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);
|
|
@ -1,4 +1,4 @@
|
|||
import { app, Menu, Tray, ipcRenderer } from 'electron';
|
||||
import { app, Menu, Tray } from 'electron';
|
||||
import {mainWindow} from './main';
|
||||
let tray = null
|
||||
app.whenReady().then(() => {
|
||||
|
@ -24,6 +24,7 @@ app.whenReady().then(() => {
|
|||
},
|
||||
},
|
||||
]);
|
||||
|
||||
tray.setToolTip('ArmCord' + process.env.npm_package_version)
|
||||
tray.setContextMenu(contextMenu)
|
||||
})
|
65
src/utils.ts
65
src/utils.ts
|
@ -1,29 +1,58 @@
|
|||
|
||||
import * as storage from 'electron-json-storage';
|
||||
import * as fs from "fs";
|
||||
import * as storage from "electron-json-storage";
|
||||
//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) {
|
||||
const style = document.createElement('style');
|
||||
style.textContent = styleString;
|
||||
document.head.append(style);
|
||||
};
|
||||
const style = document.createElement("style");
|
||||
style.textContent = styleString;
|
||||
document.head.append(style);
|
||||
}
|
||||
|
||||
export function addScript(scriptString: string) {
|
||||
var script = document.createElement("script");
|
||||
script.textContent = scriptString;
|
||||
document.body.append(script);
|
||||
};
|
||||
export function setup(){
|
||||
console.log("Setting up ArmCord settings.");
|
||||
storage.set('settings', { customTitlebar: true, channel: 'stable', firstRun: 'done', armcordCSP: true }, function(error) {
|
||||
if (error) throw error;
|
||||
});
|
||||
}
|
||||
export async function sleep(ms:number) {
|
||||
return new Promise(resolve => setTimeout(resolve, ms));
|
||||
}
|
||||
export function saveSettings(customTitlebarSetting: boolean, channelSetting: string, armcordCSPSetting: boolean, modsSetting: string) {
|
||||
export function setup() {
|
||||
console.log("Setting up ArmCord settings.");
|
||||
storage.set('settings', { customTitlebar: customTitlebarSetting, channel: channelSetting, firstRun: 'done', armcordCSP: armcordCSPSetting, mods: modsSetting }, function(error) {
|
||||
storage.set(
|
||||
"settings",
|
||||
{
|
||||
customTitlebar: true,
|
||||
channel: "stable",
|
||||
firstRun: "done",
|
||||
armcordCSP: true,
|
||||
},
|
||||
function (error) {
|
||||
if (error) throw error;
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
export async function sleep(ms: number) {
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
}
|
||||
export function saveSettings(
|
||||
customTitlebarSetting: boolean,
|
||||
channelSetting: string,
|
||||
armcordCSPSetting: boolean,
|
||||
modsSetting: string
|
||||
) {
|
||||
console.log("Setting up ArmCord settings.");
|
||||
storage.set(
|
||||
"settings",
|
||||
{
|
||||
customTitlebar: customTitlebarSetting,
|
||||
channel: channelSetting,
|
||||
firstRun: "done",
|
||||
armcordCSP: armcordCSPSetting,
|
||||
mods: modsSetting,
|
||||
},
|
||||
function (error) {
|
||||
if (error) throw error;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
export function getVersion() {
|
||||
const pkgjson = fs.readFileSync("./package.json", "utf8");
|
||||
return JSON.parse(pkgjson).version;
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
"compilerOptions": {
|
||||
// Project Structure //
|
||||
"rootDir": "src", // rootDir only affects the STRUCTURE of the folders, not what gets compiled. For extra measure, make sure the structure conforms to "src".
|
||||
"outDir": "dist", // Likewise, outDir only chooses which folder to compile to. Prevent the compiler from creating JS files right next to source files.
|
||||
"outDir": "ts-out", // Likewise, outDir only chooses which folder to compile to. Prevent the compiler from creating JS files right next to source files.
|
||||
"moduleResolution": "node", // Specify how the compiler resolves modules, like going for node_modules first then searching elsewhere. The official docs just say to use this instead of classic.
|
||||
|
||||
// Type Settings //
|
||||
|
|
Loading…
Reference in a new issue