diff --git a/package.json b/package.json index 88633f65c..a41fe162a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vencord", "private": "true", - "version": "1.10.2", + "version": "1.10.4", "description": "The cutest Discord client mod", "homepage": "https://github.com/Vendicated/Vencord#readme", "bugs": { diff --git a/src/api/ContextMenu.ts b/src/api/ContextMenu.ts index fdd4facf4..114942ff6 100644 --- a/src/api/ContextMenu.ts +++ b/src/api/ContextMenu.ts @@ -90,19 +90,20 @@ export function removeGlobalContextMenuPatch(patch: GlobalContextMenuPatchCallba * A helper function for finding the children array of a group nested inside a context menu based on the id(s) of its children * @param id The id of the child. If an array is specified, all ids will be tried * @param children The context menu children + * @param matchSubstring Whether to check if the id is a substring of the child id */ -export function findGroupChildrenByChildId(id: string | string[], children: Array): Array | null { +export function findGroupChildrenByChildId(id: string | string[], children: Array, matchSubstring = false): Array | null { for (const child of children) { if (child == null) continue; if (Array.isArray(child)) { - const found = findGroupChildrenByChildId(id, child); + const found = findGroupChildrenByChildId(id, child, matchSubstring); if (found !== null) return found; } if ( - (Array.isArray(id) && id.some(id => child.props?.id === id)) - || child.props?.id === id + (Array.isArray(id) && id.some(id => matchSubstring ? child.props?.id?.includes(id) : child.props?.id === id)) + || (matchSubstring ? child.props?.id?.includes(id) : child.props?.id === id) ) return children; let nextChildren = child.props?.children; @@ -112,7 +113,7 @@ export function findGroupChildrenByChildId(id: string | string[], children: Arra child.props.children = nextChildren; } - const found = findGroupChildrenByChildId(id, nextChildren); + const found = findGroupChildrenByChildId(id, nextChildren, matchSubstring); if (found !== null) return found; } } diff --git a/src/components/PluginSettings/index.tsx b/src/components/PluginSettings/index.tsx index c3b6e9082..8dc40147f 100644 --- a/src/components/PluginSettings/index.tsx +++ b/src/components/PluginSettings/index.tsx @@ -93,7 +93,7 @@ interface PluginCardProps extends React.HTMLProps { export function PluginCard({ plugin, disabled, onRestartNeeded, onMouseEnter, onMouseLeave, isNew }: PluginCardProps) { const settings = Settings.plugins[plugin.name]; - const isEnabled = () => settings.enabled ?? false; + const isEnabled = () => Vencord.Plugins.isPluginEnabled(plugin.name); function toggleEnabled() { const wasEnabled = isEnabled(); diff --git a/src/plugins/anonymiseFileNames/index.tsx b/src/plugins/anonymiseFileNames/index.tsx index 526ccd12e..0e97bc7f8 100644 --- a/src/plugins/anonymiseFileNames/index.tsx +++ b/src/plugins/anonymiseFileNames/index.tsx @@ -71,7 +71,7 @@ export default definePlugin({ description: "Anonymise uploaded file names", patches: [ { - find: "instantBatchUpload:function", + find: "instantBatchUpload:", replacement: { match: /uploadFiles:(\i),/, replace: diff --git a/src/plugins/betterFolders/index.tsx b/src/plugins/betterFolders/index.tsx index c2969988b..bb1a67ebb 100644 --- a/src/plugins/betterFolders/index.tsx +++ b/src/plugins/betterFolders/index.tsx @@ -200,8 +200,8 @@ export default definePlugin({ predicate: () => settings.store.sidebar, replacement: { // Render the Better Folders sidebar - match: /(?<=({className:\i\.guilds,themeOverride:\i})\))/, - replace: ",$self.FolderSideBar({...$1})" + match: /(container.{0,50}({className:\i\.guilds,themeOverride:\i})\))/, + replace: "$1,$self.FolderSideBar({...$2})" } }, { diff --git a/src/plugins/blurNsfw/index.ts b/src/plugins/blurNsfw/index.ts index a80f9f260..948de0ac6 100644 --- a/src/plugins/blurNsfw/index.ts +++ b/src/plugins/blurNsfw/index.ts @@ -45,8 +45,8 @@ export default definePlugin({ { find: ".embedWrapper,embed", replacement: [{ - match: /\.embedWrapper(?=.+?channel_id:(\i)\.id)/g, - replace: "$&+($1.nsfw?' vc-nsfw-img':'')" + match: /\.container/, + replace: "$&+(this.props.channel.nsfw? ' vc-nsfw-img': '')" }] } ], diff --git a/src/plugins/customidle/index.ts b/src/plugins/customidle/index.ts index ea56da10e..7d353f157 100644 --- a/src/plugins/customidle/index.ts +++ b/src/plugins/customidle/index.ts @@ -37,8 +37,8 @@ export default definePlugin({ find: 'type:"IDLE",idle:', replacement: [ { - match: /(?<=Date\.now\(\)-\i>)\i\.\i/, - replace: "$self.getIdleTimeout()" + match: /(?<=Date\.now\(\)-\i>)\i\.\i\|\|/, + replace: "$self.getIdleTimeout()||" }, { match: /Math\.min\((\i\.\i\.getSetting\(\)\*\i\.\i\.\i\.SECOND),\i\.\i\)/, diff --git a/src/plugins/decor/index.tsx b/src/plugins/decor/index.tsx index c6cd895f9..33d1d40b7 100644 --- a/src/plugins/decor/index.tsx +++ b/src/plugins/decor/index.tsx @@ -54,7 +54,7 @@ export default definePlugin({ replace: "$self.DecorationGridItem=$&" }, { - match: /(?<==)\i=>{let{user:\i,avatarDecoration.{300,600}decorationGridItemChurned/, + match: /(?<==)\i=>{let{user:\i,avatarDecoration/, replace: "$self.DecorationGridDecoration=$&" }, // Remove NEW label from decor avatar decorations diff --git a/src/plugins/fakeNitro/index.tsx b/src/plugins/fakeNitro/index.tsx index efc194954..fb2c67c33 100644 --- a/src/plugins/fakeNitro/index.tsx +++ b/src/plugins/fakeNitro/index.tsx @@ -22,7 +22,7 @@ import { Devs } from "@utils/constants"; import { ApngBlendOp, ApngDisposeOp, importApngJs } from "@utils/dependencies"; import { getCurrentGuild } from "@utils/discord"; import { Logger } from "@utils/Logger"; -import definePlugin, { OptionType } from "@utils/types"; +import definePlugin, { OptionType, Patch } from "@utils/types"; import { findByCodeLazy, findByPropsLazy, findStoreLazy, proxyLazyWebpack } from "@webpack"; import { Alerts, ChannelStore, DraftType, EmojiStore, FluxDispatcher, Forms, GuildMemberStore, IconUtils, lodash, Parser, PermissionsBits, PermissionStore, UploadHandler, UserSettingsActionCreators, UserStore } from "@webpack/common"; import type { Emoji } from "@webpack/types"; @@ -194,6 +194,26 @@ const hasExternalStickerPerms = (channelId: string) => hasPermission(channelId, const hasEmbedPerms = (channelId: string) => hasPermission(channelId, PermissionsBits.EMBED_LINKS); const hasAttachmentPerms = (channelId: string) => hasPermission(channelId, PermissionsBits.ATTACH_FILES); +function makeBypassPatches(): Omit { + const mapping: Array<{ func: string, predicate?: () => boolean; }> = [ + { func: "canUseCustomStickersEverywhere", predicate: () => settings.store.enableStickerBypass }, + { func: "canUseHighVideoUploadQuality", predicate: () => settings.store.enableStreamQualityBypass }, + { func: "canStreamQuality", predicate: () => settings.store.enableStreamQualityBypass }, + { func: "canUseClientThemes" }, + { func: "canUseCustomNotificationSounds" }, + { func: "canUsePremiumAppIcons" } + ]; + + return { + find: "canUseCustomStickersEverywhere:", + replacement: mapping.map(({ func, predicate }) => ({ + match: new RegExp(String.raw`(?<=${func}:function\(\i(?:,\i)?\){)`), + replace: "return true;", + predicate + })) + }; +} + export default definePlugin({ name: "FakeNitro", authors: [Devs.Arjix, Devs.D3SOX, Devs.Ven, Devs.fawn, Devs.captain, Devs.Nuckyz, Devs.AutumnVN], @@ -203,6 +223,17 @@ export default definePlugin({ settings, patches: [ + // General bypass patches + makeBypassPatches(), + // Patch the emoji picker in voice calls to not be bypassed by fake nitro + { + find: "emojiItemDisabled]", + predicate: () => settings.store.enableEmojiBypass, + replacement: { + match: /CHAT/, + replace: "STATUS" + } + }, { find: ".PREMIUM_LOCKED;", group: true, @@ -243,15 +274,6 @@ export default definePlugin({ replace: (_, rest1, rest2) => `${rest1},fakeNitroOriginal){if(!fakeNitroOriginal)return false;${rest2}` } }, - // Allow stickers to be sent everywhere - { - find: "canUseCustomStickersEverywhere:function", - predicate: () => settings.store.enableStickerBypass, - replacement: { - match: /canUseCustomStickersEverywhere:function\(\i\){/, - replace: "$&return true;" - }, - }, // Make stickers always available { find: '"SENDABLE"', @@ -261,20 +283,6 @@ export default definePlugin({ replace: "true?" } }, - // Allow streaming with high quality - { - find: "canUseHighVideoUploadQuality:function", - predicate: () => settings.store.enableStreamQualityBypass, - replacement: [ - "canUseHighVideoUploadQuality", - "canStreamQuality", - ].map(func => { - return { - match: new RegExp(`${func}:function\\(\\i(?:,\\i)?\\){`, "g"), - replace: "$&return true;" - }; - }) - }, // Remove boost requirements to stream with high quality { find: "STREAM_FPS_OPTION.format", @@ -284,14 +292,6 @@ export default definePlugin({ replace: "" } }, - // Allow client themes to be changeable - { - find: "canUseClientThemes:function", - replacement: { - match: /canUseClientThemes:function\(\i\){/, - replace: "$&return true;" - } - }, { find: '"UserSettingsProtoStore"', replacement: [ @@ -389,14 +389,6 @@ export default definePlugin({ replace: (_, reactNode, props) => `$self.addFakeNotice(${FakeNoticeType.Emoji},${reactNode},!!${props}?.fakeNitroNode?.fake)` } }, - // Allow using custom app icons - { - find: "canUsePremiumAppIcons:function", - replacement: { - match: /canUsePremiumAppIcons:function\(\i\){/, - replace: "$&return true;" - } - }, // Separate patch for allowing using custom app icons { find: /\.getCurrentDesktopIcon.{0,25}\.isPremium/, @@ -412,14 +404,6 @@ export default definePlugin({ match: /(?<=type:"(?:SOUNDBOARD_SOUNDS_RECEIVED|GUILD_SOUNDBOARD_SOUND_CREATE|GUILD_SOUNDBOARD_SOUND_UPDATE|GUILD_SOUNDBOARD_SOUNDS_UPDATE)".+?available:)\i\.available/g, replace: "true" } - }, - // Allow using custom notification sounds - { - find: "canUseCustomNotificationSounds:function", - replacement: { - match: /canUseCustomNotificationSounds:function\(\i\){/, - replace: "$&return true;" - } } ], diff --git a/src/plugins/fullSearchContext/index.tsx b/src/plugins/fullSearchContext/index.tsx index 158612c6a..193e69f1a 100644 --- a/src/plugins/fullSearchContext/index.tsx +++ b/src/plugins/fullSearchContext/index.tsx @@ -16,16 +16,25 @@ * along with this program. If not, see . */ +import { findGroupChildrenByChildId, NavContextMenuPatchCallback } from "@api/ContextMenu"; import { migratePluginSettings } from "@api/Settings"; import { Devs } from "@utils/constants"; +import { NoopComponent } from "@utils/react"; import definePlugin from "@utils/types"; -import { findByPropsLazy } from "@webpack"; +import { filters, findByPropsLazy, waitFor } from "@webpack"; import { ChannelStore, ContextMenuApi, i18n, UserStore } from "@webpack/common"; import { Message } from "discord-types/general"; -import type { MouseEvent } from "react"; const { useMessageMenu } = findByPropsLazy("useMessageMenu"); +interface CopyIdMenuItemProps { + id: string; + label: string; +} + +let CopyIdMenuItem: (props: CopyIdMenuItemProps) => React.ReactElement | null = NoopComponent; +waitFor(filters.componentByCode('"devmode-copy-id-".concat'), m => CopyIdMenuItem = m); + function MessageMenu({ message, channel, onHeightUpdate }) { const canReport = message.author && !(message.author.id === UserStore.getCurrentUser().id || message.author.system); @@ -48,9 +57,25 @@ function MessageMenu({ message, channel, onHeightUpdate }) { itemSrc: void 0, itemSafeSrc: void 0, itemTextContent: void 0, + + isFullSearchContextMenu: true }); } +interface MessageActionsProps { + message: Message; + isFullSearchContextMenu?: boolean; +} + +const contextMenuPatch: NavContextMenuPatchCallback = (children, props: MessageActionsProps) => { + if (props?.isFullSearchContextMenu == null) return; + + const group = findGroupChildrenByChildId("devmode-copy-id", children, true); + group?.push( + CopyIdMenuItem({ id: props.message.author.id, label: i18n.Messages.COPY_ID_AUTHOR }) + ); +}; + migratePluginSettings("FullSearchContext", "SearchReply"); export default definePlugin({ name: "FullSearchContext", @@ -65,7 +90,7 @@ export default definePlugin({ } }], - handleContextMenu(event: MouseEvent, message: Message) { + handleContextMenu(event: React.MouseEvent, message: Message) { const channel = ChannelStore.getChannel(message.channel_id); if (!channel) return; @@ -78,5 +103,9 @@ export default definePlugin({ onHeightUpdate={contextMenuProps.onHeightUpdate} /> ); + }, + + contextMenus: { + "message-actions": contextMenuPatch } }); diff --git a/src/plugins/ignoreActivities/index.tsx b/src/plugins/ignoreActivities/index.tsx index 8c36e1d75..19f22e61d 100644 --- a/src/plugins/ignoreActivities/index.tsx +++ b/src/plugins/ignoreActivities/index.tsx @@ -244,7 +244,7 @@ export default definePlugin({ patches: [ { - find: '="LocalActivityStore",', + find: '"LocalActivityStore"', replacement: [ { match: /HANG_STATUS.+?(?=!\i\(\)\(\i,\i\)&&)(?<=(\i)\.push.+?)/, @@ -253,7 +253,7 @@ export default definePlugin({ ] }, { - find: '="ActivityTrackingStore",', + find: '"ActivityTrackingStore"', replacement: { match: /getVisibleRunningGames\(\).+?;(?=for)(?<=(\i)=\i\.\i\.getVisibleRunningGames.+?)/, replace: (m, runningGames) => `${m}${runningGames}=${runningGames}.filter(({id,name})=>$self.isActivityNotIgnored({type:0,application_id:id,name}));` diff --git a/src/plugins/moreUserTags/index.tsx b/src/plugins/moreUserTags/index.tsx index 0a87c57a9..7a56131a5 100644 --- a/src/plugins/moreUserTags/index.tsx +++ b/src/plugins/moreUserTags/index.tsx @@ -249,8 +249,8 @@ export default definePlugin({ match: /user:\i,nick:\i,/, replace: "$&moreTags_channelId," }, { - match: /,botType:(\i),(?<=user:(\i).+?)/g, - replace: ",botType:$self.getTag({user:$2,channelId:moreTags_channelId,origType:$1,location:'not-chat'})," + match: /,botType:(\i),botVerified:(\i),(?!discriminatorClass:)(?<=user:(\i).+?)/g, + replace: ",botType:$self.getTag({user:$3,channelId:moreTags_channelId,origType:$1,location:'not-chat'}),botVerified:$2," } ] }, diff --git a/src/plugins/noBlockedMessages/index.ts b/src/plugins/noBlockedMessages/index.ts index 1ea5b5296..d3b37b026 100644 --- a/src/plugins/noBlockedMessages/index.ts +++ b/src/plugins/noBlockedMessages/index.ts @@ -25,6 +25,12 @@ import { Message } from "discord-types/general"; const RelationshipStore = findByPropsLazy("getRelationships", "isBlocked"); +interface MessageDeleteProps { + collapsedReason: { + message: string; + }; +} + export default definePlugin({ name: "NoBlockedMessages", description: "Hides all blocked messages from chat completely.", @@ -35,13 +41,13 @@ export default definePlugin({ replacement: [ { match: /let\{[^}]*collapsedReason[^}]*\}/, - replace: "return null;$&" + replace: "if($self.shouldHide(arguments[0]))return null;$&" } ] }, ...[ - '="MessageStore",', - '"displayName","ReadStateStore")' + '"MessageStore"', + '"ReadStateStore"' ].map(find => ({ find, predicate: () => Settings.plugins.NoBlockedMessages.ignoreBlockedMessages === true, @@ -68,5 +74,9 @@ export default definePlugin({ } catch (e) { new Logger("NoBlockedMessages").error("Failed to check if user is blocked:", e); } + }, + + shouldHide(props: MessageDeleteProps) { + return !props?.collapsedReason?.message.includes("deleted"); } }); diff --git a/src/plugins/noPendingCount/index.ts b/src/plugins/noPendingCount/index.ts index d3e27563b..84ee8ec19 100644 --- a/src/plugins/noPendingCount/index.ts +++ b/src/plugins/noPendingCount/index.ts @@ -74,7 +74,7 @@ export default definePlugin({ // This prevents the Message Requests tab from always hiding due to the previous patch (and is compatible with spam requests) // In short, only the red badge is hidden. Button visibility behavior isn't changed. { - find: ".getSpamChannelsCount(),", + find: ".getSpamChannelsCount()", predicate: () => settings.store.hideMessageRequestsCount, replacement: { match: /(?<=getSpamChannelsCount\(\),\i=)\i\.getMessageRequestsCount\(\)/, diff --git a/src/plugins/permissionsViewer/index.tsx b/src/plugins/permissionsViewer/index.tsx index ca28f845f..7d6572df5 100644 --- a/src/plugins/permissionsViewer/index.tsx +++ b/src/plugins/permissionsViewer/index.tsx @@ -172,7 +172,7 @@ export default definePlugin({ { find: ".VIEW_ALL_ROLES,", replacement: { - match: /\.collapseButton,.+?}\)}\),/, + match: /\.expandButton,.+?null,/, replace: "$&$self.ViewPermissionsButton(arguments[0])," } } diff --git a/src/plugins/pronoundb/api.ts b/src/plugins/pronoundb/api.ts index da2bc651e..228217965 100644 --- a/src/plugins/pronoundb/api.ts +++ b/src/plugins/pronoundb/api.ts @@ -19,7 +19,7 @@ import { getCurrentChannel } from "@utils/discord"; import { useAwaiter } from "@utils/react"; import { findStoreLazy } from "@webpack"; -import { UserProfileStore } from "@webpack/common"; +import { UserProfileStore, UserStore } from "@webpack/common"; import { settings } from "./settings"; import { PronounMapping, Pronouns, PronounsCache, PronounSets, PronounsFormat, PronounSource, PronounsResponse } from "./types"; @@ -158,10 +158,15 @@ export function useFormattedPronouns(id: string, useGlobalProfile: boolean = fal } export function useProfilePronouns(id: string, useGlobalProfile: boolean = false): Pronouns { - const pronouns = useFormattedPronouns(id, useGlobalProfile); + try { + const pronouns = useFormattedPronouns(id, useGlobalProfile); - if (!settings.store.showInProfile) return EmptyPronouns; - if (!settings.store.showSelf && id === UserProfileStore.getCurrentUser()?.id) return EmptyPronouns; + if (!settings.store.showInProfile) return EmptyPronouns; + if (!settings.store.showSelf && id === UserStore.getCurrentUser()?.id) return EmptyPronouns; - return pronouns; + return pronouns; + } catch (e) { + console.error(e); + return EmptyPronouns; + } } diff --git a/src/plugins/replyTimestamp/index.tsx b/src/plugins/replyTimestamp/index.tsx index 851a62b9d..b0a01addb 100644 --- a/src/plugins/replyTimestamp/index.tsx +++ b/src/plugins/replyTimestamp/index.tsx @@ -69,8 +69,8 @@ export default definePlugin({ { find: ".REPLY_QUOTE_MESSAGE_BLOCKED", replacement: { - match: /(?<="aria-label":\i,children:\[)(?=\i,\i,\i\])/, - replace: "$self.ReplyTimestamp(arguments[0])," + match: /\.onClickReply,.+?}\),(?=\i,\i,\i\])/, + replace: "$&$self.ReplyTimestamp(arguments[0])," } } ], diff --git a/src/plugins/roleColorEverywhere/index.tsx b/src/plugins/roleColorEverywhere/index.tsx index c9ededc5e..108ed00c5 100644 --- a/src/plugins/roleColorEverywhere/index.tsx +++ b/src/plugins/roleColorEverywhere/index.tsx @@ -61,8 +61,7 @@ const settings = definePluginSettings({ type: OptionType.SLIDER, description: "Intensity of message coloring.", markers: makeRange(0, 100, 10), - default: 30, - restartNeeded: true + default: 30 }, }); diff --git a/src/plugins/showHiddenChannels/index.tsx b/src/plugins/showHiddenChannels/index.tsx index 01b0da4b4..7f008c8cb 100644 --- a/src/plugins/showHiddenChannels/index.tsx +++ b/src/plugins/showHiddenChannels/index.tsx @@ -444,7 +444,7 @@ export default definePlugin({ } }, { - find: '="GuildChannelStore",', + find: '"GuildChannelStore"', replacement: [ { // Make GuildChannelStore contain hidden channels @@ -453,7 +453,7 @@ export default definePlugin({ }, { // Filter hidden channels from GuildChannelStore.getChannels unless told otherwise - match: /(?<=getChannels\(\i)(\){.+?)return (.+?)}/, + match: /(?<=getChannels\(\i)(\){.*?)return (.+?)}/, replace: (_, rest, channels) => `,shouldIncludeHidden${rest}return $self.resolveGuildChannels(${channels},shouldIncludeHidden??arguments[0]==="@favorites");}` } ] diff --git a/src/plugins/showHiddenThings/index.ts b/src/plugins/showHiddenThings/index.ts index 847dcd327..bab0b3032 100644 --- a/src/plugins/showHiddenThings/index.ts +++ b/src/plugins/showHiddenThings/index.ts @@ -92,16 +92,7 @@ export default definePlugin({ replace: '">0"' } }, - // empty word filter (why would anyone search "horny" in fucking server discovery... please... why are we patching this again??) - { - find: '"horny","fart"', - predicate: () => settings.store.disableDisallowedDiscoveryFilters, - replacement: { - match: /=\["egirl",.+?\]/, - replace: "=[]" - } - }, - // empty 2nd word filter + // empty word filter { find: '"pepe","nude"', predicate: () => settings.store.disableDisallowedDiscoveryFilters, diff --git a/src/plugins/showMeYourName/index.tsx b/src/plugins/showMeYourName/index.tsx index 4f9fcf304..bbafb58d3 100644 --- a/src/plugins/showMeYourName/index.tsx +++ b/src/plugins/showMeYourName/index.tsx @@ -48,7 +48,7 @@ export default definePlugin({ authors: [Devs.Rini, Devs.TheKodeToad], patches: [ { - find: '?"@":"")', + find: '?"@":""', replacement: { match: /(?<=onContextMenu:\i,children:).*?\)}/, replace: "$self.renderUsername(arguments[0])}" diff --git a/src/plugins/userVoiceShow/components.tsx b/src/plugins/userVoiceShow/components.tsx index c509f6946..7a6f4dd2a 100644 --- a/src/plugins/userVoiceShow/components.tsx +++ b/src/plugins/userVoiceShow/components.tsx @@ -21,7 +21,7 @@ const getDMChannelIcon = findByCodeLazy(".getChannelIconURL({"); const VoiceStateStore = findStoreLazy("VoiceStateStore"); const UserSummaryItem = findComponentByCodeLazy("defaultRenderUser", "showDefaultAvatarsForNullUsers"); -const Avatar = findComponentByCodeLazy(".AVATAR_STATUS_TYPING_16;"); +const Avatar = findComponentByCodeLazy(".status)/2):0"); const GroupDMAvatars = findComponentByCodeLazy(".AvatarSizeSpecs[", "getAvatarURL"); const ActionButtonClasses = findByPropsLazy("actionButton", "highlight"); diff --git a/src/plugins/userVoiceShow/index.tsx b/src/plugins/userVoiceShow/index.tsx index 98386a16e..07b18c27d 100644 --- a/src/plugins/userVoiceShow/index.tsx +++ b/src/plugins/userVoiceShow/index.tsx @@ -51,6 +51,7 @@ export default definePlugin({ name: "UserVoiceShow", description: "Shows an indicator when a user is in a Voice Channel", authors: [Devs.Nuckyz, Devs.LordElias], + dependencies: ["MemberListDecoratorsAPI", "MessageDecorationsAPI"], settings, patches: [ diff --git a/src/plugins/volumeBooster/index.ts b/src/plugins/volumeBooster/index.ts index 490bf62c2..c38b2d1a5 100644 --- a/src/plugins/volumeBooster/index.ts +++ b/src/plugins/volumeBooster/index.ts @@ -77,6 +77,11 @@ export default definePlugin({ match: /Math\.max.{0,30}\)\)/, replace: "arguments[0]" }, + // Fix streams not playing audio until you update them + { + match: /\}return"video"/, + replace: "this.updateAudioElement();$&" + }, // Patch the volume { match: /\.volume=this\._volume\/100;/, @@ -104,7 +109,7 @@ export default definePlugin({ }, // Prevent the MediaEngineStore from overwriting our LocalVolumes above 200 with the ones the Discord Audio Context Settings sync sends { - find: '="MediaEngineStore",', + find: '"MediaEngineStore"', replacement: [ { match: /(\.settings\.audioContextSettings.+?)(\i\[\i\])=(\i\.volume)(.+?setLocalVolume\(\i,).+?\)/, diff --git a/src/plugins/whoReacted/index.tsx b/src/plugins/whoReacted/index.tsx index 679fe714e..24be9bef5 100644 --- a/src/plugins/whoReacted/index.tsx +++ b/src/plugins/whoReacted/index.tsx @@ -109,7 +109,8 @@ export default definePlugin({ match: /(\i)\?null:\(0,\i\.jsx\)\(\i\.\i,{className:\i\.reactionCount,.*?}\),/, replace: "$&$1?null:$self.renderUsers(this.props)," } - }, { + }, + { find: '"MessageReactionsStore"', replacement: { match: /(?<=CONNECTION_OPEN:function\(\){)(\i)={}/,