From fd43ebf7b8f0a19c2f9a6d7b3204e951e5a2697e Mon Sep 17 00:00:00 2001 From: Zack Rauen Date: Mon, 12 Apr 2021 01:07:00 -0400 Subject: [PATCH] Clean up code, add more linting, update emote styling --- .eslintrc | 3 ++- assets/locales/en.json | 8 +++---- injector/src/modules/betterdiscord.js | 2 +- injector/src/modules/ipc.js | 2 +- renderer/src/builtins/appearance/24hour.js | 4 ++-- renderer/src/builtins/builtins.js | 7 +++--- .../src/builtins/developer/reactdevtools.js | 3 --- .../removeminimumsize.js | 2 +- .../transparency.js} | 8 +++---- renderer/src/data/settings.js | 4 ++-- renderer/src/modules/addonmanager.js | 2 +- renderer/src/modules/core.js | 3 --- renderer/src/modules/datastore.js | 3 --- renderer/src/modules/pluginapi.js | 16 +++++-------- renderer/src/modules/pluginmanager.js | 5 ---- renderer/src/modules/utilities.js | 24 ++++++++++++++++--- renderer/src/modules/webpackmodules.js | 13 ---------- renderer/src/structs/psconnection.js | 10 -------- renderer/src/styles/builtins/emotes.css | 9 +++++-- renderer/src/ui/emote.js | 2 -- renderer/src/ui/modals.js | 1 - renderer/src/ui/publicservers/card.jsx | 2 -- renderer/src/ui/publicservers/menu.js | 5 ++-- renderer/src/ui/settings.js | 3 --- renderer/src/ui/settings/addoncard.jsx | 3 --- .../src/ui/settings/components/dropdown.jsx | 13 +--------- scripts/pack.js | 9 ------- 27 files changed, 60 insertions(+), 106 deletions(-) rename renderer/src/builtins/{appearance => window}/removeminimumsize.js (88%) rename renderer/src/builtins/{windowprefs.js => window/transparency.js} (75%) diff --git a/.eslintrc b/.eslintrc index 2e54d27f..f356a5a5 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,5 +1,6 @@ { - "env": { + "extends": "eslint:recommended", + "env": { "node": true }, "parserOptions": { diff --git a/assets/locales/en.json b/assets/locales/en.json index d7d00d58..fb58a107 100644 --- a/assets/locales/en.json +++ b/assets/locales/en.json @@ -51,10 +51,6 @@ "hideGiftButton": { "name": "Hide Gift Button", "note": "Hides the Nitro Gift button in the textarea" - }, - "removeMinimumSize": { - "name": "Remove Minimum Size", - "note": "Removes Discord's forced minimum window size of 940x500" } }, "addons": { @@ -136,6 +132,10 @@ "frame": { "name": "Window Frame", "note": "Adds the native os window frame to the main window" + }, + "removeMinimumSize": { + "name": "Remove Minimum Size", + "note": "Removes Discord's forced minimum window size of 940x500" } } }, diff --git a/injector/src/modules/betterdiscord.js b/injector/src/modules/betterdiscord.js index 38a5f0fc..ba99585c 100644 --- a/injector/src/modules/betterdiscord.js +++ b/injector/src/modules/betterdiscord.js @@ -108,7 +108,7 @@ export default class BetterDiscord { browserWindow.webContents.send(IPCEvents.NAVIGATE); }); - browserWindow.webContents.on("render-process-gone", (event, details) => { + browserWindow.webContents.on("render-process-gone", () => { hasCrashed = true; }); } diff --git a/injector/src/modules/ipc.js b/injector/src/modules/ipc.js index 2dfb8fa6..59c315d1 100644 --- a/injector/src/modules/ipc.js +++ b/injector/src/modules/ipc.js @@ -1,4 +1,4 @@ -import {ipcMain as ipc, BrowserWindow, app, dialog} from "electron"; +import {ipcMain as ipc, BrowserWindow, app} from "electron"; import * as IPCEvents from "common/constants/ipcevents"; diff --git a/renderer/src/builtins/appearance/24hour.js b/renderer/src/builtins/appearance/24hour.js index 5274c5cd..69c1b9db 100644 --- a/renderer/src/builtins/appearance/24hour.js +++ b/renderer/src/builtins/appearance/24hour.js @@ -19,8 +19,8 @@ export default new class TwentyFourHour extends Builtin { const convert = (thisObject, args, returnValue) => { const matched = returnValue.match(twelveHour); if (!matched || matched.length !== 4) return; - if (matched[3] === "AM") return returnValue = returnValue.replace(matched[0], `${matched[1] === "12" ? "00" : matched[1].padStart(2, "0")}:${matched[2]}`); - return returnValue = returnValue.replace(matched[0], `${matched[1] === "12" ? "12" : parseInt(matched[1]) + 12}:${matched[2]}`); + if (matched[3] === "AM") return returnValue.replace(matched[0], `${matched[1] === "12" ? "00" : matched[1].padStart(2, "0")}:${matched[2]}`); + return returnValue.replace(matched[0], `${matched[1] === "12" ? "12" : parseInt(matched[1]) + 12}:${matched[2]}`); }; this.after(DiscordModules.TimeFormatter, "calendarFormat", convert); // Called in Cozy mode diff --git a/renderer/src/builtins/builtins.js b/renderer/src/builtins/builtins.js index f3761607..fef26cf0 100644 --- a/renderer/src/builtins/builtins.js +++ b/renderer/src/builtins/builtins.js @@ -1,7 +1,6 @@ // Export these two first because they add settings/panels export {default as CustomCSS} from "./customcss"; -export {default as WindowPrefs} from "./windowprefs"; export {default as PublicServers} from "./general/publicservers"; export {default as VoiceDisconnect} from "./general/voicedisconnect"; @@ -12,7 +11,6 @@ export {default as ColoredText} from "./appearance/coloredtext"; export {default as HideGIFButton} from "./appearance/hidegifbutton"; export {default as HideGiftButton} from "./appearance/hidegiftbutton"; export {default as MinimalMode} from "./appearance/minimalmode"; -export {default as RemoveMinimumSize} from "./appearance/removeminimumsize"; export {default as EmoteModule} from "./emotes/emotes"; export {default as EmoteMenu} from "./emotes/emotemenu"; @@ -22,4 +20,7 @@ export {default as Debugger} from "./developer/debugger"; export {default as ReactDevTools} from "./developer/reactdevtools"; export {default as InspectElement} from "./developer/inspectelement"; export {default as StopDevToolsWarning} from "./developer/devtoolswarning"; -export {default as DebugLogs} from "./developer/debuglogs"; \ No newline at end of file +export {default as DebugLogs} from "./developer/debuglogs"; + +export {default as WindowPrefs} from "./window/transparency"; +export {default as RemoveMinimumSize} from "./window/removeminimumsize"; \ No newline at end of file diff --git a/renderer/src/builtins/developer/reactdevtools.js b/renderer/src/builtins/developer/reactdevtools.js index cabc389d..418360a6 100644 --- a/renderer/src/builtins/developer/reactdevtools.js +++ b/renderer/src/builtins/developer/reactdevtools.js @@ -2,9 +2,6 @@ import Builtin from "../../structs/builtin"; import Modals from "../../ui/modals"; import {Strings, IPC} from "modules"; -const fs = require("fs"); -const path = require("path"); - export default new class ReactDevTools extends Builtin { get name() {return "ReactDevTools";} get category() {return "developer";} diff --git a/renderer/src/builtins/appearance/removeminimumsize.js b/renderer/src/builtins/window/removeminimumsize.js similarity index 88% rename from renderer/src/builtins/appearance/removeminimumsize.js rename to renderer/src/builtins/window/removeminimumsize.js index c1055689..a9c353f1 100644 --- a/renderer/src/builtins/appearance/removeminimumsize.js +++ b/renderer/src/builtins/window/removeminimumsize.js @@ -3,7 +3,7 @@ import IPC from "../../modules/ipc"; export default new class RemoveMinimumSize extends Builtin { get name() {return "RemoveMinimumSize";} - get category() {return "appearance";} + get category() {return "window";} get id() {return "removeMinimumSize";} enabled() { diff --git a/renderer/src/builtins/windowprefs.js b/renderer/src/builtins/window/transparency.js similarity index 75% rename from renderer/src/builtins/windowprefs.js rename to renderer/src/builtins/window/transparency.js index 932cd31b..b034a6e7 100644 --- a/renderer/src/builtins/windowprefs.js +++ b/renderer/src/builtins/window/transparency.js @@ -1,9 +1,9 @@ -import Builtin from "../structs/builtin"; -import Modals from "../ui/modals"; +import Builtin from "../../structs/builtin"; +import Modals from "../../ui/modals"; import {Strings, IPC} from "modules"; -export default new class WindowPrefs extends Builtin { - get name() {return "WindowPrefs";} +export default new class WindowTransparency extends Builtin { + get name() {return "WindowTransparency";} get category() {return "window";} get id() {return "transparency";} diff --git a/renderer/src/data/settings.js b/renderer/src/data/settings.js index 19254e43..6ba71c33 100644 --- a/renderer/src/data/settings.js +++ b/renderer/src/data/settings.js @@ -20,8 +20,7 @@ export default [ {type: "switch", id: "hideGiftButton", value: false}, {type: "switch", id: "hideGIFButton", value: false}, {type: "switch", id: "minimalMode", value: false}, - {type: "switch", id: "coloredText", value: false}, - {type: "switch", id: "removeMinimumSize", value: false} + {type: "switch", id: "coloredText", value: false} ] }, { @@ -66,6 +65,7 @@ export default [ shown: false, settings: [ {type: "switch", id: "transparency", value: false}, + {type: "switch", id: "removeMinimumSize", value: false}, {type: "switch", id: "frame", value: false, hidden: true} ] } diff --git a/renderer/src/modules/addonmanager.js b/renderer/src/modules/addonmanager.js index 4c945c82..010063a2 100644 --- a/renderer/src/modules/addonmanager.js +++ b/renderer/src/modules/addonmanager.js @@ -198,7 +198,7 @@ export default class AddonManager { loadAddon(filename, shouldToast = false) { if (typeof(filename) === "undefined") return; try { - const addon = __non_webpack_require__(path.resolve(this.addonFolder, filename)); + __non_webpack_require__(path.resolve(this.addonFolder, filename)); } catch (error) { return new AddonError(filename, filename, Strings.Addons.compileError, {message: error.message, stack: error.stack}, this.prefix); diff --git a/renderer/src/modules/core.js b/renderer/src/modules/core.js index 1f2dba99..c73cdcaf 100644 --- a/renderer/src/modules/core.js +++ b/renderer/src/modules/core.js @@ -89,16 +89,13 @@ export default new class Core { } waitForGuilds() { - let timesChecked = 0; return new Promise(resolve => { const checkForGuilds = function () { - timesChecked++; if (document.readyState != "complete") setTimeout(checkForGuilds, 100); const wrapper = GuildClasses.wrapper.split(" ")[0]; const guild = GuildClasses.listItem.split(" ")[0]; const blob = GuildClasses.blobContainer.split(" ")[0]; if (document.querySelectorAll(`.${wrapper} .${guild} .${blob}`).length > 0) return resolve(); - // else if (timesChecked >= 50) return resolve(); setTimeout(checkForGuilds, 100); }; diff --git a/renderer/src/modules/datastore.js b/renderer/src/modules/datastore.js index bf7e853f..ecd9935c 100644 --- a/renderer/src/modules/datastore.js +++ b/renderer/src/modules/datastore.js @@ -6,9 +6,6 @@ const path = require("path"); const releaseChannel = window?.DiscordNative?.app?.getReleaseChannel?.() ?? "stable"; const discordVersion = window?.DiscordNative?.remoteApp?.getVersion?.() ?? "0.0.309"; -// const releaseChannel = "stable"; -// const discordVersion = "0.0.309"; - // Schema // ======================= // %appdata%\BetterDiscord diff --git a/renderer/src/modules/pluginapi.js b/renderer/src/modules/pluginapi.js index 8f95bebf..8d9043b7 100644 --- a/renderer/src/modules/pluginapi.js +++ b/renderer/src/modules/pluginapi.js @@ -36,20 +36,16 @@ const BdApi = { }; BdApi.getAllWindowPreferences = function() { - // return DataStore.getData("windowprefs") || {}; - // TODO: mark deprecated + Logger.warn("Deprecated", "BdApi.getAllWindowPreferences() has been deprecated due to the new handling of window transparency."); }; -BdApi.getWindowPreference = function(key) { - // return this.getAllWindowPreferences()[key]; - // TODO: mark deprecated +BdApi.getWindowPreference = function() { + Logger.warn("Deprecated", "BdApi.getWindowPreference() has been deprecated due to the new handling of window transparency."); + return null; }; -BdApi.setWindowPreference = function(key, value) { - // const prefs = this.getAllWindowPreferences(); - // prefs[key] = value; - // return DataStore.setData("windowprefs", prefs); - // TODO: mark deprecated +BdApi.setWindowPreference = function() { + Logger.warn("Deprecated", "BdApi.setWindowPreference() has been deprecated due to the new handling of window transparency."); }; // Inject CSS to document head diff --git a/renderer/src/modules/pluginmanager.js b/renderer/src/modules/pluginmanager.js index 22671da5..865e12ba 100644 --- a/renderer/src/modules/pluginmanager.js +++ b/renderer/src/modules/pluginmanager.js @@ -4,7 +4,6 @@ import AddonManager from "./addonmanager"; import AddonError from "../structs/addonerror"; import Settings from "./settingsmanager"; import Strings from "./strings"; -import IPC from "./ipc"; import Events from "./emitter"; import Toasts from "../ui/toasts"; @@ -12,11 +11,7 @@ import Modals from "../ui/modals"; import SettingsRenderer from "../ui/settings"; const path = require("path"); -const electron = require("electron"); const vm = require("vm"); -// const electronRemote = require("electron").remote; - -// window.$ = window.jQuery = function() {} export default new class PluginManager extends AddonManager { get name() {return "PluginManager";} diff --git a/renderer/src/modules/utilities.js b/renderer/src/modules/utilities.js index ac0a4685..54cf13f4 100644 --- a/renderer/src/modules/utilities.js +++ b/renderer/src/modules/utilities.js @@ -81,7 +81,7 @@ export default class Utilities { } static isEmpty(obj) { - if (obj == null || obj == undefined || obj == "") return true; + if (obj === null || typeof(undefined) === "undefined" || obj === "") return true; if (typeof(obj) !== "object") return false; if (Array.isArray(obj)) return obj.length == 0; for (const key in obj) { @@ -121,6 +121,25 @@ export default class Utilities { return proxy; } + /** + * Protects prototypes from external assignment. + * + * Needs some work before full usage + * @param {Class} Component - component with prototype to protect + */ + static protectPrototype(Component) { + const descriptors = Object.getOwnPropertyDescriptors(Component.prototype); + for (const name in descriptors) { + const descriptor = descriptors[name]; + descriptor.configurable = false; + descriptor.enumerable = false; + if (Object.prototype.hasOwnProperty.call(descriptor, "get")) descriptor.set = () => Logger.warn("protectPrototype", "Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins"); + if (Object.prototype.hasOwnProperty.call(descriptor, "value") && typeof(descriptor.value) === "function") descriptor.value.bind(Component.prototype); + if (Object.prototype.hasOwnProperty.call(descriptor, "writable")) descriptor.writable = false; + } + Object.defineProperties(Component.prototype, descriptors); + } + /** * Deep extends an object with a set of other objects. Objects later in the list * of `extenders` have priority, that is to say if one sets a key to be a primitive, @@ -265,9 +284,8 @@ export default class Utilities { let curr = this.getReactInstance(node); for (curr = curr && curr.return; curr !== null; curr = curr.return) { - if (curr === null) continue; const owner = curr.stateNode; - if (curr !== null && !(owner instanceof HTMLElement) && classFilter(curr) && filter(owner)) return owner; + if (!(owner instanceof HTMLElement) && classFilter(curr) && filter(owner)) return owner; } return null; diff --git a/renderer/src/modules/webpackmodules.js b/renderer/src/modules/webpackmodules.js index 3b53c2ea..96466d4a 100644 --- a/renderer/src/modules/webpackmodules.js +++ b/renderer/src/modules/webpackmodules.js @@ -170,19 +170,6 @@ export default class WebpackModules { */ static getModules(filter) {return this.getModule(filter, false);} - /** - * Finds a module by its name. - * @param {String} name The name of the module - * @param {Function} fallback A function to use to filter modules if not finding a known module - * @return {Any} - */ - // static getModuleByName(name, fallback) { - // if (DiscordModules.hasOwnProperty(name)) return DiscordModules[name]; - // if (!fallback) return undefined; - // const module = this.getModule(fallback, true); - // return module ? DiscordModules[name] = module : undefined; - // } - /** * Finds a module by its display name. * @param {String} name The display name of the module diff --git a/renderer/src/structs/psconnection.js b/renderer/src/structs/psconnection.js index eaf8a3ea..973bdc50 100644 --- a/renderer/src/structs/psconnection.js +++ b/renderer/src/structs/psconnection.js @@ -140,16 +140,6 @@ export default new class PublicServersConnection { } async connect() { - // return new Promise(resolve => { - // const joinWindow = new BrowserWindow(this.windowOptions); - // const url = `https://auth.discordservers.com/connect?scopes=guilds.join&previousUrl=${this.connectEndPoint}`; - // joinWindow.webContents.on("did-navigate", (event, navUrl) => { - // if (navUrl != this.connectEndPoint) return; - // joinWindow.close(); - // resolve(); - // }); - // joinWindow.loadURL(url); - // }); await IPC.openWindow(this.authorizeEndPoint, { windowOptions: this.windowOptions, closeOnUrl: this.connectEndPoint diff --git a/renderer/src/styles/builtins/emotes.css b/renderer/src/styles/builtins/emotes.css index 366e2df8..e1178b48 100644 --- a/renderer/src/styles/builtins/emotes.css +++ b/renderer/src/styles/builtins/emotes.css @@ -13,11 +13,16 @@ } .emote { - height: 1.45em; + object-fit: contain; + width: 1.375em; + height: 1.375em; + vertical-align: bottom; } .emote.jumboable { - height: 2rem; + width: 3rem; + height: 3rem; + min-height: 3rem; } .fav { diff --git a/renderer/src/ui/emote.js b/renderer/src/ui/emote.js index 343a3f70..9da63e9b 100644 --- a/renderer/src/ui/emote.js +++ b/renderer/src/ui/emote.js @@ -31,8 +31,6 @@ export default class BDEmote extends React.Component { onMouseEnter() { if (!this.state.shouldAnimate && this.animateOnHover) this.setState({shouldAnimate: true}); - // if (!this.state.isFavorite && EmoteMenu.favoriteEmotes[this.label]) this.setState({isFavorite: true}); - // else if (this.state.isFavorite && !EmoteMenu.favoriteEmotes[this.label]) this.setState({isFavorite: false}); } onMouseLeave() { diff --git a/renderer/src/ui/modals.js b/renderer/src/ui/modals.js index ce05433d..5c9370df 100644 --- a/renderer/src/ui/modals.js +++ b/renderer/src/ui/modals.js @@ -195,7 +195,6 @@ export default class Modals { componentDidMount() { if (this.element instanceof Node) this.elementRef.current.appendChild(this.element); - // if (typeof(this.element) === "string") this.elementRef.current.appendChild(this.element); } render() { diff --git a/renderer/src/ui/publicservers/card.jsx b/renderer/src/ui/publicservers/card.jsx index e592f02f..824b83ae 100644 --- a/renderer/src/ui/publicservers/card.jsx +++ b/renderer/src/ui/publicservers/card.jsx @@ -20,7 +20,6 @@ export default class ServerCard extends React.Component { super(props); if (!this.props.server.iconUrl) this.props.server.iconUrl = this.props.defaultAvatar(); this.state = { - imageError: false, joined: this.props.joined }; this.join = this.join.bind(this); @@ -60,7 +59,6 @@ export default class ServerCard extends React.Component { handleError() { this.props.server.iconUrl = this.props.defaultAvatar(); - this.setState({imageError: true}); } async join() { diff --git a/renderer/src/ui/publicservers/menu.js b/renderer/src/ui/publicservers/menu.js index fa9add0d..0a35faf1 100644 --- a/renderer/src/ui/publicservers/menu.js +++ b/renderer/src/ui/publicservers/menu.js @@ -93,13 +93,14 @@ export default class PublicServers extends React.Component { if (this.state.loading) return; await new Promise(resolve => this.setState({tab: id}, resolve)); if (this.state.tab === "Featured" || this.state.tab == "Popular") { - return this.setState({results: { + const fakeResults = { servers: this[this.state.tab.toLowerCase()], size: this[this.state.tab.toLowerCase()].length, total: this[this.state.tab.toLowerCase()].length, page: 1, numPages: 1 - }}); + }; + return this.setState({results: fakeResults}); } this.search(); diff --git a/renderer/src/ui/settings.js b/renderer/src/ui/settings.js index 7520a1f7..a1cba483 100644 --- a/renderer/src/ui/settings.js +++ b/renderer/src/ui/settings.js @@ -89,9 +89,6 @@ export default new class SettingsRenderer { if (typeof(panel.label) !== "string") panel.label = panel.label.toString(); insert(panel); } - // for (const tab of returnValue) { - // if (!tab.className) tab.className = `${DOM.escapeID(tab.section).toLowerCase()}-tab`; - // } }); this.forceUpdate(); } diff --git a/renderer/src/ui/settings/addoncard.jsx b/renderer/src/ui/settings/addoncard.jsx index 2c0f2a32..a95e9def 100644 --- a/renderer/src/ui/settings/addoncard.jsx +++ b/renderer/src/ui/settings/addoncard.jsx @@ -36,9 +36,6 @@ export default class AddonCard extends React.Component { constructor(props) { super(props); - this.state = { - settingsOpen: false - }; this.settingsPanel = ""; this.panelRef = React.createRef(); diff --git a/renderer/src/ui/settings/components/dropdown.jsx b/renderer/src/ui/settings/components/dropdown.jsx index 2762bbda..178a94e9 100644 --- a/renderer/src/ui/settings/components/dropdown.jsx +++ b/renderer/src/ui/settings/components/dropdown.jsx @@ -49,15 +49,4 @@ export default class Select extends React.Component { {this.state.open && this.options} ; } -} - -// return
-// -//
-//
-//
{this.selected.label}
-// -//
-//
-// {this.state.open && this.options} -//
; \ No newline at end of file +} \ No newline at end of file diff --git a/scripts/pack.js b/scripts/pack.js index d7efc0eb..25e2fe94 100644 --- a/scripts/pack.js +++ b/scripts/pack.js @@ -1,4 +1,3 @@ -const fs = require("fs"); const path = require("path"); const asar = require("asar"); @@ -8,14 +7,6 @@ const buildPackage = require("./package"); const dist = path.resolve(__dirname, "..", "dist"); const bundleFile = path.join(dist, "betterdiscord.asar"); -const cleanOldAsar = function() { - console.log(""); - console.log("Ensuring clean build"); - if (!fs.existsSync(bundleFile)) return console.log(" ✅ Nothing to clean up"); - fs.unlinkSync(bundleFile); - console.log(` ✅ Removed old bundle ${bundleFile}`); -}; - const makeBundle = function() { console.log(""); console.log("Generating bundle");