From 8ad710abca9effc4b27c63ae2ab6ad3bc362ee4a Mon Sep 17 00:00:00 2001 From: Vendicated Date: Tue, 4 Apr 2023 22:19:52 +0200 Subject: [PATCH] Fix ContextMenuAPI --- src/plugins/apiContextMenu.ts | 76 +++++------------------------------ 1 file changed, 10 insertions(+), 66 deletions(-) diff --git a/src/plugins/apiContextMenu.ts b/src/plugins/apiContextMenu.ts index 88a1eb9c..aeaa0c4d 100644 --- a/src/plugins/apiContextMenu.ts +++ b/src/plugins/apiContextMenu.ts @@ -16,77 +16,13 @@ * along with this program. If not, see . */ -import { Settings } from "@api/settings"; import { Devs } from "@utils/constants"; -import definePlugin, { type PatchReplacement } from "@utils/types"; -import { addListener, removeListener } from "@webpack"; - -/** - * The last var name corresponding to the Context Menu API (Discord, not ours) module - */ -let lastVarName = ""; - -/** - * @param target The patch replacement object - * @param exportKey The key exporting the build Context Menu component function - */ -function makeReplacementProxy(target: PatchReplacement, exportKey: string) { - return new Proxy(target, { - get(_, p) { - if (p === "match") return RegExp(`${exportKey},{(?<=${lastVarName}\\.${exportKey},{)`, "g"); - // @ts-expect-error - return Reflect.get(...arguments); - } - }); -} - -function listener(exports: any, id: number) { - if (!Settings.plugins.ContextMenuAPI.enabled) return removeListener(listener); - - if (typeof exports !== "object" || exports === null) return; - - for (const key in exports) if (key.length <= 3) { - const prop = exports[key]; - if (typeof prop !== "function") continue; - - const str = Function.prototype.toString.call(prop); - if (str.includes('path:["empty"]')) { - Vencord.Plugins.patches.push({ - plugin: "ContextMenuAPI", - all: true, - noWarn: true, - find: "navId:", - replacement: [ - { - // Set the lastVarName for our proxy to use - match: RegExp(`${id}(?<=(\\i)=.+?)`), - replace: (id, varName) => { - lastVarName = varName; - return id; - } - }, - /** - * We are using a proxy here to utilize the whole code the patcher gives us, instead of matching the entire module (which is super slow) - * Our proxy returns the corresponding match for that module utilizing lastVarName, which is set by the patch before - */ - makeReplacementProxy({ - match: "", // Needed to canonicalizeDescriptor - replace: "$&contextMenuApiArguments:arguments,", - }, key) - ] - }); - - removeListener(listener); - } - } -} - -addListener(listener); +import definePlugin from "@utils/types"; export default definePlugin({ name: "ContextMenuAPI", description: "API for adding/removing items to/from context menus.", - authors: [Devs.Nuckyz], + authors: [Devs.Nuckyz, Devs.Ven], patches: [ { find: "♫ (つ。◕‿‿◕。)つ ♪", @@ -94,6 +30,14 @@ export default definePlugin({ match: /(?<=function \i\((\i)\){)(?=var \i,\i=\i\.navId)/, replace: (_, props) => `Vencord.Api.ContextMenu._patchContextMenu(${props});` } + }, + { + find: ".Menu,{", + all: true, + replacement: { + match: /(?<=\.jsxs?\)\(\i\.Menu,)\{/, + replace: "{contextMenuApiArguments:typeof arguments!=='undefined'?arguments:[]," + } } ] });