diff --git a/src/content/css/setup.css b/src/content/css/setup.css index b138257..ed876e8 100644 --- a/src/content/css/setup.css +++ b/src/content/css/setup.css @@ -2,22 +2,24 @@ @import url("https://kckarnige.github.io/femboi_owo/discord-font.css"); :root { - background-color: #2c2f33 !important; - --header-secondary: #b9bbbe !important; - --header-primary: #fff !important; - --background-tertiary: #202225 !important; -} -body { background-color: #2c2f33; + --header-secondary: #b9bbbe; + --header-primary: #fff; + --background-tertiary: #202225; +} + +body { color: white; } p { - color: white; + color: #8e9297; text-align: center; font-weight: 100; + transform: translateY(-185%); font-family: Whitney, Helvetica Neue, Helvetica, Arial, sans-serif; text-rendering: optimizeLegibility; + font-style: italic; } .logo { @@ -62,50 +64,22 @@ span { color: #fff; transform: translate(-50%, -50%); } -button#express { - margin-right: 84px; -} + button { background-color: #7289da; font-family: Whitney, "Helvetica Neue", Helvetica, Arial, sans-serif; color: #ffffff; padding: 4px; border-radius: 5px; - margin-top: 5px; - + left: 0; text-align: center; border-style: none; outline: none; } -.setup-ask { - font-size: 20px; -} + button:hover { background-color: #687dc6; border-style: none; outline: none; cursor: pointer; } -select { - -webkit-appearance: button; - -moz-appearance: button; - -webkit-padding-end: 20px; - -moz-padding-end: 20px; - -webkit-padding-start: 2px; - -moz-padding-start: 2px; - background-color: #2c2f33; - background-position: center right; - background-repeat: no-repeat; - border: 1px solid #aaa; - border-radius: 2px; - box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1); - color: #fff; - font-size: inherit; - margin: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.center { - text-align: center; -} \ No newline at end of file diff --git a/src/content/splash.html b/src/content/index.html similarity index 100% rename from src/content/splash.html rename to src/content/index.html diff --git a/src/content/setup.html b/src/content/setup.html index e0cb1d1..1c2537a 100644 --- a/src/content/setup.html +++ b/src/content/setup.html @@ -1,124 +1,24 @@ + - - - - ArmCord Setup - - - -
-

-
-

Select what kind of setup you want to perform:

- - -
-
- - - + +
+

+

Welcome to ArmCord!

+

Select what kind of setup you want to perform:

+ + +
+ + + + \ No newline at end of file diff --git a/src/extensions/mods.ts b/src/extensions/mods.ts index 6dfc5d6..5581e3b 100644 --- a/src/extensions/mods.ts +++ b/src/extensions/mods.ts @@ -8,35 +8,36 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import electron from "electron"; -import * as storage from "electron-json-storage"; +import electron from 'electron'; +import * as storage from 'electron-json-storage'; const otherMods = { - generic: { - electronProxy: require("util").types.isProxy(electron), // Many modern mods overwrite electron with a proxy with a custom BrowserWindow (copied from PowerCord) - }, -}; - + generic: { + electronProxy: require('util').types.isProxy(electron) // Many modern mods overwrite electron with a proxy with a custom BrowserWindow (copied from PowerCord) + } + }; const unstrictCSP = () => { - console.log("Setting up CSP unstricter..."); + console.log('Setting up CSP unstricter...'); - const cspAllowAll = ["connect-src", "style-src", "img-src", "font-src"]; + const cspAllowAll = [ + 'connect-src', + 'style-src', + 'img-src', + 'font-src' + ]; - const corsAllowUrls = [ - "https://github.com/GooseMod/GooseMod/releases/download/dev/index.js", - "https://github-releases.githubusercontent.com/", - "https://api.goosemod.com/inject.js", - "https://raw.githubusercontent.com/Cumcord/Cumcord/stable/dist/build.js", - "https://raw.githubusercontent.com/Cumcord/Cumcord/master/dist/build.js", - "https://raw.githubusercontent.com/FlickerMod/dist/main/build.js", - ]; + const corsAllowUrls = [ + 'https://github.com/GooseMod/GooseMod/releases/download/dev/index.js', + 'https://github-releases.githubusercontent.com/', + 'https://raw.githubusercontent.com/Cumcord/Cumcord/stable/dist/build.js', + 'https://raw.githubusercontent.com/Cumcord/Cumcord/master/dist/build.js', + 'https://raw.githubusercontent.com/FlickerMod/dist/main/build.js' + ]; - electron.session.defaultSession.webRequest.onHeadersReceived( - ({ responseHeaders, url }, done) => { - let csp = responseHeaders!["content-security-policy"]; + electron.session.defaultSession.webRequest.onHeadersReceived(({ responseHeaders, url }, done) => { + let csp = responseHeaders!['content-security-policy']; - if (otherMods.generic.electronProxy) { - // Since patch v16, override other mod's onHeadersRecieved (Electron only allows 1 listener); because they rely on 0 CSP at all (GM just unrestricts some areas), remove it fully if we detect other mods - delete responseHeaders!["content-security-policy"]; + if (otherMods.generic.electronProxy) { // Since patch v16, override other mod's onHeadersRecieved (Electron only allows 1 listener); because they rely on 0 CSP at all (GM just unrestricts some areas), remove it fully if we detect other mods + delete responseHeaders!['content-security-policy']; csp = []; } @@ -46,24 +47,21 @@ const unstrictCSP = () => { } // Fix Discord's broken CSP which disallows unsafe-inline due to having a nonce (which they don't even use?) - csp[0] = csp[0].replace(/'nonce-.*?' /, ""); + csp[0] = csp[0].replace(/'nonce-.*?' /, ''); } if (corsAllowUrls.some((x) => url.startsWith(x))) { - responseHeaders!["access-control-allow-origin"] = ["*"]; + responseHeaders!['access-control-allow-origin'] = ['*']; } done({ responseHeaders }); + }); + }; + storage.get('settings', function(error, data:any) { + if (error) throw error; + if (data.armcordCSP) { + unstrictCSP(); + } else { + console.log('ArmCord CSP is disabled. The CSP should be managed by third-party plugin.'); } - ); -}; -storage.get("settings", function (error, data: any) { - if (error) throw error; - if (data.armcordCSP) { - unstrictCSP(); - } else { - console.log( - "ArmCord CSP is disabled. The CSP should be managed by third-party plugin." - ); - } -}); + }); diff --git a/src/main.ts b/src/main.ts index ec88964..036f0a7 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,54 +1,52 @@ // Modules to control application life and create native browser window import { app, BrowserWindow, ipcMain, shell, desktopCapturer } from "electron"; import * as path from "path"; -import "v8-compile-cache"; -import * as storage from "electron-json-storage"; -import { saveSettings } from "./utils"; -import "./extensions/mods"; -import "./extensions/plugin"; -import "./tray"; +import 'v8-compile-cache'; +import * as storage from 'electron-json-storage'; +import {setup} from './utils'; +import './extensions/plugin'; +import './tray'; var isSetup = null; -var contentPath: string = "null"; -var frame: boolean; +var contentPath:string = "null"; +var frame:boolean; export var mainWindow: BrowserWindow; - -storage.keys(function (error, keys) { - if (error) throw error; - - for (var key of keys) { - console.log("There is a key called: " + key); - } -}); -storage.has("settings", function (error, hasKey) { +storage.keys(function(error, keys) { + if (error) throw error; + + for (var key of keys) { + console.log('There is a key called: ' + key); + } + }); +storage.has('firstRun', function(error, hasKey) { if (error) throw error; 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 - contentPath = __dirname + "/content/setup.html"; + setup(); + contentPath = __dirname + '/content/setup.html' } 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/index.html' } }); -storage.get("settings", function (error, data: any) { - if (error) throw error; - console.log(data); - frame = data.customTitlebar; - console.log(frame); -}); -function createWindow() { - mainWindow = new BrowserWindow({ +storage.get('settings', function(error, data:any) { + if (error) throw error; + console.log(data); + frame = data.customTitlebar; + console.log(frame) + }); +function createWindow () { + mainWindow = new BrowserWindow({ width: 300, height: 350, title: "ArmCord", frame: frame, webPreferences: { - preload: path.join(__dirname, "preload/preload.js"), - }, - }); + preload: path.join(__dirname, 'preload/preload.js') + } + }) ipcMain.on("get-app-path", (event, arg) => { event.reply("app-path", app.getAppPath()); }); @@ -75,56 +73,34 @@ function createWindow() { }); ipcMain.on("get-app-version", (event) => { event.returnValue = process.env.npm_package_version; - }); + }) ipcMain.on("splashEnd", (event, arg) => { 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) => { - //@ts-ignore - saveSettings(...args); - }); - ipcMain.on('clientmod' , (event, arg) => { - storage.get("settings", function (error, data: any) { - if (error) throw error; - event.returnValue = data.mods; - }); + event.returnValue = storage.getSync('channel'); }) - 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) - ); + ipcMain.on("armcord-support", (event) => { + mainWindow.loadURL("https://discord.gg/F25bc4RYDt"); + }) + 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 - mainWindow.webContents.on("new-window", function (e, url) { - e.preventDefault(); - shell.openExternal(url); - }); - mainWindow.loadFile(contentPath); + mainWindow.loadFile(contentPath) } + app.whenReady().then(() => { - createWindow(); + createWindow() - app.on("activate", function () { - if (BrowserWindow.getAllWindows().length === 0) createWindow(); - }); -}); + app.on('activate', function () { + if (BrowserWindow.getAllWindows().length === 0) createWindow() + }) +}) -app.on("window-all-closed", function () { - if (process.platform !== "darwin") app.quit(); -}); +app.on('window-all-closed', function () { + if (process.platform !== 'darwin') app.quit() +}) diff --git a/src/preload/bridge.ts b/src/preload/bridge.ts index 78f84db..1fac186 100644 --- a/src/preload/bridge.ts +++ b/src/preload/bridge.ts @@ -1,8 +1,7 @@ + import { contextBridge, ipcRenderer } from 'electron'; import {getDisplayMediaSelector} from './capturer'; -console.log(ipcRenderer.send('channel')) - contextBridge.exposeInMainWorld("armcord", { window: { show: () => ipcRenderer.send('win-show'), @@ -13,8 +12,6 @@ contextBridge.exposeInMainWorld("armcord", { electron: process.versions.electron, version: ipcRenderer.send('get-app-version', 'app-version'), getDisplayMediaSelector: getDisplayMediaSelector, - saveSettings: (...args: any) => ipcRenderer.send('saveSettings', ...args), splashEnd: () => ipcRenderer.send('splashEnd'), channel: ipcRenderer.send('channel') -}); -contextBridge.exposeInMainWorld("electron", {}) //deprecated, used for legacy purposes, will be removed in future versions \ No newline at end of file +}); \ No newline at end of file diff --git a/src/preload/preload.ts b/src/preload/preload.ts index 71d26bb..108a374 100644 --- a/src/preload/preload.ts +++ b/src/preload/preload.ts @@ -1,46 +1,6 @@ import "./capturer"; import "./bridge"; import { injectTitlebar } from "./titlebar"; -import { ipcRenderer } from "electron"; -declare global { - interface Window { - splash: any; - } -} - -const clientMods = { - goosemod: "https://api.goosemod.com/inject.js", - cumcord: - "https://raw.githubusercontent.com/Cumcord/Cumcord/stable/dist/build.js", - flicker: "https://raw.githubusercontent.com/FlickerMod/dist/main/build.js", -}; -async function injectJS(inject: string) { - const js = await (await fetch(`${inject}`)).text(); - - const el = document.createElement("script"); - - el.appendChild(document.createTextNode(js)); - - document.body.appendChild(el); -} +injectTitlebar(); console.log("ArmCord"); -if (window.location.href.indexOf("splash.html") > -1) { - console.log("Skipping titlebar injection and client mod injection."); -} else { - injectTitlebar(); - switch (ipcRenderer.sendSync("clientmod")) { - case "goosemod": - injectJS(clientMods.goosemod); - console.log("Loading GooseMod..."); - break; - case "cumcord": - injectJS(clientMods.cumcord); - console.log("Loading Cumcord..."); - break; - case "flicker": - injectJS(clientMods.flicker); - console.log("Loading FlickerMod..."); - break; - } -} diff --git a/src/utils.ts b/src/utils.ts index e88950a..8c29e92 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,4 +1,7 @@ - +/*-------------------------------------------------------------------------------------------------------- + * This file has parts of one or more project files (VS Code) from Microsoft + * You can check your respective license and the original file in https://github.com/Microsoft/vscode/ + *-------------------------------------------------------------------------------------------------------*/ 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) { @@ -18,12 +21,10 @@ export function setup(){ if (error) throw error; }); } +export function append(parent: HTMLElement, ...children: T[]): T { + children.forEach(child => parent.appendChild(child)); + return children[children.length - 1]; +} 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; - }); } \ No newline at end of file