From 230b4741a4207d6593be17a73fe2a38c64a22fda Mon Sep 17 00:00:00 2001 From: Zerebos Date: Mon, 4 Mar 2024 14:36:21 -0500 Subject: [PATCH] Add debug info to version section --- renderer/src/ui/settings.js | 75 +++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/renderer/src/ui/settings.js b/renderer/src/ui/settings.js index ca167511..50000085 100644 --- a/renderer/src/ui/settings.js +++ b/renderer/src/ui/settings.js @@ -1,3 +1,5 @@ +import Config from "@data/config"; + import React from "@modules/react"; import Strings from "@modules/strings"; import Utilities from "@modules/utilities"; @@ -7,6 +9,8 @@ import DataStore from "@modules/datastore"; import WebpackModules, {Filters} from "@modules/webpackmodules"; import Patcher from "@modules/patcher"; import DiscordModules from "@modules/discordmodules"; +import PluginManager from "@modules/pluginmanager"; +import ThemeManager from "@modules/thememanager"; import ReactUtils from "@modules/api/reactutils"; @@ -19,6 +23,7 @@ import SettingsTitle from "@ui/settings/title"; import Header from "@ui/settings/sidebarheader"; import Restore from "./icons/restore"; +import Text from "./base/text"; // import SettingsPanel from "./settings/panel"; @@ -51,10 +56,32 @@ function confirmReset(action) { }; } +function getDebugInfo(discordInfo, pluginsEnabled, themesEnabled) { + const lines = ["```md", `## Discord Info\n${discordInfo}\n`]; + lines.push(`## BetterDiscord`); + lines.push(`stable ${Config.version}\n`); + lines.push(`### Plugins (${pluginsEnabled} Enabled):\n${PluginManager.addonList.map(a => `- ${a.name}${PluginManager.isEnabled(a.id) ? " (Enabled)" : ""}`).join("\n")}\n`); + lines.push(`### Themes (${themesEnabled} Enabled):\n${ThemeManager.addonList.map(a => `- ${a.name}${ThemeManager.isEnabled(a.id) ? " (Enabled)" : ""}`).join("\n")}`); + lines.push("```"); + return lines.join("\n"); +} + +/** + * + * @param {string} type plugin or theme + * @returns {{total: number, enabled: number}} + */ +function getAddonCount(type) { + if (type === "theme") return {total: ThemeManager.addonList.length, enabled: ThemeManager.addonList.filter(p => ThemeManager.isEnabled(p.id)).length}; + if (type === "plugin") return {total: PluginManager.addonList.length, enabled: PluginManager.addonList.filter(p => PluginManager.isEnabled(p.id)).length}; + return {total: 0, enabled: 0}; +} + export default new class SettingsRenderer { constructor() { this.patchSections(); + this.patchVersionInformation(); Events.on("strings-updated", this.forceUpdate); } @@ -147,6 +174,54 @@ export default new class SettingsRenderer { }); } + async patchVersionInformation() { + const versionDisplayModule = await WebpackModules.getLazy(Filters.byStrings("RELEASE_CHANNEL", "COPY_VERSION"), {defaultExport: false}); + if (!versionDisplayModule?.default) return; + + Patcher.after("SettingsManager", versionDisplayModule, "default", (_, __, reactTree) => { + const currentCopy = reactTree?.props?.copyValue; + const target = reactTree?.props?.children?.props?.children; + + // Do some sanity checking to make sure this is both the right component + // and that it's in the format we expect + if (!Array.isArray(target) || !currentCopy) return; + + + const [pluginCount, setPluginCount] = React.useState(getAddonCount("plugin")); + const [themeCount, setThemeCount] = React.useState(getAddonCount("theme")); + + React.useEffect(() => { + const hooks = [setPluginCount, setThemeCount]; + const handlers = {}; + const types = ["plugin", "theme"]; + const events = ["enabled", "disabled", "loaded", "unloaded"]; + + // Set handlers and add event listeners + for (let t = 0; t < types.length; t++) { + handlers[types[t]] = () => hooks[t](getAddonCount(types[t])); + for (let e = 0; e < events.length; e++) { + Events.on(`${types[t]}-${events[e]}`, handlers[types[t]]); + } + } + return () => { + // Remove event listeners + for (let t = 0; t < types.length; t++) { + for (let e = 0; e < events.length; e++) { + Events.off(`${types[t]}-${events[e]}`, handlers[types[t]]); + } + } + }; + }, []); + + + Object.assign(reactTree.props, {get copyValue() {return getDebugInfo(currentCopy, pluginCount.enabled, themeCount.enabled);}}); + + target.push(BetterDiscord {Config.version}); + target.push({Strings.Panels.plugins} {pluginCount.total} ({pluginCount.enabled} {Strings.Addons.isEnabled})); + target.push({Strings.Panels.themes} {themeCount.total} ({themeCount.enabled} {Strings.Addons.isEnabled})); + }); + } + forceUpdate() { const viewClass = WebpackModules.getByProps("standardSidebarView")?.standardSidebarView.split(" ")[0]; const node = document.querySelector(`.${viewClass}`);