diff options
author | V <vendicated@riseup.net> | 2023-06-13 02:36:25 +0200 |
---|---|---|
committer | V <vendicated@riseup.net> | 2023-06-13 03:45:05 +0200 |
commit | 07a9adbce25e42dcd4d1eb25ee011328d0543304 (patch) | |
tree | c4ea6230e57cc3a77adc53c25efb91ea148a6dea /src/plugins/_core | |
parent | 42d8211871d84e2650f7c762c66e2ee2e6c58968 (diff) | |
download | Vencord-07a9adbce25e42dcd4d1eb25ee011328d0543304.tar.gz Vencord-07a9adbce25e42dcd4d1eb25ee011328d0543304.tar.bz2 Vencord-07a9adbce25e42dcd4d1eb25ee011328d0543304.zip |
🧹🧹
Diffstat (limited to 'src/plugins/_core')
-rw-r--r-- | src/plugins/_core/noTrack.ts | 56 | ||||
-rw-r--r-- | src/plugins/_core/settings.tsx | 191 |
2 files changed, 247 insertions, 0 deletions
diff --git a/src/plugins/_core/noTrack.ts b/src/plugins/_core/noTrack.ts new file mode 100644 index 0000000..4920ce2 --- /dev/null +++ b/src/plugins/_core/noTrack.ts @@ -0,0 +1,56 @@ +/* + * Vencord, a modification for Discord's desktop app + * Copyright (c) 2022 Vendicated and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. +*/ + +import { Devs } from "@utils/constants"; +import definePlugin from "@utils/types"; + +export default definePlugin({ + name: "NoTrack", + description: "Disable Discord's tracking ('science'), metrics and Sentry crash reporting", + authors: [Devs.Cyn, Devs.Ven, Devs.Nuckyz], + required: true, + patches: [ + { + find: "TRACKING_URL:", + replacement: { + match: /^.+$/, + replace: "()=>{}", + }, + }, + { + find: "window.DiscordSentry=", + replacement: { + match: /^.+$/, + replace: "()=>{}", + } + }, + { + find: ".METRICS,", + replacement: [ + { + match: /this\._intervalId.+?12e4\)/, + replace: "" + }, + { + match: /(?<=increment=function\(\i\){)/, + replace: "return;" + } + ] + } + ] +}); diff --git a/src/plugins/_core/settings.tsx b/src/plugins/_core/settings.tsx new file mode 100644 index 0000000..3ea5a43 --- /dev/null +++ b/src/plugins/_core/settings.tsx @@ -0,0 +1,191 @@ +/* + * Vencord, a modification for Discord's desktop app + * Copyright (c) 2022 Vendicated and Megumin + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. +*/ + +import { addContextMenuPatch } from "@api/ContextMenu"; +import { Settings } from "@api/Settings"; +import { Devs } from "@utils/constants"; +import { Logger } from "@utils/Logger"; +import definePlugin, { OptionType } from "@utils/types"; +import { React, SettingsRouter } from "@webpack/common"; + +import gitHash from "~git-hash"; + +export default definePlugin({ + name: "Settings", + description: "Adds Settings UI and debug info", + authors: [Devs.Ven, Devs.Megu], + required: true, + + start() { + // The settings shortcuts in the user settings cog context menu + // read the elements from a hardcoded map which for obvious reason + // doesn't contain our sections. This patches the actions of our + // sections to manually use SettingsRouter (which only works on desktop + // but the context menu is usually not available on mobile anyway) + addContextMenuPatch("user-settings-cog", children => () => { + const section = children.find(c => Array.isArray(c) && c.some(it => it?.props?.id === "VencordSettings")) as any; + section?.forEach(c => { + if (c?.props?.id?.startsWith("Vencord")) { + c.props.action = () => SettingsRouter.open(c.props.id); + } + }); + }); + }, + + patches: [{ + find: ".versionHash", + replacement: [ + { + match: /\[\(0,.{1,3}\.jsxs?\)\((.{1,10}),(\{[^{}}]+\{.{0,20}.versionHash,.+?\})\)," "/, + replace: (m, component, props) => { + props = props.replace(/children:\[.+\]/, ""); + return `${m},Vencord.Plugins.plugins.Settings.makeInfoElements(${component}, ${props})`; + } + } + ] + }, { + find: "Messages.ACTIVITY_SETTINGS", + replacement: { + get match() { + switch (Settings.plugins.Settings.settingsLocation) { + case "top": return /\{section:(.{1,2})\.ID\.HEADER,\s*label:(.{1,2})\..{1,2}\.Messages\.USER_SETTINGS\}/; + case "aboveNitro": return /\{section:(.{1,2})\.ID\.HEADER,\s*label:(.{1,2})\..{1,2}\.Messages\.BILLING_SETTINGS\}/; + case "belowNitro": return /\{section:(.{1,2})\.ID\.HEADER,\s*label:(.{1,2})\..{1,2}\.Messages\.APP_SETTINGS\}/; + case "aboveActivity": return /\{section:(.{1,2})\.ID\.HEADER,\s*label:(.{1,2})\..{1,2}\.Messages\.ACTIVITY_SETTINGS\}/; + case "belowActivity": return /(?<=\{section:(.{1,2})\.ID\.DIVIDER},)\{section:"changelog"/; + case "bottom": return /\{section:(.{1,2})\.ID\.CUSTOM,\s*element:.+?}/; + default: { + new Logger("Settings").error( + new Error("No switch case matched????? Don't mess with the settings, silly") + ); + // matches nothing + return /(?!a)a/; + } + } + }, + replace: "...$self.makeSettingsCategories($1),$&" + } + }], + + customSections: [] as ((ID: Record<string, unknown>) => any)[], + + makeSettingsCategories({ ID }: { ID: Record<string, unknown>; }) { + return [ + { + section: ID.HEADER, + label: "Vencord" + }, + { + section: "VencordSettings", + label: "Vencord", + element: require("@components/VencordSettings/VencordTab").default + }, + { + section: "VencordPlugins", + label: "Plugins", + element: require("@components/VencordSettings/PluginsTab").default, + }, + { + section: "VencordThemes", + label: "Themes", + element: require("@components/VencordSettings/ThemesTab").default, + }, + !IS_WEB && { + section: "VencordUpdater", + label: "Updater", + element: require("@components/VencordSettings/UpdaterTab").default, + }, + { + section: "VencordCloud", + label: "Cloud", + element: require("@components/VencordSettings/CloudTab").default, + }, + { + section: "VencordSettingsSync", + label: "Backup & Restore", + element: require("@components/VencordSettings/BackupAndRestoreTab").default, + }, + IS_DEV && { + section: "VencordPatchHelper", + label: "Patch Helper", + element: require("@components/VencordSettings/PatchHelperTab").default, + }, + // TODO: make this use customSections + IS_VENCORD_DESKTOP && { + section: "VencordDesktop", + label: "Desktop Settings", + element: VencordDesktop.Components.Settings, + }, + ...this.customSections.map(func => func(ID)), + { + section: ID.DIVIDER + } + ].filter(Boolean); + }, + + options: { + settingsLocation: { + type: OptionType.SELECT, + description: "Where to put the Vencord settings section", + options: [ + { label: "At the very top", value: "top" }, + { label: "Above the Nitro section", value: "aboveNitro" }, + { label: "Below the Nitro section", value: "belowNitro" }, + { label: "Above Activity Settings", value: "aboveActivity", default: true }, + { label: "Below Activity Settings", value: "belowActivity" }, + { label: "At the very bottom", value: "bottom" }, + ], + restartNeeded: true + }, + }, + + get electronVersion() { + return VencordNative.native.getVersions().electron || window.armcord?.electron || null; + }, + + get chromiumVersion() { + try { + return VencordNative.native.getVersions().chrome + // @ts-ignore Typescript will add userAgentData IMMEDIATELY + || navigator.userAgentData?.brands?.find(b => b.brand === "Chromium" || b.brand === "Google Chrome")?.version + || null; + } catch { // inb4 some stupid browser throws unsupported error for navigator.userAgentData, it's only in chromium + return null; + } + }, + + get additionalInfo() { + if (IS_DEV) return " (Dev)"; + if (IS_WEB) return " (Web)"; + if (IS_VENCORD_DESKTOP) return ` (VencordDesktop v${VencordDesktopNative.app.getVersion()})`; + if (IS_STANDALONE) return " (Standalone)"; + return ""; + }, + + makeInfoElements(Component: React.ComponentType<React.PropsWithChildren>, props: React.PropsWithChildren) { + const { electronVersion, chromiumVersion, additionalInfo } = this; + + return ( + <> + <Component {...props}>Vencord {gitHash}{additionalInfo}</Component> + {electronVersion && <Component {...props}>Electron {electronVersion}</Component>} + {chromiumVersion && <Component {...props}>Chromium {chromiumVersion}</Component>} + </> + ); + } +}); |