From a9220996b5a91606c840990d32bacb2c984d4dd4 Mon Sep 17 00:00:00 2001 From: Zack Rauen Date: Sun, 9 Oct 2022 13:49:29 -0400 Subject: [PATCH] Fix public servers --- .../src/builtins/general/publicservers.js | 48 +++++------ renderer/src/modules/core.js | 9 +- renderer/src/modules/webpackmodules.js | 86 +++++++++---------- renderer/src/structs/psconnection.js | 2 +- renderer/src/ui/modals.js | 23 +++-- 5 files changed, 80 insertions(+), 88 deletions(-) diff --git a/renderer/src/builtins/general/publicservers.js b/renderer/src/builtins/general/publicservers.js index b5b350fb..cb3b1af6 100644 --- a/renderer/src/builtins/general/publicservers.js +++ b/renderer/src/builtins/general/publicservers.js @@ -44,36 +44,32 @@ export default new class PublicServers extends Builtin { get id() {return "publicServers";} enabled() { - // let target = null; - // WebpackModules.getModule((_, m) => { - // if (m.exports?.toString().includes("privateChannelIds")) { - // target = m.exports; - // } - // }); - // if (!target || !target.Z) return; - // const PrivateChannelListComponents = WebpackModules.getByProps("LinkButton"); - // this.after(target, "Z", (_, __, returnValue) => { - // const destination = returnValue?.props?.children?.props?.children; - // if (!destination || !Array.isArray(destination)) return; - // if (destination.find(b => b?.props?.children?.props?.id === "public-server-button")) return; + const PrivateChannelList = WebpackModules.getModule(m => m?.toString().includes("privateChannelIds"), {defaultExport: false}); + if (!PrivateChannelList || !PrivateChannelList.Z) return this.warn("Could not find PrivateChannelList", PrivateChannelList); + const PrivateChannelButton = WebpackModules.getModule(m => m?.prototype?.render?.toString().includes("linkButton"), {searchExports: true}); + if (!PrivateChannelButton) return this.warn("Could not find PrivateChannelButton", PrivateChannelButton); + this.after(PrivateChannelList, "Z", (_, __, returnValue) => { + const destination = returnValue?.props?.children?.props?.children; + if (!destination || !Array.isArray(destination)) return; + if (destination.find(b => b?.props?.children?.props?.id === "public-server-button")) return; - // destination.push( - // React.createElement(ErrorBoundary, null, - // React.createElement(PrivateChannelListComponents.LinkButton, - // { - // id: "public-server-button", - // onClick: () => this.openPublicServers(), - // text: "Public Servers", - // icon: () => React.createElement(Globe, {color: "currentColor"}) - // } - // ) - // ) - // ); - // }); + destination.push( + React.createElement(ErrorBoundary, null, + React.createElement(PrivateChannelButton, + { + id: "public-server-button", + onClick: () => this.openPublicServers(), + text: "Public Servers", + icon: () => React.createElement(Globe, {color: "currentColor"}) + } + ) + ) + ); + }); } disabled() { - // this.unpatchAll(); + this.unpatchAll(); // DOM.query("#bd-pub-li").remove(); } diff --git a/renderer/src/modules/core.js b/renderer/src/modules/core.js index 9dc9931d..e784f270 100644 --- a/renderer/src/modules/core.js +++ b/renderer/src/modules/core.js @@ -79,14 +79,7 @@ export default new class Core { const previousVersion = DataStore.getBDData("version"); if (Config.version > previousVersion) { - const md = [Changelog.description]; - for (const type of Changelog.changes) { - md.push(`**${type.title}**`); - for (const entry of type.items) { - md.push(` - ${entry}`); - } - } - Modals.showConfirmationModal(`BetterDiscord v${Config.version}`, md, {cancelText: ""}); + Modals.showChangelogModal(Changelog); DataStore.setBDData("version", Config.version); } } diff --git a/renderer/src/modules/webpackmodules.js b/renderer/src/modules/webpackmodules.js index c0720a5f..2e67cdca 100644 --- a/renderer/src/modules/webpackmodules.js +++ b/renderer/src/modules/webpackmodules.js @@ -79,9 +79,11 @@ export class Filters { */ static byStrings(...strings) { return module => { + if (!module?.toString || typeof(module?.toString) !== "function") return; // Not stringable let moduleString = ""; - try {moduleString = module.toString([]);} - catch (err) {moduleString = module.toString();} + try {moduleString = module?.toString([]);} + catch (err) {moduleString = module?.toString();} + if (!moduleString) return false; // Could not create string for (const s of strings) { if (!moduleString.includes(s)) return false; } @@ -133,7 +135,6 @@ const wrapFilter = filter => (exports, module, moduleId) => { export default class WebpackModules { - static times = []; static find(filter, first = true) {return this.getModule(filter, {first});} static findAll(filter) {return this.getModule(filter, {first: false});} static findByUniqueProperties(props, first = true) {return first ? this.getByProps(...props) : this.getAllByProps(...props);} @@ -149,56 +150,48 @@ export default class WebpackModules { * @return {Any} */ static getModule(filter, options = {}) { - const start = Date.now(); - try { - const {first = true, defaultExport = true, searchExports = false} = options; - const wrappedFilter = wrapFilter(filter); + const {first = true, defaultExport = true, searchExports = false} = options; + const wrappedFilter = wrapFilter(filter); - const modules = this.getAllModules(); - const rm = []; - const indices = Object.keys(modules); - for (let i = 0; i < indices.length; i++) { - const index = indices[i]; - if (!modules.hasOwnProperty(index)) continue; - const module = modules[index]; - const {exports} = module; - if (!exports || exports === window) continue; - - if (typeof(exports) === "object" && searchExports) { - for (const key in exports) { - let foundModule = null; - const wrappedExport = exports[key]; - if (!wrappedExport) continue; - if (wrappedExport.Z && wrappedFilter(wrappedExport.Z, module, index)) foundModule = defaultExport ? wrappedExport.Z : wrappedExport; - if (wrappedExport.ZP && wrappedFilter(wrappedExport.ZP, module, index)) foundModule = defaultExport ? wrappedExport.ZP : wrappedExport; - if (wrappedExport.__esModule && wrappedExport.default && wrappedFilter(wrappedExport.default, module, index)) foundModule = defaultExport ? wrappedExport.default : wrappedExport; - if (wrappedFilter(wrappedExport, module, index)) foundModule = wrappedExport; - if (!foundModule) continue; - if (first) return foundModule; - rm.push(foundModule); - } - } - else { + const modules = this.getAllModules(); + const rm = []; + const indices = Object.keys(modules); + for (let i = 0; i < indices.length; i++) { + const index = indices[i]; + if (!modules.hasOwnProperty(index)) continue; + const module = modules[index]; + const {exports} = module; + if (!exports || exports === window) continue; + + if (typeof(exports) === "object" && searchExports) { + for (const key in exports) { let foundModule = null; - if (exports.Z && wrappedFilter(exports.Z, module, index)) foundModule = defaultExport ? exports.Z : exports; - if (exports.ZP && wrappedFilter(exports.ZP, module, index)) foundModule = defaultExport ? exports.ZP : exports; - if (exports.__esModule && exports.default && wrappedFilter(exports.default, module, index)) foundModule = defaultExport ? exports.default : exports; - if (wrappedFilter(exports, module, index)) foundModule = exports; + const wrappedExport = exports[key]; + if (!wrappedExport) continue; + if (wrappedExport.Z && wrappedFilter(wrappedExport.Z, module, index)) foundModule = defaultExport ? wrappedExport.Z : wrappedExport; + if (wrappedExport.ZP && wrappedFilter(wrappedExport.ZP, module, index)) foundModule = defaultExport ? wrappedExport.ZP : wrappedExport; + if (wrappedExport.__esModule && wrappedExport.default && wrappedFilter(wrappedExport.default, module, index)) foundModule = defaultExport ? wrappedExport.default : wrappedExport; + if (wrappedFilter(wrappedExport, module, index)) foundModule = wrappedExport; if (!foundModule) continue; if (first) return foundModule; rm.push(foundModule); } - - } - - return first || rm.length == 0 ? undefined : rm; - } - finally { - const diff = Date.now() - start; - this.times.push(diff); - Logger.info("WebpackModules", new Error(`Search took ${(diff).toFixed(0)}ms`)); + else { + let foundModule = null; + if (exports.Z && wrappedFilter(exports.Z, module, index)) foundModule = defaultExport ? exports.Z : exports; + if (exports.ZP && wrappedFilter(exports.ZP, module, index)) foundModule = defaultExport ? exports.ZP : exports; + if (exports.__esModule && exports.default && wrappedFilter(exports.default, module, index)) foundModule = defaultExport ? exports.default : exports; + if (wrappedFilter(exports, module, index)) foundModule = exports; + if (!foundModule) continue; + if (first) return foundModule; + rm.push(foundModule); + } + + } + + return first || rm.length == 0 ? undefined : rm; } /** @@ -497,5 +490,4 @@ export default class WebpackModules { } } -WebpackModules.initialize(); -window.debugwm = WebpackModules; \ No newline at end of file +WebpackModules.initialize(); \ No newline at end of file diff --git a/renderer/src/structs/psconnection.js b/renderer/src/structs/psconnection.js index 973bdc50..c74f7360 100644 --- a/renderer/src/structs/psconnection.js +++ b/renderer/src/structs/psconnection.js @@ -9,7 +9,7 @@ const InviteActions = WebpackModules.getByProps("acceptInvite"); const betterDiscordServer = { name: "BetterDiscord", - members: 55000, + members: 110000, categories: ["community", "programming", "support"], description: "Official BetterDiscord server for plugins, themes, support, etc", identifier: "86004744966914048", diff --git a/renderer/src/ui/modals.js b/renderer/src/ui/modals.js index e68ca722..7e380efb 100644 --- a/renderer/src/ui/modals.js +++ b/renderer/src/ui/modals.js @@ -12,20 +12,20 @@ export default class Modals { static get ModalActions() { return this._ModalActions ??= { - openModal: WebpackModules.getModule(m => m?.toString().includes("onCloseCallback") && m?.toString().includes("Layer")), - closeModal: WebpackModules.getModule(m => m?.toString().includes("onCloseCallback()")) + openModal: WebpackModules.getModule(m => m?.toString().includes("onCloseCallback") && m?.toString().includes("Layer"), {searchExports: true}), + closeModal: WebpackModules.getModule(m => m?.toString().includes("onCloseCallback()"), {searchExports: true}) }; } static get ModalStack() {return this._ModalStack ??= WebpackModules.getByProps("push", "update", "pop", "popWithKey");} static get ModalComponents() {return this._ModalComponents ??= WebpackModules.getByProps("Header", "Footer");} - static get ModalRoot() {return this._ModalRoot ??= WebpackModules.getModule(m => m?.toString().includes("ENTERING"));} + static get ModalRoot() {return this._ModalRoot ??= WebpackModules.getModule(m => m?.toString?.()?.includes("ENTERING"), {searchExports: true});} static get ModalClasses() {return this._ModalClasses ??= WebpackModules.getByProps("modal", "content");} static get FlexElements() {return this._FlexElements ??= WebpackModules.getByProps("Child", "Align");} static get FormTitle() {return this._FormTitle ??= WebpackModules.getByProps("Tags", "Sizes");} static get TextElement() {return this._TextElement ??= WebpackModules.getModule(m => m?.Sizes?.SIZE_32 && m.Colors);} - static get ConfirmationModal() {return this._ConfirmationModal ??= WebpackModules.getModule(m => m?.toString()?.includes(".confirmButtonColor"));} + static get ConfirmationModal() {return this._ConfirmationModal ??= WebpackModules.getModule(m => m?.toString?.()?.includes(".confirmButtonColor"));} static get Markdown() {return this._Markdown ??= WebpackModules.find(m => m?.prototype?.render && m.rules);} - static get Buttons() {return this._Buttons ??= WebpackModules.getByProps("BorderColors");} + static get Buttons() {return this._Buttons ??= WebpackModules.getModule(m => m.BorderColors, {searchExports: true});} static get ModalQueue() {return this._ModalQueue ??= [];} static get hasModalOpen() {return !!document.getElementsByClassName("bd-modal").length;} @@ -212,7 +212,18 @@ export default class Modals { })))); } - static showChangelogModal(options = {}) { + static showChangelogModal(changelog) { + const md = [changelog.description]; + for (const type of changelog.changes) { + md.push(`**${type.title}**`); + for (const entry of type.items) { + md.push(` - ${entry}`); + } + } + Modals.showConfirmationModal(`BetterDiscord v${Config.version}`, md, {cancelText: ""}); + } + + static BROKEN_showChangelogModal(options = {}) { const ModalStack = WebpackModules.getByProps("push", "update", "pop", "popWithKey"); const ChangelogClasses = WebpackModules.getByProps("fixed", "improved"); const TextElement = WebpackModules.getByDisplayName("LegacyText");