Less confusing plugin names (bulk plugin rename) (#214)

Co-authored-by: Nuckyz <61953774+Nuckyz@users.noreply.github.com>
This commit is contained in:
Ven 2022-11-14 18:05:41 +01:00 committed by GitHub
parent a96f8a89f3
commit 82e444e196
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 94 additions and 45 deletions

View file

@ -19,10 +19,12 @@
import plugins from "~plugins"; import plugins from "~plugins";
import IpcEvents from "../utils/IpcEvents"; import IpcEvents from "../utils/IpcEvents";
import Logger from "../utils/Logger";
import { mergeDefaults } from "../utils/misc"; import { mergeDefaults } from "../utils/misc";
import { OptionType } from "../utils/types"; import { OptionType } from "../utils/types";
import { React } from "../webpack/common"; import { React } from "../webpack/common";
const logger = new Logger("Settings");
export interface Settings { export interface Settings {
notifyAboutUpdates: boolean; notifyAboutUpdates: boolean;
useQuickCss: boolean; useQuickCss: boolean;
@ -169,3 +171,21 @@ export function addSettingsListener(path: string, onUpdate: (newValue: any, path
(onUpdate as SubscriptionCallback)._path = path; (onUpdate as SubscriptionCallback)._path = path;
subscriptions.add(onUpdate); subscriptions.add(onUpdate);
} }
export function migratePluginSettings(name: string, ...oldNames: string[]) {
const { plugins } = settings;
if (name in plugins) return;
for (const oldName of oldNames) {
if (oldName in plugins) {
logger.info(`Migrating settings from old name ${oldName} to ${name}`);
plugins[name] = plugins[oldName];
delete plugins[oldName];
VencordNative.ipc.invoke(
IpcEvents.SET_SETTINGS,
JSON.stringify(settings, null, 4)
);
break;
}
}
}

View file

@ -16,6 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { migratePluginSettings } from "../api/settings";
import { Devs } from "../utils/constants"; import { Devs } from "../utils/constants";
import definePlugin from "../utils/types"; import definePlugin from "../utils/types";
@ -33,8 +34,9 @@ const nameMap = {
customitem: "MenuItem", customitem: "MenuItem",
}; };
migratePluginSettings("MenuItemDeobfuscatorAPI", "MenuItemDeobfuscatorApi");
export default definePlugin({ export default definePlugin({
name: "MenuItemDeobfuscatorApi", name: "MenuItemDeobfuscatorAPI",
description: "Deobfuscates Discord's Menu Item module", description: "Deobfuscates Discord's Menu Item module",
authors: [Devs.Ven], authors: [Devs.Ven],
patches: [ patches: [

View file

@ -16,11 +16,14 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { migratePluginSettings } from "../api/settings";
import { Devs } from "../utils/constants"; import { Devs } from "../utils/constants";
import definePlugin from "../utils/types"; import definePlugin from "../utils/types";
migratePluginSettings("NoticesAPI", "NoticesApi");
export default definePlugin({ export default definePlugin({
name: "NoticesApi", name: "NoticesAPI",
description: "Fixes notices being automatically dismissed", description: "Fixes notices being automatically dismissed",
authors: [Devs.Ven], authors: [Devs.Ven],
required: true, required: true,

View file

@ -21,8 +21,9 @@ import {
addPreSendListener, addPreSendListener,
MessageObject, MessageObject,
removePreEditListener, removePreEditListener,
removePreSendListener, removePreSendListener
} from "../../api/MessageEvents"; } from "../../api/MessageEvents";
import { migratePluginSettings } from "../../api/settings";
import { Devs } from "../../utils/constants"; import { Devs } from "../../utils/constants";
import definePlugin from "../../utils/types"; import definePlugin from "../../utils/types";
import { defaultRules } from "./defaultRules"; import { defaultRules } from "./defaultRules";
@ -31,8 +32,9 @@ import { defaultRules } from "./defaultRules";
const reRegExpChar = /[\\^$.*+?()[\]{}|]/g; const reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
const reHasRegExpChar = RegExp(reRegExpChar.source); const reHasRegExpChar = RegExp(reRegExpChar.source);
migratePluginSettings("ClearURLs", "clearURLs");
export default definePlugin({ export default definePlugin({
name: "clearURLs", name: "ClearURLs",
description: "Removes tracking garbage from URLs", description: "Removes tracking garbage from URLs",
authors: [Devs.adryd], authors: [Devs.adryd],
dependencies: ["MessageEventsAPI"], dependencies: ["MessageEventsAPI"],

View file

@ -16,9 +16,10 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { Settings } from "../api/settings"; import { migratePluginSettings, Settings } from "../api/settings";
import { CheckedTextInput } from "../components/CheckedTextInput"; import { CheckedTextInput } from "../components/CheckedTextInput";
import { Devs } from "../utils/constants"; import { Devs } from "../utils/constants";
import Logger from "../utils/Logger";
import { lazyWebpack, makeLazy } from "../utils/misc"; import { lazyWebpack, makeLazy } from "../utils/misc";
import { ModalContent, ModalHeader, ModalRoot, openModal } from "../utils/modal"; import { ModalContent, ModalHeader, ModalRoot, openModal } from "../utils/modal";
import definePlugin from "../utils/types"; import definePlugin from "../utils/types";
@ -60,12 +61,12 @@ async function doClone(guildId: string, id: string, name: string, isAnimated: bo
image: reader.result image: reader.result
}).then(() => { }).then(() => {
Toasts.show({ Toasts.show({
message: `Successfully yoinked ${name}!`, message: `Successfully cloned ${name}!`,
type: Toasts.Type.SUCCESS, type: Toasts.Type.SUCCESS,
id: Toasts.genId() id: Toasts.genId()
}); });
}).catch(e => { }).catch((e: any) => {
console.error("[EmoteYoink] Failed to upload emoji", e); new Logger("EmoteCloner").error("Failed to upload emoji", e);
Toasts.show({ Toasts.show({
message: "Oopsie something went wrong :( Check console!!!", message: "Oopsie something went wrong :( Check console!!!",
type: Toasts.Type.FAILURE, type: Toasts.Type.FAILURE,
@ -174,18 +175,19 @@ function CloneModal({ id, name: emojiName, isAnimated }: { id: string; name: str
); );
} }
migratePluginSettings("EmoteCloner", "EmoteYoink");
export default definePlugin({ export default definePlugin({
name: "EmoteYoink", name: "EmoteCloner",
description: "Clone emotes to your own server", description: "Adds a Clone context menu item to emotes to clone them your own server",
authors: [Devs.Ven], authors: [Devs.Ven],
dependencies: ["MenuItemDeobfuscatorApi"], dependencies: ["MenuItemDeobfuscatorAPI"],
patches: [{ patches: [{
// Literally copy pasted from ReverseImageSearch lol // Literally copy pasted from ReverseImageSearch lol
find: "open-native-link", find: "open-native-link",
replacement: { replacement: {
match: /id:"open-native-link".{0,200}\(\{href:(.{0,3}),.{0,200}\},"open-native-link"\)/, match: /id:"open-native-link".{0,200}\(\{href:(.{0,3}),.{0,200}\},"open-native-link"\)/,
replace: "$&,Vencord.Plugins.plugins.EmoteYoink.makeMenu(arguments[2])" replace: "$&,Vencord.Plugins.plugins.EmoteCloner.makeMenu(arguments[2])"
}, },
}, },
@ -214,9 +216,9 @@ export default definePlugin({
const isAnimated = new URL(htmlElement.src).pathname.endsWith(".gif"); const isAnimated = new URL(htmlElement.src).pathname.endsWith(".gif");
return <Menu.MenuItem return <Menu.MenuItem
id="yoink" id="emote-cloner"
key="yoink" key="emote-cloner"
label="Yoink" label="Clone"
action={() => action={() =>
openModal(modalProps => ( openModal(modalProps => (
<ModalRoot {...modalProps}> <ModalRoot {...modalProps}>

View file

@ -17,6 +17,7 @@
*/ */
import { addPreEditListener, addPreSendListener, removePreEditListener, removePreSendListener } from "../api/MessageEvents"; import { addPreEditListener, addPreSendListener, removePreEditListener, removePreSendListener } from "../api/MessageEvents";
import { migratePluginSettings } from "../api/settings";
import { Devs } from "../utils/constants"; import { Devs } from "../utils/constants";
import { ApngDisposeOp, getGifEncoder, importApngJs } from "../utils/dependencies"; import { ApngDisposeOp, getGifEncoder, importApngJs } from "../utils/dependencies";
import { lazyWebpack } from "../utils/misc"; import { lazyWebpack } from "../utils/misc";
@ -55,8 +56,10 @@ interface StickerPack {
stickers: Sticker[]; stickers: Sticker[];
} }
migratePluginSettings("FakeNitro", "NitroBypass");
export default definePlugin({ export default definePlugin({
name: "NitroBypass", name: "FakeNitro",
authors: [Devs.Arjix, Devs.D3SOX, Devs.Ven], authors: [Devs.Arjix, Devs.D3SOX, Devs.Ven],
description: "Allows you to stream in nitro quality and send fake emojis/stickers.", description: "Allows you to stream in nitro quality and send fake emojis/stickers.",
dependencies: ["MessageEventsAPI"], dependencies: ["MessageEventsAPI"],
@ -64,7 +67,7 @@ export default definePlugin({
patches: [ patches: [
{ {
find: "canUseAnimatedEmojis:function", find: "canUseAnimatedEmojis:function",
predicate: () => Settings.plugins.NitroBypass.enableEmojiBypass === true, predicate: () => Settings.plugins.FakeNitro.enableEmojiBypass === true,
replacement: [ replacement: [
"canUseAnimatedEmojis", "canUseAnimatedEmojis",
"canUseEmojisEverywhere" "canUseEmojisEverywhere"
@ -77,7 +80,7 @@ export default definePlugin({
}, },
{ {
find: "canUseAnimatedEmojis:function", find: "canUseAnimatedEmojis:function",
predicate: () => Settings.plugins.NitroBypass.enableStickerBypass === true, predicate: () => Settings.plugins.FakeNitro.enableStickerBypass === true,
replacement: { replacement: {
match: /canUseStickersEverywhere:function\(.+?}/, match: /canUseStickersEverywhere:function\(.+?}/,
replace: "canUseStickersEverywhere:function(e){return true;}" replace: "canUseStickersEverywhere:function(e){return true;}"
@ -92,7 +95,7 @@ export default definePlugin({
}, },
{ {
find: "canUseAnimatedEmojis:function", find: "canUseAnimatedEmojis:function",
predicate: () => Settings.plugins.NitroBypass.enableStreamQualityBypass === true, predicate: () => Settings.plugins.FakeNitro.enableStreamQualityBypass === true,
replacement: [ replacement: [
"canUseHighVideoUploadQuality", "canUseHighVideoUploadQuality",
"canStreamHighQuality", "canStreamHighQuality",
@ -106,7 +109,7 @@ export default definePlugin({
}, },
{ {
find: "STREAM_FPS_OPTION.format", find: "STREAM_FPS_OPTION.format",
predicate: () => Settings.plugins.NitroBypass.enableStreamQualityBypass === true, predicate: () => Settings.plugins.FakeNitro.enableStreamQualityBypass === true,
replacement: { replacement: {
match: /(userPremiumType|guildPremiumTier):.{0,10}TIER_\d,?/g, match: /(userPremiumType|guildPremiumTier):.{0,10}TIER_\d,?/g,
replace: "" replace: ""
@ -154,7 +157,7 @@ export default definePlugin({
}, },
getStickerLink(stickerId: string) { getStickerLink(stickerId: string) {
return `https://media.discordapp.net/stickers/${stickerId}.png?size=${Settings.plugins.NitroBypass.stickerSize}`; return `https://media.discordapp.net/stickers/${stickerId}.png?size=${Settings.plugins.FakeNitro.stickerSize}`;
}, },
async sendAnimatedSticker(stickerLink: string, stickerId: string, channelId: string) { async sendAnimatedSticker(stickerLink: string, stickerId: string, channelId: string) {
@ -167,7 +170,7 @@ export default definePlugin({
const { frames, width, height } = await parseURL(stickerLink); const { frames, width, height } = await parseURL(stickerLink);
const gif = new GIFEncoder(); const gif = new GIFEncoder();
const resolution = Settings.plugins.NitroBypass.stickerSize; const resolution = Settings.plugins.FakeNitro.stickerSize;
const canvas = document.createElement("canvas"); const canvas = document.createElement("canvas");
canvas.width = resolution; canvas.width = resolution;
@ -210,7 +213,7 @@ export default definePlugin({
}, },
start() { start() {
const settings = Settings.plugins.NitroBypass; const settings = Settings.plugins.FakeNitro;
if (!settings.enableEmojiBypass && !settings.enableStickerBypass) { if (!settings.enableEmojiBypass && !settings.enableStickerBypass) {
return; return;
} }

View file

@ -17,6 +17,7 @@
*/ */
import { addClickListener, removeClickListener } from "../api/MessageEvents"; import { addClickListener, removeClickListener } from "../api/MessageEvents";
import { migratePluginSettings } from "../api/settings";
import { Devs } from "../utils/constants"; import { Devs } from "../utils/constants";
import { lazyWebpack } from "../utils/misc"; import { lazyWebpack } from "../utils/misc";
import definePlugin from "../utils/types"; import definePlugin from "../utils/types";
@ -27,9 +28,11 @@ let isDeletePressed = false;
const keydown = (e: KeyboardEvent) => e.key === "Backspace" && (isDeletePressed = true); const keydown = (e: KeyboardEvent) => e.key === "Backspace" && (isDeletePressed = true);
const keyup = (e: KeyboardEvent) => e.key === "Backspace" && (isDeletePressed = false); const keyup = (e: KeyboardEvent) => e.key === "Backspace" && (isDeletePressed = false);
migratePluginSettings("MessageClickActions", "MessageQuickActions");
export default definePlugin({ export default definePlugin({
name: "MessageQuickActions", name: "MessageClickActions",
description: "Quick Delete, Quick edit", description: "Hold Delete and click to delete, double click to edit",
authors: [Devs.Ven], authors: [Devs.Ven],
dependencies: ["MessageEventsAPI"], dependencies: ["MessageEventsAPI"],

View file

@ -17,12 +17,14 @@
*/ */
import { findOption, OptionalMessageOption } from "../api/Commands"; import { findOption, OptionalMessageOption } from "../api/Commands";
import { migratePluginSettings } from "../api/settings";
import { Devs } from "../utils/constants"; import { Devs } from "../utils/constants";
import definePlugin from "../utils/types"; import definePlugin from "../utils/types";
migratePluginSettings("MoreKaomoji", "moarKaomojis");
export default definePlugin({ export default definePlugin({
name: "moarKaomojis", name: "MoreKaomoji",
description: "Adds more Kaomojis to discord. ヽ(´▽`)/", description: "Adds more Kaomoji to discord. ヽ(´▽`)/",
authors: [Devs.JacobTm], authors: [Devs.JacobTm],
dependencies: ["CommandsAPI"], dependencies: ["CommandsAPI"],
commands: [ commands: [

View file

@ -16,11 +16,14 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { migratePluginSettings } from "../api/settings";
import { Devs } from "../utils/constants"; import { Devs } from "../utils/constants";
import definePlugin from "../utils/types"; import definePlugin from "../utils/types";
migratePluginSettings("NoDevtoolsWarning", "STFU");
export default definePlugin({ export default definePlugin({
name: "STFU", name: "NoDevtoolsWarning",
description: "Disables the 'HOLD UP' banner in the console", description: "Disables the 'HOLD UP' banner in the console",
authors: [Devs.Ven], authors: [Devs.Ven],
patches: [{ patches: [{

View file

@ -18,6 +18,7 @@
import { Message } from "discord-types/general"; import { Message } from "discord-types/general";
import { migratePluginSettings } from "../api/settings";
import { Devs } from "../utils/constants"; import { Devs } from "../utils/constants";
import { lazyWebpack } from "../utils/misc"; import { lazyWebpack } from "../utils/misc";
import definePlugin from "../utils/types"; import definePlugin from "../utils/types";
@ -30,8 +31,10 @@ const isMac = navigator.platform.includes("Mac"); // bruh
let replyIdx = -1; let replyIdx = -1;
let editIdx = -1; let editIdx = -1;
migratePluginSettings("QuickReply", "InteractionKeybinds");
export default definePlugin({ export default definePlugin({
name: "InteractionKeybinds", name: "QuickReply",
authors: [Devs.obscurity, Devs.Ven], authors: [Devs.obscurity, Devs.Ven],
description: "Reply to (ctrl + up/down) and edit (ctrl + shift + up/down) messages via keybinds", description: "Reply to (ctrl + up/down) and edit (ctrl + shift + up/down) messages via keybinds",

View file

@ -30,9 +30,9 @@ const Engines = {
export default definePlugin({ export default definePlugin({
name: "ReverseImageSearch", name: "ReverseImageSearch",
description: "yes", description: "Adds ImageSearch to image context menus",
authors: [Devs.Ven], authors: [Devs.Ven],
dependencies: ["MenuItemDeobfuscatorApi"], dependencies: ["MenuItemDeobfuscatorAPI"],
patches: [{ patches: [{
find: "open-native-link", find: "open-native-link",
replacement: { replacement: {

View file

@ -24,7 +24,7 @@ export default definePlugin({
name: "SpotifyControls", name: "SpotifyControls",
description: "Spotify Controls", description: "Spotify Controls",
authors: [Devs.Ven, Devs.afn, Devs.KraXen72], authors: [Devs.Ven, Devs.afn, Devs.KraXen72],
dependencies: ["MenuItemDeobfuscatorApi"], dependencies: ["MenuItemDeobfuscatorAPI"],
patches: [ patches: [
{ {
find: "showTaglessAccountPanel:", find: "showTaglessAccountPanel:",

View file

@ -16,13 +16,15 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { migratePluginSettings } from "../api/settings";
import { Devs } from "../utils/constants"; import { Devs } from "../utils/constants";
import definePlugin, { OptionType } from "../utils/types"; import definePlugin, { OptionType } from "../utils/types";
import { Settings } from "../Vencord"; import { Settings } from "../Vencord";
migratePluginSettings("SpotifyCrack", "Ify");
export default definePlugin({ export default definePlugin({
name: "Ify", name: "SpotifyCrack",
description: "Disables Spotify auto-pausing, allows activity to continue playing when idling and bypasses premium checks, allowing you to listen along with others.", description: "Free listen along, no auto-pausing in voice chat, and allows activity to continue playing when idling",
authors: [ authors: [
Devs.Cyn, Devs.Cyn,
Devs.Nuckyz Devs.Nuckyz
@ -36,14 +38,14 @@ export default definePlugin({
}], }],
}, { }, {
find: '.displayName="SpotifyStore"', find: '.displayName="SpotifyStore"',
predicate: () => Settings.plugins.Ify.noSpotifyAutoPause, predicate: () => Settings.plugins.SpotifyCrack.noSpotifyAutoPause,
replacement: { replacement: {
match: /function (.{1,2})\(\).{0,200}SPOTIFY_AUTO_PAUSED\);.{0,}}}}/, match: /function (.{1,2})\(\).{0,200}SPOTIFY_AUTO_PAUSED\);.{0,}}}}/,
replace: "function $1(){}" replace: "function $1(){}"
} }
}, { }, {
find: '.displayName="SpotifyStore"', find: '.displayName="SpotifyStore"',
predicate: () => Settings.plugins.Ify.keepSpotifyActivityOnIdle, predicate: () => Settings.plugins.SpotifyCrack.keepSpotifyActivityOnIdle,
replacement: { replacement: {
match: /(shouldShowActivity=function\(\){.{1,50})&&!.{1,6}\.isIdle\(\)(.{0,}?})/, match: /(shouldShowActivity=function\(\){.{1,50})&&!.{1,6}\.isIdle\(\)(.{0,}?})/,
replace: (_, functionDeclarationAndExpression, restOfFunction) => `${functionDeclarationAndExpression}${restOfFunction}` replace: (_, functionDeclarationAndExpression, restOfFunction) => `${functionDeclarationAndExpression}${restOfFunction}`

View file

@ -17,6 +17,7 @@
*/ */
import { ApplicationCommandInputType, sendBotMessage } from "../api/Commands"; import { ApplicationCommandInputType, sendBotMessage } from "../api/Commands";
import { migratePluginSettings } from "../api/settings";
import { Devs } from "../utils/constants"; import { Devs } from "../utils/constants";
import { lazyWebpack } from "../utils/misc"; import { lazyWebpack } from "../utils/misc";
import definePlugin from "../utils/types"; import definePlugin from "../utils/types";
@ -74,9 +75,10 @@ function sendMessage(channelId, message) {
}); });
} }
migratePluginSettings("SpotifyShareCommands", "Sendify");
export default definePlugin({ export default definePlugin({
name: "Sendify", name: "SpotifyShareCommands",
description: "Send your current Spotify music to chat", description: "Share your current Spotify track, album or artist via slash command (/track, /album, /artist)",
authors: [Devs.katlyn], authors: [Devs.katlyn],
dependencies: ["CommandsAPI"], dependencies: ["CommandsAPI"],
commands: [ commands: [

View file

@ -16,6 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { migratePluginSettings } from "../api/settings";
import { Devs } from "../utils/constants"; import { Devs } from "../utils/constants";
import definePlugin from "../utils/types"; import definePlugin from "../utils/types";
import { SelectedChannelStore } from "../webpack/common"; import { SelectedChannelStore } from "../webpack/common";
@ -25,9 +26,10 @@ const timers = {} as Record<string, {
i: number; i: number;
}>; }>;
migratePluginSettings("VoiceChatDoubleClick", "vcDoubleClick");
export default definePlugin({ export default definePlugin({
name: "vcDoubleClick", name: "VoiceChatDoubleClick",
description: "Join VCs via DoubleClick instead of single click", description: "Join voice chats via double click instead of single click",
authors: [Devs.Ven, Devs.D3SOX], authors: [Devs.Ven, Devs.D3SOX],
patches: [ patches: [
{ {
@ -40,12 +42,12 @@ export default definePlugin({
// voice channels // voice channels
{ {
match: /onClick:(.*)function\(\)\{(e\.handleClick.+?)}/g, match: /onClick:(.*)function\(\)\{(e\.handleClick.+?)}/g,
replace: "onClick:$1function(){Vencord.Plugins.plugins.vcDoubleClick.schedule(()=>{$2}, e)}", replace: "onClick:$1function(){Vencord.Plugins.plugins.VoiceChatDoubleClick.schedule(()=>{$2}, e)}",
}, },
// stage channels // stage channels
{ {
match: /onClick:(.{0,15})this\.handleClick,/g, match: /onClick:(.{0,15})this\.handleClick,/g,
replace: "onClick:$1(...args)=>Vencord.Plugins.plugins.vcDoubleClick.schedule(()=>{this.handleClick(...args);}, args[0]),", replace: "onClick:$1(...args)=>Vencord.Plugins.plugins.VoiceChatDoubleClick.schedule(()=>{this.handleClick(...args);}, args[0]),",
} }
], ],
}, },

View file

@ -36,7 +36,7 @@ export default new class ViewIcons implements PluginDef {
authors = [Devs.Ven]; authors = [Devs.Ven];
description = "Makes Avatars/Banners in user profiles clickable, and adds Guild Context Menu Entries to View Banner/Icon."; description = "Makes Avatars/Banners in user profiles clickable, and adds Guild Context Menu Entries to View Banner/Icon.";
dependencies = ["MenuItemDeobfuscatorApi"]; dependencies = ["MenuItemDeobfuscatorAPI"];
openImage(url: string) { openImage(url: string) {
const u = new URL(url); const u = new URL(url);

View file

@ -216,10 +216,10 @@ interface Menu {
/** /**
* Discord's Context menu items. * Discord's Context menu items.
* To use anything but Menu.ContextMenu, your plugin HAS TO * To use anything but Menu.ContextMenu, your plugin HAS TO
* depend on MenuItemDeobfuscatorApi. Otherwise they will throw * depend on MenuItemDeobfuscatorAPI. Otherwise they will throw
*/ */
export const Menu = proxyLazy(() => { export const Menu = proxyLazy(() => {
const hasDeobfuscator = Vencord.Settings.plugins.MenuItemDeobfuscatorApi.enabled; const hasDeobfuscator = Vencord.Settings.plugins.MenuItemDeobfuscatorAPI.enabled;
const menuItems = ["MenuSeparator", "MenuGroup", "MenuItem", "MenuCheckboxItem", "MenuRadioItem", "MenuControlItem"]; const menuItems = ["MenuSeparator", "MenuGroup", "MenuItem", "MenuCheckboxItem", "MenuRadioItem", "MenuControlItem"];
const map = mapMangledModule("♫ ⊂(。◕‿‿◕。⊂) ♪", { const map = mapMangledModule("♫ ⊂(。◕‿‿◕。⊂) ♪", {