diff --git a/package.json b/package.json index 082995f4..a41fe162 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vencord", "private": "true", - "version": "1.10.3", + "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 c3b6e908..8dc40147 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/_api/notices.ts b/src/plugins/_api/notices.ts index ceec6f82..0c6f6e1d 100644 --- a/src/plugins/_api/notices.ts +++ b/src/plugins/_api/notices.ts @@ -33,8 +33,8 @@ export default definePlugin({ replace: "if(Vencord.Api.Notices.currentNotice)return false;$&" }, { - match: /(?<=function (\i)\(\i\){)return null!=(\i)(?=.*NOTICE_DISMISS:\1)/, - replace: "if($2.id==\"VencordNotice\")return($2=null,Vencord.Api.Notices.nextNotice(),true);$&" + match: /(?<=,NOTICE_DISMISS:function\(\i\){)return null!=(\i)/, + replace: "if($1.id==\"VencordNotice\")return($1=null,Vencord.Api.Notices.nextNotice(),true);$&" } ] } diff --git a/src/plugins/blurNsfw/index.ts b/src/plugins/blurNsfw/index.ts index a80f9f26..948de0ac 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/consoleJanitor/index.ts b/src/plugins/consoleJanitor/index.ts index 1cb70554..b0c8905f 100644 --- a/src/plugins/consoleJanitor/index.ts +++ b/src/plugins/consoleJanitor/index.ts @@ -119,7 +119,7 @@ export default definePlugin({ { find: "Slow dispatch on", replacement: { - match: /\i\.totalTime>\i&&\i\.verbose\("Slow dispatch on ".+?\)\);/, + match: /\i\.totalTime>100&&\i\.verbose\("Slow dispatch on ".+?\)\);/, replace: "" } }, diff --git a/src/plugins/fakeNitro/index.tsx b/src/plugins/fakeNitro/index.tsx index cfffedb9..fb2c67c3 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:", - predicate: () => settings.store.enableStickerBypass, - replacement: { - match: /(?<=canUseCustomStickersEverywhere:)\i/, - replace: "()=>true" - }, - }, // Make stickers always available { find: '"SENDABLE"', @@ -270,20 +283,6 @@ export default definePlugin({ replace: "true?" } }, - // Allow streaming with high quality - { - find: "canUseHighVideoUploadQuality:", - predicate: () => settings.store.enableStreamQualityBypass, - replacement: [ - "canUseHighVideoUploadQuality", - "canStreamQuality", - ].map(func => { - return { - match: new RegExp(`(?<=${func}:)\\i`, "g"), - replace: "()=>true" - }; - }) - }, // Remove boost requirements to stream with high quality { find: "STREAM_FPS_OPTION.format", @@ -293,21 +292,13 @@ export default definePlugin({ replace: "" } }, - // Allow client themes to be changeable - { - find: "canUseClientThemes:", - replacement: { - match: /(?<=canUseClientThemes:)\i/, - replace: "()=>true" - } - }, { find: '"UserSettingsProtoStore"', replacement: [ { // Overwrite incoming connection settings proto with our local settings - match: /function (\i)\((\i)\){(?=.*CONNECTION_OPEN:\1)/, - replace: (m, funcName, props) => `${m}$self.handleProtoChange(${props}.userSettingsProto,${props}.user);` + match: /CONNECTION_OPEN:function\((\i)\){/, + replace: (m, props) => `${m}$self.handleProtoChange(${props}.userSettingsProto,${props}.user);` }, { // Overwrite non local proto changes with our local settings @@ -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:", - replacement: { - match: /(?<=canUsePremiumAppIcons:)\i/, - replace: "()=>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:", - replacement: { - match: /(?<=canUseCustomNotificationSounds:)\i/, - replace: "()=>true" - } } ], diff --git a/src/plugins/messageLogger/index.tsx b/src/plugins/messageLogger/index.tsx index 70672e9e..a08aeccc 100644 --- a/src/plugins/messageLogger/index.tsx +++ b/src/plugins/messageLogger/index.tsx @@ -323,35 +323,35 @@ export default definePlugin({ replacement: [ { // Add deleted=true to all target messages in the MESSAGE_DELETE event - match: /function (\i)\((\i)\){let.+?((?:\i\.){2})getOrCreate.+?}(?=function.*MESSAGE_DELETE:\1)/, + match: /MESSAGE_DELETE:function\((\i)\){let.+?((?:\i\.){2})getOrCreate.+?},/, replace: - "function $1($2){" + - " var cache = $3getOrCreate($2.channelId);" + - " cache = $self.handleDelete(cache, $2, false);" + - " $3commit(cache);" + - "}" + "MESSAGE_DELETE:function($1){" + + " var cache = $2getOrCreate($1.channelId);" + + " cache = $self.handleDelete(cache, $1, false);" + + " $2commit(cache);" + + "}," }, { // Add deleted=true to all target messages in the MESSAGE_DELETE_BULK event - match: /function (\i)\((\i)\){let.+?((?:\i\.){2})getOrCreate.+?}(?=function.*MESSAGE_DELETE_BULK:\1)/, + match: /MESSAGE_DELETE_BULK:function\((\i)\){let.+?((?:\i\.){2})getOrCreate.+?},/, replace: - "function $1($2){" + - " var cache = $3getOrCreate($2.channelId);" + - " cache = $self.handleDelete(cache, $2, true);" + - " $3commit(cache);" + - "}" + "MESSAGE_DELETE_BULK:function($1){" + + " var cache = $2getOrCreate($1.channelId);" + + " cache = $self.handleDelete(cache, $1, true);" + + " $2commit(cache);" + + "}," }, { // Add current cached content + new edit time to cached message's editHistory - match: /(function (\i)\((\i)\).+?)\.update\((\i)(?=.*MESSAGE_UPDATE:\2)/, + match: /(MESSAGE_UPDATE:function\((\i)\).+?)\.update\((\i)/, replace: "$1" + - ".update($4,m =>" + - " (($3.message.flags & 64) === 64 || $self.shouldIgnore($3.message, true)) ? m :" + - " $3.message.edited_timestamp && $3.message.content !== m.content ?" + - " m.set('editHistory',[...(m.editHistory || []), $self.makeEdit($3.message, m)]) :" + + ".update($3,m =>" + + " (($2.message.flags & 64) === 64 || $self.shouldIgnore($2.message, true)) ? m :" + + " $2.message.edited_timestamp && $2.message.content !== m.content ?" + + " m.set('editHistory',[...(m.editHistory || []), $self.makeEdit($2.message, m)]) :" + " m" + ")" + - ".update($4" + ".update($3" }, { // fix up key (edit last message) attempting to edit a deleted message @@ -465,12 +465,12 @@ export default definePlugin({ find: '"ReferencedMessageStore"', replacement: [ { - match: /MESSAGE_DELETE:\i,/, - replace: "MESSAGE_DELETE:()=>{}," + match: /MESSAGE_DELETE:function\((\i)\).+?},/, + replace: "MESSAGE_DELETE:function($1){}," }, { - match: /MESSAGE_DELETE_BULK:\i,/, - replace: "MESSAGE_DELETE_BULK:()=>{}," + match: /MESSAGE_DELETE_BULK:function\((\i)\).+?},/, + replace: "MESSAGE_DELETE_BULK:function($1){}," } ] }, diff --git a/src/plugins/moreUserTags/index.tsx b/src/plugins/moreUserTags/index.tsx index eb0b3860..7a56131a 100644 --- a/src/plugins/moreUserTags/index.tsx +++ b/src/plugins/moreUserTags/index.tsx @@ -182,8 +182,8 @@ export default definePlugin({ { find: ".ORIGINAL_POSTER=", replacement: { - match: /(\i)=\{\}\)\);(?=let \i=100)/, - replace: "$1=$self.getTagTypes()));" + match: /\((\i)=\{\}\)\)\[(\i)\.BOT/, + replace: "($1=$self.getTagTypes()))[$2.BOT" } }, { diff --git a/src/plugins/noBlockedMessages/index.ts b/src/plugins/noBlockedMessages/index.ts index 7c87a7ab..d3b37b02 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,20 +41,20 @@ export default definePlugin({ replacement: [ { match: /let\{[^}]*collapsedReason[^}]*\}/, - replace: "return null;$&" + replace: "if($self.shouldHide(arguments[0]))return null;$&" } ] }, ...[ '"MessageStore"', - '"displayName","ReadStateStore")' + '"ReadStateStore"' ].map(find => ({ find, predicate: () => Settings.plugins.NoBlockedMessages.ignoreBlockedMessages === true, replacement: [ { - match: /(?<=function (\i)\((\i)\){)(?=.*MESSAGE_CREATE:\1)/, - replace: (_, _funcName, props) => `if($self.isBlocked(${props}.message))return;` + match: /(?<=MESSAGE_CREATE:function\((\i)\){)/, + replace: (_, props) => `if($self.isBlocked(${props}.message))return;` } ] })) @@ -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 4619c2f0..84ee8ec1 100644 --- a/src/plugins/noPendingCount/index.ts +++ b/src/plugins/noPendingCount/index.ts @@ -74,10 +74,10 @@ 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\(\);return )\i\.getMessageRequestsCount\(\)/, + match: /(?<=getSpamChannelsCount\(\),\i=)\i\.getMessageRequestsCount\(\)/, replace: "$self.getRealMessageRequestCount()" } }, diff --git a/src/plugins/permissionsViewer/index.tsx b/src/plugins/permissionsViewer/index.tsx index ca28f845..7d6572df 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/showHiddenThings/index.ts b/src/plugins/showHiddenThings/index.ts index 847dcd32..bab0b303 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/superReactionTweaks/index.ts b/src/plugins/superReactionTweaks/index.ts index cbcb38ad..188f868a 100644 --- a/src/plugins/superReactionTweaks/index.ts +++ b/src/plugins/superReactionTweaks/index.ts @@ -42,8 +42,8 @@ export default definePlugin({ { find: ",BURST_REACTION_EFFECT_PLAY", replacement: { - match: /((\i)=\i=>{.{50,100})(\i\(\i,\i\))>=\i(?=.*BURST_REACTION_EFFECT_PLAY:\2)/, - replace: "$1!$self.shouldPlayBurstReaction($3)" + match: /(BURST_REACTION_EFFECT_PLAY:\i=>{.{50,100})(\i\(\i,\i\))>=\d+/, + replace: "$1!$self.shouldPlayBurstReaction($2)" } }, { diff --git a/src/plugins/volumeBooster/index.ts b/src/plugins/volumeBooster/index.ts index 370f4e96..c38b2d1a 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;/, @@ -89,7 +94,7 @@ export default definePlugin({ find: "AudioContextSettingsMigrated", replacement: [ { - match: /(?<=isLocalMute\(\i,\i\),volume:(\i).+?\i\(\i,\i,)\1(?=\))/, + match: /(?<=isLocalMute\(\i,\i\),volume:.+?volume:)\i(?=})/, replace: "$&>200?200:$&" }, { @@ -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 bcd07079..24be9bef 100644 --- a/src/plugins/whoReacted/index.tsx +++ b/src/plugins/whoReacted/index.tsx @@ -113,8 +113,8 @@ export default definePlugin({ { find: '"MessageReactionsStore"', replacement: { - match: /function (\i)\(\){(\i)={}(?=.*CONNECTION_OPEN:\1)/, - replace: "$&;$self.reactions=$2;" + match: /(?<=CONNECTION_OPEN:function\(\){)(\i)={}/, + replace: "$&;$self.reactions=$1" } }, {