From b2d5c00a23e598ee398c0045e9f44b4eeff569d4 Mon Sep 17 00:00:00 2001
From: Nuckyz <61953774+Nuckyz@users.noreply.github.com>
Date: Thu, 30 Jan 2025 16:01:36 -0300
Subject: [PATCH 1/6] Delete NoScreensharePreview ~now a stock feature
---
src/plugins/noScreensharePreview/index.ts | 42 -----------------------
1 file changed, 42 deletions(-)
delete mode 100644 src/plugins/noScreensharePreview/index.ts
diff --git a/src/plugins/noScreensharePreview/index.ts b/src/plugins/noScreensharePreview/index.ts
deleted file mode 100644
index d4bb9c1eb..000000000
--- a/src/plugins/noScreensharePreview/index.ts
+++ /dev/null
@@ -1,42 +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 { getUserSettingLazy } from "@api/UserSettings";
-import { Devs } from "@utils/constants";
-import definePlugin from "@utils/types";
-
-const DisableStreamPreviews = getUserSettingLazy("voiceAndVideo", "disableStreamPreviews")!;
-
-// @TODO: Delete this plugin in the future
-export default definePlugin({
- name: "NoScreensharePreview",
- description: "Disables screenshare previews from being sent.",
- authors: [Devs.Nuckyz],
-
- start() {
- if (!DisableStreamPreviews.getSetting()) {
- DisableStreamPreviews.updateSetting(true);
- }
- },
-
- stop() {
- if (DisableStreamPreviews.getSetting()) {
- DisableStreamPreviews.updateSetting(false);
- }
- }
-});
From 414539f45ecc24bf78878a76de0569f6d14ab375 Mon Sep 17 00:00:00 2001
From: Nuckyz <61953774+Nuckyz@users.noreply.github.com>
Date: Thu, 30 Jan 2025 16:01:57 -0300
Subject: [PATCH 2/6] Add more FIXME and explain better TODOS for migrations
---
src/plugins/_api/chatButtons.ts | 1 +
src/plugins/_core/settings.tsx | 1 +
src/plugins/ctrlEnterSend/index.ts | 1 +
src/plugins/fakeNitro/index.tsx | 1 +
src/plugins/messageTags/index.ts | 2 +-
src/plugins/openInApp/index.ts | 1 +
src/plugins/permissionFreeWill/index.ts | 1 +
src/plugins/pinDms/data.ts | 2 +-
src/plugins/showHiddenChannels/index.tsx | 4 ++++
src/plugins/textReplace/index.tsx | 2 +-
10 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/src/plugins/_api/chatButtons.ts b/src/plugins/_api/chatButtons.ts
index 86ca195e0..184b01584 100644
--- a/src/plugins/_api/chatButtons.ts
+++ b/src/plugins/_api/chatButtons.ts
@@ -16,6 +16,7 @@ export default definePlugin({
{
find: '"sticker")',
replacement: {
+ // FIXME(Bundler change related): Remove old compatiblity once enough time has passed
match: /return\((!)?\i\.\i(?:\|\||&&)(?=\(\i\.isDM.+?(\i)\.push)/,
replace: (m, not, children) => not
? `${m}(Vencord.Api.ChatButtons._injectButtons(${children},arguments[0]),true)&&`
diff --git a/src/plugins/_core/settings.tsx b/src/plugins/_core/settings.tsx
index 75fa91470..f48f38e03 100644
--- a/src/plugins/_core/settings.tsx
+++ b/src/plugins/_core/settings.tsx
@@ -65,6 +65,7 @@ export default definePlugin({
replace: (_, sectionTypes, commaOrSemi, elements, element) => `${commaOrSemi} $self.addSettings(${elements}, ${element}, ${sectionTypes}) ${commaOrSemi}`
},
{
+ // FIXME(Bundler change related): Remove old compatiblity once enough time has passed
match: /({(?=.+?function (\i).{0,160}(\i)=\i\.useMemo.{0,140}return \i\.useMemo\(\(\)=>\i\(\3).+?(?:function\(\){return |\(\)=>))\2/,
replace: (_, rest, settingsHook) => `${rest}$self.wrapSettingsHook(${settingsHook})`
}
diff --git a/src/plugins/ctrlEnterSend/index.ts b/src/plugins/ctrlEnterSend/index.ts
index 67db12abc..b24f7a909 100644
--- a/src/plugins/ctrlEnterSend/index.ts
+++ b/src/plugins/ctrlEnterSend/index.ts
@@ -44,6 +44,7 @@ export default definePlugin({
{
find: ".selectPreviousCommandOption(",
replacement: {
+ // FIXME(Bundler change related): Remove old compatiblity once enough time has passed
match: /(?<=(\i)\.which(?:!==|===)\i\.\i.ENTER(\|\||&&)).{0,100}(\(0,\i\.\i\)\(\i\)).{0,100}(?=(?:\|\||&&)\(\i\.preventDefault)/,
replace: (_, event, condition, codeblock) => `${condition === "||" ? "!" : ""}$self.shouldSubmit(${event},${codeblock})`
}
diff --git a/src/plugins/fakeNitro/index.tsx b/src/plugins/fakeNitro/index.tsx
index 020ff67c2..4bdf194ce 100644
--- a/src/plugins/fakeNitro/index.tsx
+++ b/src/plugins/fakeNitro/index.tsx
@@ -256,6 +256,7 @@ export default definePlugin({
},
{
// Disallow the emoji for premium locked if the intention doesn't allow it
+ // FIXME(Bundler change related): Remove old compatiblity once enough time has passed
match: /(!)?(\i\.\i\.canUseEmojisEverywhere\(\i\))/,
replace: (m, not) => not
? `(${m}&&!${IS_BYPASSEABLE_INTENTION})`
diff --git a/src/plugins/messageTags/index.ts b/src/plugins/messageTags/index.ts
index 5a5d03fdb..49e88c42d 100644
--- a/src/plugins/messageTags/index.ts
+++ b/src/plugins/messageTags/index.ts
@@ -89,7 +89,7 @@ export default definePlugin({
settings,
async start() {
- // TODO: Remove DataStore tags migration once enough time has passed
+ // TODO(OptionType.CUSTOM Related): Remove DataStore tags migration once enough time has passed
const oldTags = await DataStore.get(DATA_KEY);
if (oldTags != null) {
// @ts-ignore
diff --git a/src/plugins/openInApp/index.ts b/src/plugins/openInApp/index.ts
index e344f1458..1c90b5290 100644
--- a/src/plugins/openInApp/index.ts
+++ b/src/plugins/openInApp/index.ts
@@ -100,6 +100,7 @@ export default definePlugin({
replace: "true"
},
{
+ // FIXME(Bundler change related): Remove old compatiblity once enough time has passed
match: /(!)?\(0,\i\.isDesktop\)\(\)/,
replace: (_, not) => not ? "false" : "true"
}
diff --git a/src/plugins/permissionFreeWill/index.ts b/src/plugins/permissionFreeWill/index.ts
index 510d9cb3b..8a6135145 100644
--- a/src/plugins/permissionFreeWill/index.ts
+++ b/src/plugins/permissionFreeWill/index.ts
@@ -46,6 +46,7 @@ export default definePlugin({
find: "#{intl::ONBOARDING_CHANNEL_THRESHOLD_WARNING}",
replacement: [
{
+ // FIXME(Bundler change related): Remove old compatiblity once enough time has passed
match: /{(?:\i:(?:function\(\){return |\(\)=>)\i}?,?){2}}/,
replace: m => m.replaceAll(canonicalizeMatch(/(function\(\){return |\(\)=>)\i/g), "$1()=>Promise.resolve(true)")
}
diff --git a/src/plugins/pinDms/data.ts b/src/plugins/pinDms/data.ts
index 2f4a1156e..d689bd2af 100644
--- a/src/plugins/pinDms/data.ts
+++ b/src/plugins/pinDms/data.ts
@@ -155,7 +155,7 @@ export function moveChannel(channelId: string, direction: -1 | 1) {
swapElementsInArray(category.channels, a, b);
}
-// TODO: Remove DataStore PinnedDms migration once enough time has passed
+// TODO(OptionType.CUSTOM Related): Remove DataStore PinnedDms migration once enough time has passed
async function migrateData() {
if (Settings.plugins.PinDMs.dmSectioncollapsed != null) {
settings.store.dmSectionCollapsed = Settings.plugins.PinDMs.dmSectioncollapsed;
diff --git a/src/plugins/showHiddenChannels/index.tsx b/src/plugins/showHiddenChannels/index.tsx
index 382990d06..09291b825 100644
--- a/src/plugins/showHiddenChannels/index.tsx
+++ b/src/plugins/showHiddenChannels/index.tsx
@@ -108,6 +108,7 @@ export default definePlugin({
},
{
// Prevent Discord from trying to connect to hidden voice channels
+ // FIXME(Bundler change related): Remove old compatiblity once enough time has passed
match: /(?=(\|\||&&)\i\.\i\.selectVoiceChannel\((\i)\.id\))/,
replace: (_, condition, channel) => condition === "||"
? `||$self.isHiddenChannel(${channel})`
@@ -124,6 +125,7 @@ export default definePlugin({
{
find: ".AUDIENCE),{isSubscriptionGated",
replacement: {
+ // FIXME(Bundler change related): Remove old compatiblity once enough time has passed
match: /(!)?(\i)\.isRoleSubscriptionTemplatePreviewChannel\(\)/,
replace: (m, not, channel) => not
? `${m}&&!$self.isHiddenChannel(${channel})`
@@ -177,6 +179,7 @@ export default definePlugin({
},
// Make voice channels also appear as muted if they are muted
{
+ // FIXME(Bundler change related): Remove old compatiblity once enough time has passed
match: /(?<=\.wrapper:\i\.notInteractive,)(.+?)(if\()?(\i)(?:\)return |\?)(\i\.MUTED)/,
replace: (_, otherClasses, isIf, isMuted, mutedClassExpression) => isIf
? `${isMuted}?${mutedClassExpression}:"",${otherClasses}if(${isMuted})return ""`
@@ -190,6 +193,7 @@ export default definePlugin({
{
// Make muted channels also appear as unread if hide unreads is false, using the HiddenIconWithMutedStyle and the channel is hidden
predicate: () => settings.store.hideUnreads === false && settings.store.showMode === ShowMode.HiddenIconWithMutedStyle,
+ // FIXME(Bundler change related): Remove old compatiblity once enough time has passed
match: /(?<=\.LOCKED(?:;if\(|:))(?<={channel:(\i).+?)/,
replace: (_, channel) => `!$self.isHiddenChannel(${channel})&&`
},
diff --git a/src/plugins/textReplace/index.tsx b/src/plugins/textReplace/index.tsx
index 4bec9b6f9..d5d6f4dc8 100644
--- a/src/plugins/textReplace/index.tsx
+++ b/src/plugins/textReplace/index.tsx
@@ -244,7 +244,7 @@ export default definePlugin({
},
async start() {
- // TODO: Remove DataStore rules migrations once enough time has passed
+ // TODO(OptionType.CUSTOM Related): Remove DataStore rules migrations once enough time has passed
const oldStringRules = await DataStore.get(STRING_RULES_KEY);
if (oldStringRules != null) {
settings.store.stringRules = oldStringRules;
From 1eff1a02bd1d447a412c12744ea742d74794e923 Mon Sep 17 00:00:00 2001
From: Nuckyz <61953774+Nuckyz@users.noreply.github.com>
Date: Thu, 30 Jan 2025 16:02:42 -0300
Subject: [PATCH 3/6] IrcColors: Fix causing react errors sometimes
---
src/plugins/ircColors/index.ts | 12 +++---------
1 file changed, 3 insertions(+), 9 deletions(-)
diff --git a/src/plugins/ircColors/index.ts b/src/plugins/ircColors/index.ts
index 208b327e9..a518fd93d 100644
--- a/src/plugins/ircColors/index.ts
+++ b/src/plugins/ircColors/index.ts
@@ -23,11 +23,11 @@ import definePlugin, { OptionType } from "@utils/types";
import { useMemo } from "@webpack/common";
// Calculate a CSS color string based on the user ID
-function calculateNameColorForUser(id: string) {
+function calculateNameColorForUser(id?: string) {
const { lightness } = settings.use(["lightness"]);
- const idHash = useMemo(() => h64(id), [id]);
+ const idHash = useMemo(() => id ? h64(id) : null, [id]);
- return `hsl(${idHash % 360n}, 100%, ${lightness}%)`;
+ return idHash && `hsl(${idHash % 360n}, 100%, ${lightness}%)`;
}
const settings = definePluginSettings({
@@ -70,16 +70,10 @@ export default definePlugin({
calculateNameColorForMessageContext(context: any) {
const id = context?.message?.author?.id;
- if (id == null) {
- return null;
- }
return calculateNameColorForUser(id);
},
calculateNameColorForListContext(context: any) {
const id = context?.user?.id;
- if (id == null) {
- return null;
- }
return calculateNameColorForUser(id);
}
});
From fc4e95806d1c33b160a3a8516debfe54c1344328 Mon Sep 17 00:00:00 2001
From: Nuckyz <61953774+Nuckyz@users.noreply.github.com>
Date: Fri, 31 Jan 2025 14:55:40 -0300
Subject: [PATCH 4/6] Fix ImplicitRelationships and NotificationsVolume (#3184)
Also simplifies MessageEventsAPI patch
---
src/plugins/_api/messageEvents.ts | 13 ++++---------
src/plugins/implicitRelationships/index.ts | 6 +++---
src/plugins/notificationVolume/index.ts | 4 ++--
3 files changed, 9 insertions(+), 14 deletions(-)
diff --git a/src/plugins/_api/messageEvents.ts b/src/plugins/_api/messageEvents.ts
index 25a46711d..9dfc55e27 100644
--- a/src/plugins/_api/messageEvents.ts
+++ b/src/plugins/_api/messageEvents.ts
@@ -37,13 +37,9 @@ export default definePlugin({
{
find: ".handleSendMessage,onResize",
replacement: {
- // FIXME: Simplify this change once all branches share the same code
- // props.chatInputType...then((function(isMessageValid)... var parsedMessage = b.c.parse(channel,... var replyOptions = f.g.getSendMessageOptionsForReply(pendingReply);
- // Lookbehind: validateMessage)({openWarningPopout:..., type: i.props.chatInputType, content: t, stickers: r, ...}).then((function(isMessageValid)
- match: /(\{openWarningPopout:.{0,100}type:this.props.chatInputType.+?\.then\((?:async )?)(\i=>\{.+?let (\i)=\i\.\i\.parse\((\i),.+?let (\i)=\i\.\i\.getSendMessageOptions\(\{.+?\}\);)(?<=\)\(({.+?})\)\.then.+?)/,
- // props.chatInputType...then((async function(isMessageValid)... var replyOptions = f.g.getSendMessageOptionsForReply(pendingReply); if(await Vencord.api...) return { shoudClear:true, shouldRefocus:true };
- replace: (_, rest1, rest2, parsedMessage, channel, replyOptions, extra) => "" +
- `${rest1}${rest1.includes("async") ? "" : "async "}${rest2}` +
+ // https://regex101.com/r/hBlXpl/1
+ match: /let (\i)=\i\.\i\.parse\((\i),.+?let (\i)=\i\.\i\.getSendMessageOptions\(\{.+?\}\);(?<=\)\(({.+?})\)\.then.+?)/,
+ replace: (m, parsedMessage, channel, replyOptions, extra) => m +
`if(await Vencord.Api.MessageEvents._handlePreSend(${channel}.id,${parsedMessage},${extra},${replyOptions}))` +
"return{shouldClear:false,shouldRefocus:true};"
}
@@ -53,8 +49,7 @@ export default definePlugin({
replacement: {
match: /let\{id:\i}=(\i),{id:\i}=(\i);return \i\.useCallback\((\i)=>\{/,
replace: (m, message, channel, event) =>
- // the message param is shadowed by the event param, so need to alias them
- `const vcMsg=${message},vcChan=${channel};${m}Vencord.Api.MessageEvents._handleClick(vcMsg, vcChan, ${event});`
+ `const vcMsg=${message},vcChan=${channel};${m}Vencord.Api.MessageEvents._handleClick(vcMsg,vcChan,${event});`
}
}
]
diff --git a/src/plugins/implicitRelationships/index.ts b/src/plugins/implicitRelationships/index.ts
index c6b61ef4a..cfc3818dd 100644
--- a/src/plugins/implicitRelationships/index.ts
+++ b/src/plugins/implicitRelationships/index.ts
@@ -50,9 +50,9 @@ export default definePlugin({
{
find: "#{intl::FRIENDS_SECTION_ONLINE}",
replacement: {
- match: /(\(0,\i\.jsx\)\(\i\.\i\.Item,\{id:\i\.\i)\.BLOCKED,className:([^\s]+?)\.item,children:\i\.\i\.string\(\i\.\i#{intl::BLOCKED}\)\}\)/,
- replace: "$1.IMPLICIT,className:$2.item,children:\"Implicit\"}),$&"
- },
+ match: /,{id:(\i\.\i)\.BLOCKED,show:.+?className:(\i\.item)/,
+ replace: (rest, relationShipTypes, className) => `,{id:${relationShipTypes}.IMPLICIT,show:true,className:${className},content:"Implicit"}${rest}`
+ }
},
// Sections content
{
diff --git a/src/plugins/notificationVolume/index.ts b/src/plugins/notificationVolume/index.ts
index bc3c7539d..d320d76f1 100644
--- a/src/plugins/notificationVolume/index.ts
+++ b/src/plugins/notificationVolume/index.ts
@@ -25,9 +25,9 @@ export default definePlugin({
settings,
patches: [
{
- find: "_ensureAudio(){",
+ find: "ensureAudio(){",
replacement: {
- match: /(?=Math\.min\(\i\.\i\.getOutputVolume\(\)\/100)/,
+ match: /(?=Math\.min\(\i\.\i\.getOutputVolume\(\)\/100)/g,
replace: "$self.settings.store.notificationVolume/100*"
},
},
From 7b9f0a36ba3ae7762e852a6a4e91838d4b772ec4 Mon Sep 17 00:00:00 2001
From: jamesbt365
Date: Fri, 31 Jan 2025 18:54:51 +0000
Subject: [PATCH 5/6] IrcColors: Allow coloring only users with no color and
DMs only (#3186)
---
src/plugins/ircColors/index.ts | 36 +++++++++++++++++++++++++++++++---
1 file changed, 33 insertions(+), 3 deletions(-)
diff --git a/src/plugins/ircColors/index.ts b/src/plugins/ircColors/index.ts
index a518fd93d..af926043d 100644
--- a/src/plugins/ircColors/index.ts
+++ b/src/plugins/ircColors/index.ts
@@ -41,13 +41,25 @@ const settings = definePluginSettings({
restartNeeded: true,
type: OptionType.BOOLEAN,
default: true
+ },
+ applyColorOnlyToUsersWithoutColor: {
+ description: "Apply colors only to users who don't have a predefined color",
+ restartNeeded: false,
+ type: OptionType.BOOLEAN,
+ default: false
+ },
+ applyColorOnlyInDms: {
+ description: "Apply colors only in direct messages; do not apply colors in servers.",
+ restartNeeded: false,
+ type: OptionType.BOOLEAN,
+ default: false
}
});
export default definePlugin({
name: "IrcColors",
description: "Makes username colors in chat unique, like in IRC clients",
- authors: [Devs.Grzesiek11],
+ authors: [Devs.Grzesiek11, Devs.jamesbt365],
settings,
patches: [
@@ -70,10 +82,28 @@ export default definePlugin({
calculateNameColorForMessageContext(context: any) {
const id = context?.message?.author?.id;
- return calculateNameColorForUser(id);
+ const colorString = context?.author?.colorString;
+ const color = calculateNameColorForUser(id);
+
+ if (settings.store.applyColorOnlyInDms && !context?.channel?.isPrivate()) {
+ return colorString;
+ }
+
+ return (!settings.store.applyColorOnlyToUsersWithoutColor || !colorString)
+ ? color
+ : colorString;
},
calculateNameColorForListContext(context: any) {
const id = context?.user?.id;
- return calculateNameColorForUser(id);
+ const colorString = context?.colorString;
+ const color = calculateNameColorForUser(id);
+
+ if (settings.store.applyColorOnlyInDms && !context?.channel?.isPrivate()) {
+ return colorString;
+ }
+
+ return (!settings.store.applyColorOnlyToUsersWithoutColor || !colorString)
+ ? color
+ : colorString;
}
});
From 4f5ebec4bb3ef9abf64668b8927405041642e37e Mon Sep 17 00:00:00 2001
From: Nuckyz <61953774+Nuckyz@users.noreply.github.com>
Date: Fri, 31 Jan 2025 16:24:07 -0300
Subject: [PATCH 6/6] FullUserInChatbox: Fix empty mention when user is unknown
Fixes #3190
---
src/plugins/fullUserInChatbox/index.tsx | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/src/plugins/fullUserInChatbox/index.tsx b/src/plugins/fullUserInChatbox/index.tsx
index 5a0c41c01..ceeb56926 100644
--- a/src/plugins/fullUserInChatbox/index.tsx
+++ b/src/plugins/fullUserInChatbox/index.tsx
@@ -8,6 +8,7 @@ import ErrorBoundary from "@components/ErrorBoundary";
import { Devs } from "@utils/constants";
import definePlugin from "@utils/types";
import { findComponentByCodeLazy } from "@webpack";
+import { UserStore, useStateFromStores } from "@webpack/common";
import { ReactNode } from "react";
const UserMentionComponent = findComponentByCodeLazy(".USER_MENTION)");
@@ -34,14 +35,19 @@ export default definePlugin({
}
],
- UserMentionComponent: ErrorBoundary.wrap((props: UserMentionComponentProps) => (
- {
+ const user = useStateFromStores([UserStore], () => UserStore.getUser(props.id));
+ if (user == null) {
+ return props.originalComponent();
+ }
+
+ return
- ), {
+ />;
+ }, {
fallback: ({ wrappedProps: { originalComponent } }) => originalComponent()
})
});