aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVendicated <vendicated@riseup.net>2023-04-04 22:19:52 +0200
committerVendicated <vendicated@riseup.net>2023-04-04 22:19:52 +0200
commit8ad710abca9effc4b27c63ae2ab6ad3bc362ee4a (patch)
tree69fb2c62364f31028be842de9fb6c4e25ea45146 /src
parent368cb7bc6bc2d066b3ebb180d854d44697e8fa2d (diff)
downloadVencord-8ad710abca9effc4b27c63ae2ab6ad3bc362ee4a.tar.gz
Vencord-8ad710abca9effc4b27c63ae2ab6ad3bc362ee4a.tar.bz2
Vencord-8ad710abca9effc4b27c63ae2ab6ad3bc362ee4a.zip
Fix ContextMenuAPI
Diffstat (limited to 'src')
-rw-r--r--src/plugins/apiContextMenu.ts76
1 files changed, 10 insertions, 66 deletions
diff --git a/src/plugins/apiContextMenu.ts b/src/plugins/apiContextMenu.ts
index 88a1eb9..aeaa0c4 100644
--- a/src/plugins/apiContextMenu.ts
+++ b/src/plugins/apiContextMenu.ts
@@ -16,77 +16,13 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-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:[],"
+ }
}
]
});