Titlebar, client mod, Discord, everything loads

This commit is contained in:
smartfrigde 2022-01-15 19:31:51 +01:00
parent c2c0e50fd3
commit 521278cf00
10 changed files with 236 additions and 206 deletions

15
package-lock.json generated
View file

@ -5,6 +5,7 @@
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "armcord",
"version": "3.0.0", "version": "3.0.0",
"license": "OSL-3.0", "license": "OSL-3.0",
"dependencies": { "dependencies": {
@ -17,7 +18,7 @@
"ws": "^8.4.0" "ws": "^8.4.0"
}, },
"devDependencies": { "devDependencies": {
"electron": "^16.0.5" "electron": "^16.0.7"
} }
}, },
"node_modules/@electron/get": { "node_modules/@electron/get": {
@ -343,9 +344,9 @@
"dev": true "dev": true
}, },
"node_modules/electron": { "node_modules/electron": {
"version": "16.0.5", "version": "16.0.7",
"resolved": "https://registry.npmjs.org/electron/-/electron-16.0.5.tgz", "resolved": "https://registry.npmjs.org/electron/-/electron-16.0.7.tgz",
"integrity": "sha512-TgQXWmEGQ3uH2P2JDq5GyJDEu/fimRgqp1iNisARtGreU1k3630PqWlR+4SPnSEHN9NuSv92ng6NWxtefeFzxg==", "integrity": "sha512-/IMwpBf2svhA1X/7Q58RV+Nn0fvUJsHniG4TizaO7q4iKFYSQ6hBvsLz+cylcZ8hRMKmVy5G1XaMNJID2ah23w==",
"dev": true, "dev": true,
"hasInstallScript": true, "hasInstallScript": true,
"dependencies": { "dependencies": {
@ -1561,9 +1562,9 @@
"dev": true "dev": true
}, },
"electron": { "electron": {
"version": "16.0.5", "version": "16.0.7",
"resolved": "https://registry.npmjs.org/electron/-/electron-16.0.5.tgz", "resolved": "https://registry.npmjs.org/electron/-/electron-16.0.7.tgz",
"integrity": "sha512-TgQXWmEGQ3uH2P2JDq5GyJDEu/fimRgqp1iNisARtGreU1k3630PqWlR+4SPnSEHN9NuSv92ng6NWxtefeFzxg==", "integrity": "sha512-/IMwpBf2svhA1X/7Q58RV+Nn0fvUJsHniG4TizaO7q4iKFYSQ6hBvsLz+cylcZ8hRMKmVy5G1XaMNJID2ah23w==",
"dev": true, "dev": true,
"requires": { "requires": {
"@electron/get": "^1.13.0", "@electron/get": "^1.13.0",

View file

@ -20,7 +20,7 @@
}, },
"homepage": "https://github.com/armcord/armcord#readme", "homepage": "https://github.com/armcord/armcord#readme",
"devDependencies": { "devDependencies": {
"electron": "^16.0.5" "electron": "^16.0.7"
}, },
"dependencies": { "dependencies": {
"@types/electron-json-storage": "^4.5.0", "@types/electron-json-storage": "^4.5.0",

View file

@ -0,0 +1,12 @@
.info-1VyQPT:last-child:before {
content: "ArmCord Version: 3.0.0"!important;
height: auto;
line-height: 16px;
text-align: center;
color: var(--text-muted);
font-size: 12px;
text-transform: none;
}
.notice-3bPHh-.colorDefault-22HBa0 {
display: none;
}

View file

@ -5,27 +5,7 @@
--armcord-color: #7289da; --armcord-color: #7289da;
--titlebar-color: var(--background-tertiary); --titlebar-color: var(--background-tertiary);
} }
.titleebar { .titlebar {
position: absolute;
top: 0;
left: 0;
right: 0;
box-sizing: border-box;
width: 100%;
font-size: 13px;
padding: 0 16px;
overflow: hidden;
flex-shrink: 0;
align-items: center;
justify-content: center;
user-select: none;
zoom: 1;
line-height: 22px;
height: 22px;
display: flex;
z-index: 99999;
}
.titlebar {
display: block; display: block;
top: 0; top: 0;
left: 0; left: 0;
@ -35,7 +15,7 @@
zoom: 1; zoom: 1;
box-sizing: border-box; box-sizing: border-box;
width: 100%; width: 100%;
clear:both; clear: both;
height: 30px; height: 30px;
line-height: 30px; line-height: 30px;
background-color: #202225; background-color: #202225;
@ -45,82 +25,84 @@
-webkit-user-select: none; -webkit-user-select: none;
position: fixed; position: fixed;
z-index: 99999; z-index: 99999;
}
} .titlebar #window-title {
.appMount-3lHmkl{
}
.titlebar #window-title {
width: 30%; width: 30%;
height: 100%; height: 100%;
line-height: 30px; line-height: 30px;
float: left; float: left;
padding: 0 0 0 1em; padding: 0 0 0 1em;
} }
.titlebar #window-controls-container { .titlebar #window-controls-container {
float: right; float: right;
width: 150px; width: 150px;
height: 100%; height: 100%;
line-height: 30px; line-height: 30px;
background-color: #202225; background-color: #202225;
-webkit-app-region: no-drag; -webkit-app-region: no-drag;
} }
.titlebar #window-controls-container #minimize, .titlebar #window-controls-container #minimize,
.titlebar #window-controls-container #maximize, .titlebar #window-controls-container #maximize,
.titlebar #window-controls-container #quit { .titlebar #window-controls-container #quit {
float: left; float: left;
height: 100%; height: 100%;
width: 33%; width: 33%;
text-align: center; text-align: center;
color: #f7f7f7; color: #f7f7f7;
cursor: default; cursor: default;
} }
.titlebar #window-controls-container #minimize:hover { .titlebar #window-controls-container #minimize:hover {
background-color: #99AAB5; background-color: #99aab5;
} }
.titlebar #window-controls-container #maximize:hover { .titlebar #window-controls-container #maximize:hover {
background-color: #99AAB5; background-color: #99aab5;
} }
.titlebar #window-controls-container #quit:hover { .titlebar #window-controls-container #quit:hover {
background-color: #F04747; background-color: #f04747;
} }
.titlebar #window-controls-container #quit { .titlebar #window-controls-container #quit {
background-color: #f7f7f7; background-color: #f7f7f7;
-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E")
mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; no-repeat 50% 50%;
} mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E")
.titlebar #window-controls-container #minimize { no-repeat 50% 50%;
}
.titlebar #window-controls-container #minimize {
background-color: #f7f7f7; background-color: #f7f7f7;
-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E")
mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; no-repeat 50% 50%;
} mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E")
.titlebar #window-controls-container #maximize { no-repeat 50% 50%;
}
.titlebar #window-controls-container #maximize {
background-color: #f7f7f7; background-color: #f7f7f7;
-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E")
mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; no-repeat 50% 50%;
} mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E")
.window-title:after { no-repeat 50% 50%;
}
.window-title:after {
content: "Cord"; content: "Cord";
color: var(--cord-color) !important; color: var(--cord-color) !important;
font-weight: normal; font-weight: normal;
font-size: 14px; font-size: 14px;
font-family: Discordinated; font-family: Discordinated;
} }
.window-title:before { .window-title:before {
content: "ARM"; content: "ARM";
color: var(--armcord-color); color: var(--armcord-color);
font-weight: normal; font-weight: normal;
font-size: 14px; font-size: 14px;
font-family: Helvetica, sans-serif; font-family: Helvetica, sans-serif;
} }
.window-title { .window-title {
font-size: 0px !important; font-size: 0px !important;
margin-left: initial !important; margin-left: initial !important;
transform: translate(10px, 0px); transform: translate(10px, 0px);
} }
.withFrame-haYltI { .withFrame-haYltI {
height: 23px !important; height: 30px !important;
} }

View file

@ -22,7 +22,7 @@
</div> </div>
</div> </div>
<script> <script>
function discord(){ function discord() {
switch (window.armcord.channel) { switch (window.armcord.channel) {
case "stable": case "stable":
window.location.href = "https://discord.com/app"; window.location.href = "https://discord.com/app";
@ -90,7 +90,7 @@
<select name="mod" id="mod" class="dropdown-button"> <select name="mod" id="mod" class="dropdown-button">
<option value="cumcord">Cumcord</option> <option value="cumcord">Cumcord</option>
<option value="goosemod">GooseMod</option> <option value="goosemod">GooseMod</option>
<option value="flicker">Flicker (WIP)</option> <option value="flicker">Flicker (Heavily WIP)</option>
</select> </select>
</div> </div>
<p>Why not all of them? Having many client mods at the same time can cause issues. If you really want to do it though, check our documentation ;)</p> <p>Why not all of them? Having many client mods at the same time can cause issues. If you really want to do it though, check our documentation ;)</p>

View file

@ -26,25 +26,43 @@
"You appear to be offline. Please connect to the internet and try again."; "You appear to be offline. Please connect to the internet and try again.";
} else { } else {
text.innerHTML = "Starting ArmCord..."; text.innerHTML = "Starting ArmCord...";
fetch("https://armcord.smartfridge.space/latest.json")
.then((response) => response.json())
.then((data) => {
if (data.version !== window.armcord.version) {
var elem = document.createElement("img");
elem.classList.add("logo");
elem.src = "https://armcord.smartfridge.space/update.webp";
document.body.prepend(elem);
document.getElementById("splashscreen-armcord").remove();
text.innerHTML =
"A new version of ArmCord is available. Please update to the latest version.";
} else {
console.log("ArmCord is up to date.")
}
});
setTimeout(() => { setTimeout(() => {
window.armcord.splashEnd(); window.armcord.splashEnd();
switch (window.armcord.channel) { switch (window.armcord.channel) {
case "stable": case "stable":
window.location.href = "https://discord.com/app"; window.location.replace("https://discord.com/app");
break; break;
case "canary": case "canary":
window.location.href = "https://canary.discord.com/app"; window.location.replace("https://canary.discord.com/app");
break; break;
case "ptb": case "ptb":
window.location.href = "https://ptb.discord.com/app"; window.location.replace("https://ptb.discord.com/app");
break; break;
case "foss": case "foss":
window.location.href = "https://dev.fosscord.com/app"; window.location.replace("https://dev.fosscord.com/app");
break;
case undefined:
window.location.replace("https://discord.com/app");
break; break;
default: default:
window.location.href = "https://discord.com/app"; window.location.replace("https://discord.com/app");
}}, 5000); }
}, 5000);
} }
</script> </script>
</html> </html>

View file

@ -7,11 +7,12 @@ import { saveSettings } from "./utils";
import "./extensions/mods"; import "./extensions/mods";
import "./extensions/plugin"; import "./extensions/plugin";
import "./tray"; import "./tray";
var isSetup = null;
var contentPath: string = "null"; var contentPath: string = "null";
var frame: boolean; var frame: boolean;
var channel: string;
var titlebar: boolean;
export var mainWindow: BrowserWindow; export var mainWindow: BrowserWindow;
var settings:any;
storage.keys(function (error, keys) { storage.keys(function (error, keys) {
if (error) throw error; if (error) throw error;
@ -24,26 +25,31 @@ storage.has("settings", function (error, hasKey) {
if (!hasKey) { if (!hasKey) {
console.log("First run of the ArmCord. Starting setup."); console.log("First run of the ArmCord. Starting setup.");
isSetup = true;
// setup(); will be done at setup // setup(); will be done at setup
contentPath = __dirname + "/content/setup.html"; contentPath = __dirname + "/content/setup.html";
} else { } else {
console.log("ArmCord has been run before. Skipping setup."); console.log("ArmCord has been run before. Skipping setup.");
isSetup = false;
contentPath = __dirname + "/content/splash.html"; contentPath = __dirname + "/content/splash.html";
} }
}); });
storage.get("settings", function (error, data: any) { storage.get("settings", function (error, data: any) {
if (error) throw error; if (error) throw error;
console.log(data); console.log(data);
frame = data.customTitlebar; titlebar = data.customTitlebar;
console.log(frame); channel = data.channel;
settings = data;
if ((titlebar = true)) {
frame = false;
} else {
frame = true;
}
}); });
function createWindow() { function createWindow() {
mainWindow = new BrowserWindow({ mainWindow = new BrowserWindow({
width: 300, width: 300,
height: 350, height: 350,
title: "ArmCord", title: "ArmCord",
icon: "./assets/ac_icon_transparent.png",
frame: frame, frame: frame,
webPreferences: { webPreferences: {
preload: path.join(__dirname, "preload/preload.js"), preload: path.join(__dirname, "preload/preload.js"),
@ -79,22 +85,18 @@ function createWindow() {
ipcMain.on("splashEnd", (event, arg) => { ipcMain.on("splashEnd", (event, arg) => {
mainWindow.setSize(800, 600); mainWindow.setSize(800, 600);
}); });
ipcMain.on("channel", (event) => {
storage.get("settings", function (error, data: any) {
if (error) throw error;
event.returnValue = data.channel;
});
});
ipcMain.on("saveSettings", (event, ...args) => { ipcMain.on("saveSettings", (event, ...args) => {
//@ts-ignore //@ts-ignore
saveSettings(...args); saveSettings(...args);
}); });
ipcMain.on('clientmod' , (event, arg) => { ipcMain.on("channel", (event) => {
storage.get("settings", function (error, data: any) {
if (error) throw error; event.returnValue = channel;
event.returnValue = data.mods;
}); });
}) ipcMain.on("clientmod", (event, arg) => {
event.returnValue = settings.mods;
});
ipcMain.on("setting-armcordCSP", (event) => { ipcMain.on("setting-armcordCSP", (event) => {
storage.get("settings", function (error, data: any) { storage.get("settings", function (error, data: any) {
if (error) throw error; if (error) throw error;
@ -110,10 +112,11 @@ function createWindow() {
); );
mainWindow.webContents.userAgent = 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 "Mozilla/5.0 (X11; Linux x86) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"; //fake useragent
mainWindow.webContents.on("new-window", function (e, url) { mainWindow.webContents.setWindowOpenHandler(({ url }) => {
e.preventDefault();
shell.openExternal(url); shell.openExternal(url);
return { action: "deny" };
}); });
mainWindow.loadFile(contentPath); mainWindow.loadFile(contentPath);
} }

View file

@ -1,20 +1,31 @@
import { contextBridge, ipcRenderer } from 'electron'; import { contextBridge, ipcRenderer } from "electron";
import {getDisplayMediaSelector} from './capturer'; import { getDisplayMediaSelector } from "./capturer";
console.log(ipcRenderer.send('channel'))
contextBridge.exposeInMainWorld("armcord", { contextBridge.exposeInMainWorld("armcord", {
window: { window: {
show: () => ipcRenderer.send('win-show'), show: () => ipcRenderer.send("win-show"),
hide: () => ipcRenderer.send('win-hide'), hide: () => ipcRenderer.send("win-hide"),
minimize: () => ipcRenderer.send('win-minimize'), minimize: () => ipcRenderer.send("win-minimize"),
maximize: () => ipcRenderer.send('win-maximize'), maximize: () => ipcRenderer.send("win-maximize"),
}, },
electron: process.versions.electron, electron: process.versions.electron,
version: ipcRenderer.send('get-app-version', 'app-version'), channel: ipcRenderer.sendSync('channel'),
version: ipcRenderer.sendSync("get-app-version", "app-version"),
getDisplayMediaSelector: getDisplayMediaSelector, getDisplayMediaSelector: getDisplayMediaSelector,
saveSettings: (...args: any) => ipcRenderer.send('saveSettings', ...args), saveSettings: (...args: any) => ipcRenderer.send("saveSettings", ...args),
splashEnd: () => ipcRenderer.send('splashEnd'), splashEnd: () => ipcRenderer.send("splashEnd"),
channel: ipcRenderer.send('channel') loadDiscord: () => ipcRenderer.send("loadDiscord"),
});
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"),
}); });
contextBridge.exposeInMainWorld("electron", {}) //deprecated, used for legacy purposes, will be removed in future versions

View file

@ -1,12 +1,10 @@
import "./capturer";
import "./bridge"; import "./bridge";
import "./capturer";
import * as fs from "fs";
import * as path from "path";
import { injectTitlebar } from "./titlebar"; import { injectTitlebar } from "./titlebar";
import { sleep, addStyle } from "../utils";
import { ipcRenderer } from "electron"; import { ipcRenderer } from "electron";
declare global {
interface Window {
splash: any;
}
}
const clientMods = { const clientMods = {
goosemod: "https://api.goosemod.com/inject.js", goosemod: "https://api.goosemod.com/inject.js",
@ -29,6 +27,10 @@ if (window.location.href.indexOf("splash.html") > -1) {
console.log("Skipping titlebar injection and client mod injection."); console.log("Skipping titlebar injection and client mod injection.");
} else { } else {
injectTitlebar(); injectTitlebar();
sleep(5000).then(() => {
const cssPath = path.join(__dirname, "../", "/content/css/discord.css");
addStyle(fs.readFileSync(cssPath, "utf8"));
switch (ipcRenderer.sendSync("clientmod")) { switch (ipcRenderer.sendSync("clientmod")) {
case "goosemod": case "goosemod":
injectJS(clientMods.goosemod); injectJS(clientMods.goosemod);
@ -43,4 +45,5 @@ if (window.location.href.indexOf("splash.html") > -1) {
console.log("Loading FlickerMod..."); console.log("Loading FlickerMod...");
break; break;
} }
});
} }