From bff67885461a60ddd533b1dcec353efb66d4f1a0 Mon Sep 17 00:00:00 2001 From: Nuckyz <61953774+Nuckyz@users.noreply.github.com> Date: Wed, 8 Mar 2023 21:19:28 -0300 Subject: [PATCH] feat(plugins): SilentMessageToggle (#586) Co-authored-by: Ven --- src/plugins/apiContextMenu.ts | 12 ++-- src/plugins/emoteCloner.tsx | 4 +- src/plugins/reverseImageSearch.tsx | 4 +- src/plugins/silentMessageToggle.tsx | 85 +++++++++++++++++++++++++++++ 4 files changed, 94 insertions(+), 11 deletions(-) create mode 100644 src/plugins/silentMessageToggle.tsx diff --git a/src/plugins/apiContextMenu.ts b/src/plugins/apiContextMenu.ts index 69dfde4a4..1874f5f05 100644 --- a/src/plugins/apiContextMenu.ts +++ b/src/plugins/apiContextMenu.ts @@ -38,13 +38,11 @@ function listener(exports: any, id: number) { noWarn: true, find: "navId:", replacement: [{ - /** Regex explanation - * Use of https://blog.stevenlevithan.com/archives/mimic-atomic-groups to mimick atomic groups: (?=(...))\1 - * Match ${id} and look behind it for the first match of `=`: ${id}(?=(\i)=.+?) - * Match rest of the code until it finds `.${key},{`: .+?\2\.${key},{ - */ - match: RegExp(`(?=(${id}(?<=(\\i)=.+?).+?\\2\\.${key},{))\\1`, "g"), - replace: "$&contextMenuApiArguments:arguments," + match: RegExp(`${id}(?<=(\\i)=.+?).+$`), + replace: (code, varName) => { + const regex = RegExp(`${key},{(?<=${varName}\\.${key},{)`, "g"); + return code.replace(regex, "$&contextMenuApiArguments:arguments,"); + } }] }); diff --git a/src/plugins/emoteCloner.tsx b/src/plugins/emoteCloner.tsx index 7db5efddf..eba77c752 100644 --- a/src/plugins/emoteCloner.tsx +++ b/src/plugins/emoteCloner.tsx @@ -233,8 +233,8 @@ export default definePlugin({ { find: ".Messages.MESSAGE_ACTIONS_MENU_LABEL", replacement: { - match: /(?<=favoriteableType:\i,)(?<=(\i)\.getAttribute\("data-type"\).+?)/, - replace: (_, target) => `emoteClonerDataAlt:${target}.alt,` + match: /favoriteableType:\i,(?<=(\i)\.getAttribute\("data-type"\).+?)/, + replace: (m, target) => `${m}emoteClonerDataAlt:${target}.alt,` } } ], diff --git a/src/plugins/reverseImageSearch.tsx b/src/plugins/reverseImageSearch.tsx index 6335fbd9f..47954ba0f 100644 --- a/src/plugins/reverseImageSearch.tsx +++ b/src/plugins/reverseImageSearch.tsx @@ -81,8 +81,8 @@ export default definePlugin({ { find: ".Messages.MESSAGE_ACTIONS_MENU_LABEL", replacement: { - match: /(?<=favoriteableType:\i,)(?<=(\i)\.getAttribute\("data-type"\).+?)/, - replace: (_, target) => `reverseImageSearchType:${target}.getAttribute("data-role"),` + match: /favoriteableType:\i,(?<=(\i)\.getAttribute\("data-type"\).+?)/, + replace: (m, target) => `${m}reverseImageSearchType:${target}.getAttribute("data-role"),` } } ], diff --git a/src/plugins/silentMessageToggle.tsx b/src/plugins/silentMessageToggle.tsx new file mode 100644 index 000000000..09fb4e75c --- /dev/null +++ b/src/plugins/silentMessageToggle.tsx @@ -0,0 +1,85 @@ +/* + * Vencord, a modification for Discord's desktop app + * Copyright (c) 2023 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 . +*/ + +import { addPreSendListener, removePreSendListener, SendListener } from "@api/MessageEvents"; +import ErrorBoundary from "@components/ErrorBoundary"; +import { Devs } from "@utils/constants"; +import definePlugin from "@utils/types"; +import { Button, ButtonLooks, ButtonWrapperClasses, React, Tooltip } from "@webpack/common"; + +function SilentMessageToggle() { + const [enabled, setEnabled] = React.useState(false); + + React.useEffect(() => { + const listener: SendListener = (_, message) => { + if (enabled) { + setEnabled(false); + if (!message.content.startsWith("@silent ")) message.content = "@silent " + message.content; + } + }; + + addPreSendListener(listener); + return () => void removePreSendListener(listener); + }, [enabled]); + + return ( + + {tooltipProps => ( + + )} + + ); +} + +export default definePlugin({ + name: "SilentMessageToggle", + authors: [Devs.Nuckyz], + description: "Adds a button to the chat bar to toggle sending a silent message.", + patches: [ + { + find: ".activeCommandOption", + replacement: { + match: /"gift"\)\);(?<=(\i)\.push.+?)/, + replace: (m, array) => `${m}${array}.push($self.SilentMessageToggle());` + } + } + ], + + SilentMessageToggle: ErrorBoundary.wrap(SilentMessageToggle, { noop: true }), +});