From 1fdfd6f30528f4d02c5fc07319d65c2e7763a546 Mon Sep 17 00:00:00 2001 From: Nuckyz <61953774+Nuckyz@users.noreply.github.com> Date: Fri, 23 May 2025 22:07:48 -0300 Subject: [PATCH 1/7] Fix broken UserSettingsAPI patch --- src/plugins/_api/userSettings.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/_api/userSettings.ts b/src/plugins/_api/userSettings.ts index 3a00bc11..559de369 100644 --- a/src/plugins/_api/userSettings.ts +++ b/src/plugins/_api/userSettings.ts @@ -30,8 +30,8 @@ export default definePlugin({ replacement: [ // Main setting definition { - match: /(?<=INFREQUENT_USER_ACTION.{0,20},)useSetting:/, - replace: "userSettingsAPIGroup:arguments[0],userSettingsAPIName:arguments[1],$&" + match: /\.updateAsync\(.+?(?=,useSetting:)/, + replace: "$&,userSettingsAPIGroup:arguments[0],userSettingsAPIName:arguments[1]" }, // Selective wrapper { From 6ea960cf90cef607697b57e1e17db155549f75f3 Mon Sep 17 00:00:00 2001 From: sadan4 <117494111+sadan4@users.noreply.github.com> Date: Fri, 23 May 2025 21:14:36 -0400 Subject: [PATCH 2/7] NoUnblockToJump: Fix outdated plugin description (#3422) --- src/plugins/noUnblockToJump/README.md | 2 +- src/plugins/noUnblockToJump/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/noUnblockToJump/README.md b/src/plugins/noUnblockToJump/README.md index 326bca3b..630ef7dc 100644 --- a/src/plugins/noUnblockToJump/README.md +++ b/src/plugins/noUnblockToJump/README.md @@ -1,5 +1,5 @@ # No Unblock To Jump -Removes the popup preventing you to jump to a message from a blocked/ignored user (eg: in search results) +Removes the popup preventing you to jump to a message from a blocked/ignored user or likely spammer (eg: in search results) ![A modal popup telling you to unblock a user to jump their message](https://github.com/user-attachments/assets/0e4b859d-f3b3-4101-9a83-829afb473d1e) diff --git a/src/plugins/noUnblockToJump/index.ts b/src/plugins/noUnblockToJump/index.ts index cb379bf8..b36a2e24 100644 --- a/src/plugins/noUnblockToJump/index.ts +++ b/src/plugins/noUnblockToJump/index.ts @@ -21,7 +21,7 @@ import definePlugin from "@utils/types"; export default definePlugin({ name: "NoUnblockToJump", - description: "Allows you to jump to messages of blocked users without unblocking them", + description: "Allows you to jump to messages of blocked or ignored users and likely spammers without unblocking them", authors: [Devs.dzshn], patches: [ { From f030937bfa1bdec4e740c680f9f207fc7def7869 Mon Sep 17 00:00:00 2001 From: Vendicated Date: Sat, 24 May 2025 18:33:30 +0200 Subject: [PATCH 3/7] clean up some misleading plugin names --- src/plugins/arRPC.web/index.tsx | 4 +--- src/plugins/{customidle => customIdle}/README.md | 0 src/plugins/{customidle => customIdle}/index.ts | 0 src/plugins/{emoteCloner => expressionCloner}/index.tsx | 8 +++++--- src/plugins/{lastfm => lastfmRichPresence}/index.tsx | 0 5 files changed, 6 insertions(+), 6 deletions(-) rename src/plugins/{customidle => customIdle}/README.md (100%) rename src/plugins/{customidle => customIdle}/index.ts (100%) rename src/plugins/{emoteCloner => expressionCloner}/index.tsx (97%) rename src/plugins/{lastfm => lastfmRichPresence}/index.tsx (100%) diff --git a/src/plugins/arRPC.web/index.tsx b/src/plugins/arRPC.web/index.tsx index 94c507f3..426b9a9b 100644 --- a/src/plugins/arRPC.web/index.tsx +++ b/src/plugins/arRPC.web/index.tsx @@ -42,6 +42,7 @@ export default definePlugin({ description: "Client plugin for arRPC to enable RPC on Discord Web (experimental)", authors: [Devs.Ducko], reporterTestable: ReporterTestable.None, + hidden: IS_VESKTOP || "legcord" in window, settingsAboutComponent: () => ( <> @@ -73,9 +74,6 @@ export default definePlugin({ }, async start() { - // Legcord comes with its own arRPC implementation, so this plugin just confuses users - if ("legcord" in window) return; - if (ws) ws.close(); ws = new WebSocket("ws://127.0.0.1:1337"); // try to open WebSocket diff --git a/src/plugins/customidle/README.md b/src/plugins/customIdle/README.md similarity index 100% rename from src/plugins/customidle/README.md rename to src/plugins/customIdle/README.md diff --git a/src/plugins/customidle/index.ts b/src/plugins/customIdle/index.ts similarity index 100% rename from src/plugins/customidle/index.ts rename to src/plugins/customIdle/index.ts diff --git a/src/plugins/emoteCloner/index.tsx b/src/plugins/expressionCloner/index.tsx similarity index 97% rename from src/plugins/emoteCloner/index.tsx rename to src/plugins/expressionCloner/index.tsx index ffc2307e..3a73489c 100644 --- a/src/plugins/emoteCloner/index.tsx +++ b/src/plugins/expressionCloner/index.tsx @@ -17,6 +17,7 @@ */ import { findGroupChildrenByChildId, NavContextMenuPatchCallback } from "@api/ContextMenu"; +import { migratePluginSettings } from "@api/Settings"; import { CheckedTextInput } from "@components/CheckedTextInput"; import { Devs } from "@utils/constants"; import { Logger } from "@utils/Logger"; @@ -165,7 +166,7 @@ async function doClone(guildId: string, data: Sticker | Emoji) { message = JSON.parse(e.text).message; } catch { } - new Logger("EmoteCloner").error("Failed to clone", data.name, "to", guildId, e); + new Logger("ExpressionCloner").error("Failed to clone", data.name, "to", guildId, e); Toasts.show({ message: "Failed to clone: " + message, type: Toasts.Type.FAILURE, @@ -364,10 +365,11 @@ const expressionPickerPatch: NavContextMenuPatchCallback = (children, props: { t } }; +migratePluginSettings("ExpressionCloner", "EmoteCloner"); export default definePlugin({ - name: "EmoteCloner", + name: "ExpressionCloner", description: "Allows you to clone Emotes & Stickers to your own server (right click them)", - tags: ["StickerCloner"], + tags: ["StickerCloner", "EmoteCloner", "EmojiCloner"], authors: [Devs.Ven, Devs.Nuckyz], contextMenus: { "message": messageContextMenuPatch, diff --git a/src/plugins/lastfm/index.tsx b/src/plugins/lastfmRichPresence/index.tsx similarity index 100% rename from src/plugins/lastfm/index.tsx rename to src/plugins/lastfmRichPresence/index.tsx From d7e6fcd3ae2dad93a27348e683453a4c912208e8 Mon Sep 17 00:00:00 2001 From: Vendicated Date: Sat, 24 May 2025 18:33:55 +0200 Subject: [PATCH 4/7] Delete MoreKaomoji plugin This plugin is very niche and can easily be replicated using the TextReplace plugin --- src/plugins/moreKaomoji/index.ts | 47 -------------------------------- 1 file changed, 47 deletions(-) delete mode 100644 src/plugins/moreKaomoji/index.ts diff --git a/src/plugins/moreKaomoji/index.ts b/src/plugins/moreKaomoji/index.ts deleted file mode 100644 index 9a691fc4..00000000 --- a/src/plugins/moreKaomoji/index.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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 . -*/ - -import { findOption, OptionalMessageOption } from "@api/Commands"; -import { Devs } from "@utils/constants"; -import definePlugin from "@utils/types"; - -export default definePlugin({ - name: "MoreKaomoji", - description: "Adds more Kaomoji to discord. ヽ(´▽`)/", - authors: [Devs.JacobTm], - commands: [ - { name: "dissatisfaction", description: " >﹏<" }, - { name: "smug", description: "ಠ_ಠ" }, - { name: "happy", description: "ヽ(´▽`)/" }, - { name: "crying", description: "ಥ_ಥ" }, - { name: "angry", description: "ヽ(`Д´)ノ" }, - { name: "anger", description: "ヽ(o`皿′o)ノ" }, - { name: "joy", description: "<( ̄︶ ̄)>" }, - { name: "blush", description: "૮ ˶ᵔ ᵕ ᵔ˶ ა" }, - { name: "confused", description: "(•ิ_•ิ)?" }, - { name: "sleeping", description: "(ᴗ_ᴗ)" }, - { name: "laughing", description: "o(≧▽≦)o" }, - - ].map(data => ({ - ...data, - options: [OptionalMessageOption], - execute: opts => ({ - content: findOption(opts, "message", "") + " " + data.description - }) - })) -}); From 600a95f751c5977f47d64aaa97fdbfd3f324504e Mon Sep 17 00:00:00 2001 From: Vendicated Date: Sat, 24 May 2025 18:34:42 +0200 Subject: [PATCH 5/7] Delete Moyai plugin This plugin is funny but ultimately useless and leads to a lot of confusion from users enabling it by mistake --- src/plugins/moyai/index.ts | 177 ------------------------------------- 1 file changed, 177 deletions(-) delete mode 100644 src/plugins/moyai/index.ts diff --git a/src/plugins/moyai/index.ts b/src/plugins/moyai/index.ts deleted file mode 100644 index 649b1fbb..00000000 --- a/src/plugins/moyai/index.ts +++ /dev/null @@ -1,177 +0,0 @@ -/* - * 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 . -*/ - -import { definePluginSettings } from "@api/Settings"; -import { makeRange } from "@components/PluginSettings/components/SettingSliderComponent"; -import { Devs } from "@utils/constants"; -import { sleep } from "@utils/misc"; -import definePlugin, { OptionType } from "@utils/types"; -import { RelationshipStore, SelectedChannelStore, UserStore } from "@webpack/common"; -import { Message, ReactionEmoji } from "discord-types/general"; - -interface IMessageCreate { - type: "MESSAGE_CREATE"; - optimistic: boolean; - isPushNotification: boolean; - channelId: string; - message: Message; -} - -interface IReactionAdd { - type: "MESSAGE_REACTION_ADD"; - optimistic: boolean; - channelId: string; - messageId: string; - messageAuthorId: string; - userId: "195136840355807232"; - emoji: ReactionEmoji; -} - -interface IVoiceChannelEffectSendEvent { - type: string; - emoji?: ReactionEmoji; // Just in case... - channelId: string; - userId: string; - animationType: number; - animationId: number; -} - -const MOYAI = "🗿"; -const MOYAI_URL = - "https://raw.githubusercontent.com/MeguminSama/VencordPlugins/main/plugins/moyai/moyai.mp3"; -const MOYAI_URL_HD = - "https://raw.githubusercontent.com/MeguminSama/VencordPlugins/main/plugins/moyai/moyai_hd.wav"; - -const settings = definePluginSettings({ - volume: { - description: "Volume of the 🗿🗿🗿", - type: OptionType.SLIDER, - markers: makeRange(0, 1, 0.1), - default: 0.5, - stickToMarkers: false - }, - quality: { - description: "Quality of the 🗿🗿🗿", - type: OptionType.SELECT, - options: [ - { label: "Normal", value: "Normal", default: true }, - { label: "HD", value: "HD" } - ], - }, - triggerWhenUnfocused: { - description: "Trigger the 🗿 even when the window is unfocused", - type: OptionType.BOOLEAN, - default: true - }, - ignoreBots: { - description: "Ignore bots", - type: OptionType.BOOLEAN, - default: true - }, - ignoreBlocked: { - description: "Ignore blocked users", - type: OptionType.BOOLEAN, - default: true - } -}); - -export default definePlugin({ - name: "Moyai", - authors: [Devs.Megu, Devs.Nuckyz], - description: "🗿🗿🗿🗿🗿🗿🗿🗿", - settings, - - flux: { - async MESSAGE_CREATE({ optimistic, type, message, channelId }: IMessageCreate) { - if (optimistic || type !== "MESSAGE_CREATE") return; - if (message.state === "SENDING") return; - if (settings.store.ignoreBots && message.author?.bot) return; - if (settings.store.ignoreBlocked && RelationshipStore.isBlocked(message.author?.id)) return; - if (!message.content) return; - if (channelId !== SelectedChannelStore.getChannelId()) return; - - const moyaiCount = getMoyaiCount(message.content); - - for (let i = 0; i < moyaiCount; i++) { - boom(); - await sleep(300); - } - }, - - MESSAGE_REACTION_ADD({ optimistic, type, channelId, userId, messageAuthorId, emoji }: IReactionAdd) { - if (optimistic || type !== "MESSAGE_REACTION_ADD") return; - if (settings.store.ignoreBots && UserStore.getUser(userId)?.bot) return; - if (settings.store.ignoreBlocked && RelationshipStore.isBlocked(messageAuthorId)) return; - if (channelId !== SelectedChannelStore.getChannelId()) return; - - const name = emoji.name.toLowerCase(); - if (name !== MOYAI && !name.includes("moyai") && !name.includes("moai")) return; - - boom(); - }, - - VOICE_CHANNEL_EFFECT_SEND({ emoji }: IVoiceChannelEffectSendEvent) { - if (!emoji?.name) return; - const name = emoji.name.toLowerCase(); - if (name !== MOYAI && !name.includes("moyai") && !name.includes("moai")) return; - - boom(); - } - } -}); - -function countOccurrences(sourceString: string, subString: string) { - let i = 0; - let lastIdx = 0; - while ((lastIdx = sourceString.indexOf(subString, lastIdx) + 1) !== 0) - i++; - - return i; -} - -function countMatches(sourceString: string, pattern: RegExp) { - if (!pattern.global) - throw new Error("pattern must be global"); - - let i = 0; - while (pattern.test(sourceString)) - i++; - - return i; -} - -const customMoyaiRe = //gi; - -function getMoyaiCount(message: string) { - const count = countOccurrences(message, MOYAI) - + countMatches(message, customMoyaiRe); - - return Math.min(count, 10); -} - -function boom() { - if (!settings.store.triggerWhenUnfocused && !document.hasFocus()) return; - const audioElement = document.createElement("audio"); - - audioElement.src = settings.store.quality === "HD" - ? MOYAI_URL_HD - : MOYAI_URL; - - audioElement.volume = settings.store.volume; - audioElement.play(); -} From 0985d2c8cdc7ce88f8f5e78db18305eccffb9970 Mon Sep 17 00:00:00 2001 From: Vendicated Date: Sat, 24 May 2025 18:36:17 +0200 Subject: [PATCH 6/7] Delete NoRPC plugin This plugin is incredibly niche and leads to a lot of confusion for users enabling it by mistake. If you want to avoid Discord scanning processes on your system, consider using third party desktop clients like Vesktop or Legcord --- src/plugins/noRPC.discordDesktop/index.ts | 35 ----------------------- 1 file changed, 35 deletions(-) delete mode 100644 src/plugins/noRPC.discordDesktop/index.ts diff --git a/src/plugins/noRPC.discordDesktop/index.ts b/src/plugins/noRPC.discordDesktop/index.ts deleted file mode 100644 index 4c6319e5..00000000 --- a/src/plugins/noRPC.discordDesktop/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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 . -*/ - -import { Devs } from "@utils/constants"; -import definePlugin from "@utils/types"; - -export default definePlugin({ - name: "NoRPC", - description: "Disables Discord's RPC server.", - authors: [Devs.Cyn], - patches: [ - { - find: '.ensureModule("discord_rpc")', - replacement: { - match: /\.ensureModule\("discord_rpc"\)\.then\(\(.+?\)}\)}/, - replace: '.ensureModule("discord_rpc")}', - }, - }, - ], -}); From a9dc81e60037546cab914442018ac3ca4cefc1d2 Mon Sep 17 00:00:00 2001 From: Vendicated Date: Sat, 24 May 2025 18:39:36 +0200 Subject: [PATCH 7/7] Delete Partymode plugin This plugin is useless. You can just enable party mode via the easter egg --- src/plugins/partyMode/index.ts | 109 --------------------------------- 1 file changed, 109 deletions(-) delete mode 100644 src/plugins/partyMode/index.ts diff --git a/src/plugins/partyMode/index.ts b/src/plugins/partyMode/index.ts deleted file mode 100644 index f7cddbf9..00000000 --- a/src/plugins/partyMode/index.ts +++ /dev/null @@ -1,109 +0,0 @@ -/* - * 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 { definePluginSettings } from "@api/Settings"; -import { Devs } from "@utils/constants"; -import definePlugin, { OptionType, ReporterTestable } from "@utils/types"; -import { FluxDispatcher } from "@webpack/common"; - -const enum Intensity { - Normal, - Better, - ProjectX, -} - -const settings = definePluginSettings({ - superIntensePartyMode: { - description: "Party intensity", - type: OptionType.SELECT, - options: [ - { label: "Normal", value: Intensity.Normal, default: true }, - { label: "Better", value: Intensity.Better }, - { label: "Project X", value: Intensity.ProjectX }, - ], - restartNeeded: false, - onChange: setSettings - }, -}); - -export default definePlugin({ - name: "PartyMode", - description: "Allows you to use party mode cause the party never ends ✨", - authors: [Devs.UwUDev], - reporterTestable: ReporterTestable.None, - settings, - - start() { - setPoggerState(true); - setSettings(settings.store.superIntensePartyMode); - }, - - stop() { - setPoggerState(false); - }, -}); - -function setPoggerState(state: boolean) { - FluxDispatcher.dispatch({ - type: "POGGERMODE_SETTINGS_UPDATE", - settings: { - enabled: state, - settingsVisible: state - } - }); -} - -function setSettings(intensity: Intensity) { - const state = { - screenshakeEnabledLocations: { 0: true, 1: true, 2: true }, - shakeIntensity: 1, - confettiSize: 16, - confettiCount: 5, - combosRequiredCount: 1 - }; - - switch (intensity) { - case Intensity.Normal: { - Object.assign(state, { - screenshakeEnabledLocations: { 0: true, 1: false, 2: false }, - combosRequiredCount: 5 - }); - break; - } - case Intensity.Better: { - Object.assign(state, { - confettiSize: 12, - confettiCount: 8, - }); - break; - } - case Intensity.ProjectX: { - Object.assign(state, { - shakeIntensity: 20, - confettiSize: 25, - confettiCount: 15, - }); - break; - } - } - - FluxDispatcher.dispatch({ - type: "POGGERMODE_SETTINGS_UPDATE", - settings: state - }); -}