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/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/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 2a7a0ee72..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,8 @@ 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]", @@ -252,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"', @@ -270,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", @@ -293,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: [ @@ -398,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/, @@ -421,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/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/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/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/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)={}/,