Compare commits

..

9 commits

Author SHA1 Message Date
2f57f6b58c
Merge remote-tracking branch 'upstream/main' 2024-10-07 16:26:04 -04:00
Nuckyz
013c8d061d
Bump to 1.10.4 2024-10-05 14:24:39 -03:00
Nuckyz
b5f626d1ff
Fix multiple plugins (again) 2024-10-05 08:01:40 -03:00
sadan4
1e01f85217
NoBlockedMessages: Fix conflict with MessageLogger (#2921) 2024-10-04 09:29:59 +00:00
sadan4
91a32e22de
PermissionsViewer: Fix profile button (#2925) 2024-10-04 06:28:36 -03:00
ryanamay
43b3c137ce
BlurNSFW: Fix not blurring embeds (#2862) 2024-10-03 07:11:37 +00:00
Nuckyz
18f7b74210
Fix required plugins being shown as disabled 2024-09-27 05:46:50 -03:00
sadan4
eab0cf9966
VolumeBooster: fix stream on web based clients (#2916)
Co-authored-by: v <vendicated@riseup.net>
2024-09-27 00:26:13 +02:00
Nuckyz
e7956413e2
Optimize slow patches 2024-09-26 14:02:36 -03:00
15 changed files with 85 additions and 104 deletions

View file

@ -1,7 +1,7 @@
{ {
"name": "vencord", "name": "vencord",
"private": "true", "private": "true",
"version": "1.10.3", "version": "1.10.4",
"description": "The cutest Discord client mod", "description": "The cutest Discord client mod",
"homepage": "https://github.com/Vendicated/Vencord#readme", "homepage": "https://github.com/Vendicated/Vencord#readme",
"bugs": { "bugs": {

View file

@ -93,7 +93,7 @@ interface PluginCardProps extends React.HTMLProps<HTMLDivElement> {
export function PluginCard({ plugin, disabled, onRestartNeeded, onMouseEnter, onMouseLeave, isNew }: PluginCardProps) { export function PluginCard({ plugin, disabled, onRestartNeeded, onMouseEnter, onMouseLeave, isNew }: PluginCardProps) {
const settings = Settings.plugins[plugin.name]; const settings = Settings.plugins[plugin.name];
const isEnabled = () => settings.enabled ?? false; const isEnabled = () => Vencord.Plugins.isPluginEnabled(plugin.name);
function toggleEnabled() { function toggleEnabled() {
const wasEnabled = isEnabled(); const wasEnabled = isEnabled();

View file

@ -33,8 +33,8 @@ export default definePlugin({
replace: "if(Vencord.Api.Notices.currentNotice)return false;$&" replace: "if(Vencord.Api.Notices.currentNotice)return false;$&"
}, },
{ {
match: /(?<=function (\i)\(\i\){)return null!=(\i)(?=.*NOTICE_DISMISS:\1)/, match: /(?<=,NOTICE_DISMISS:function\(\i\){)return null!=(\i)/,
replace: "if($2.id==\"VencordNotice\")return($2=null,Vencord.Api.Notices.nextNotice(),true);$&" replace: "if($1.id==\"VencordNotice\")return($1=null,Vencord.Api.Notices.nextNotice(),true);$&"
} }
] ]
} }

View file

@ -45,8 +45,8 @@ export default definePlugin({
{ {
find: ".embedWrapper,embed", find: ".embedWrapper,embed",
replacement: [{ replacement: [{
match: /\.embedWrapper(?=.+?channel_id:(\i)\.id)/g, match: /\.container/,
replace: "$&+($1.nsfw?' vc-nsfw-img':'')" replace: "$&+(this.props.channel.nsfw? ' vc-nsfw-img': '')"
}] }]
} }
], ],

View file

@ -119,7 +119,7 @@ export default definePlugin({
{ {
find: "Slow dispatch on", find: "Slow dispatch on",
replacement: { replacement: {
match: /\i\.totalTime>\i&&\i\.verbose\("Slow dispatch on ".+?\)\);/, match: /\i\.totalTime>100&&\i\.verbose\("Slow dispatch on ".+?\)\);/,
replace: "" replace: ""
} }
}, },

View file

@ -22,7 +22,7 @@ import { Devs } from "@utils/constants";
import { ApngBlendOp, ApngDisposeOp, importApngJs } from "@utils/dependencies"; import { ApngBlendOp, ApngDisposeOp, importApngJs } from "@utils/dependencies";
import { getCurrentGuild } from "@utils/discord"; import { getCurrentGuild } from "@utils/discord";
import { Logger } from "@utils/Logger"; 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 { 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 { Alerts, ChannelStore, DraftType, EmojiStore, FluxDispatcher, Forms, GuildMemberStore, IconUtils, lodash, Parser, PermissionsBits, PermissionStore, UploadHandler, UserSettingsActionCreators, UserStore } from "@webpack/common";
import type { Emoji } from "@webpack/types"; 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 hasEmbedPerms = (channelId: string) => hasPermission(channelId, PermissionsBits.EMBED_LINKS);
const hasAttachmentPerms = (channelId: string) => hasPermission(channelId, PermissionsBits.ATTACH_FILES); const hasAttachmentPerms = (channelId: string) => hasPermission(channelId, PermissionsBits.ATTACH_FILES);
function makeBypassPatches(): Omit<Patch, "plugin"> {
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({ export default definePlugin({
name: "FakeNitro", name: "FakeNitro",
authors: [Devs.Arjix, Devs.D3SOX, Devs.Ven, Devs.fawn, Devs.captain, Devs.Nuckyz, Devs.AutumnVN], authors: [Devs.Arjix, Devs.D3SOX, Devs.Ven, Devs.fawn, Devs.captain, Devs.Nuckyz, Devs.AutumnVN],
@ -203,6 +223,8 @@ export default definePlugin({
settings, settings,
patches: [ patches: [
// General bypass patches
makeBypassPatches(),
// Patch the emoji picker in voice calls to not be bypassed by fake nitro // Patch the emoji picker in voice calls to not be bypassed by fake nitro
{ {
find: "emojiItemDisabled]", find: "emojiItemDisabled]",
@ -252,15 +274,6 @@ export default definePlugin({
replace: (_, rest1, rest2) => `${rest1},fakeNitroOriginal){if(!fakeNitroOriginal)return false;${rest2}` 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 // Make stickers always available
{ {
find: '"SENDABLE"', find: '"SENDABLE"',
@ -270,20 +283,6 @@ export default definePlugin({
replace: "true?" 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 // Remove boost requirements to stream with high quality
{ {
find: "STREAM_FPS_OPTION.format", find: "STREAM_FPS_OPTION.format",
@ -293,21 +292,13 @@ export default definePlugin({
replace: "" replace: ""
} }
}, },
// Allow client themes to be changeable
{
find: "canUseClientThemes:",
replacement: {
match: /(?<=canUseClientThemes:)\i/,
replace: "()=>true"
}
},
{ {
find: '"UserSettingsProtoStore"', find: '"UserSettingsProtoStore"',
replacement: [ replacement: [
{ {
// Overwrite incoming connection settings proto with our local settings // Overwrite incoming connection settings proto with our local settings
match: /function (\i)\((\i)\){(?=.*CONNECTION_OPEN:\1)/, match: /CONNECTION_OPEN:function\((\i)\){/,
replace: (m, funcName, props) => `${m}$self.handleProtoChange(${props}.userSettingsProto,${props}.user);` replace: (m, props) => `${m}$self.handleProtoChange(${props}.userSettingsProto,${props}.user);`
}, },
{ {
// Overwrite non local proto changes with our local settings // 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)` 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 // Separate patch for allowing using custom app icons
{ {
find: /\.getCurrentDesktopIcon.{0,25}\.isPremium/, 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, match: /(?<=type:"(?:SOUNDBOARD_SOUNDS_RECEIVED|GUILD_SOUNDBOARD_SOUND_CREATE|GUILD_SOUNDBOARD_SOUND_UPDATE|GUILD_SOUNDBOARD_SOUNDS_UPDATE)".+?available:)\i\.available/g,
replace: "true" replace: "true"
} }
},
// Allow using custom notification sounds
{
find: "canUseCustomNotificationSounds:",
replacement: {
match: /(?<=canUseCustomNotificationSounds:)\i/,
replace: "()=>true"
}
} }
], ],

View file

@ -323,35 +323,35 @@ export default definePlugin({
replacement: [ replacement: [
{ {
// Add deleted=true to all target messages in the MESSAGE_DELETE event // 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: replace:
"function $1($2){" + "MESSAGE_DELETE:function($1){" +
" var cache = $3getOrCreate($2.channelId);" + " var cache = $2getOrCreate($1.channelId);" +
" cache = $self.handleDelete(cache, $2, false);" + " cache = $self.handleDelete(cache, $1, false);" +
" $3commit(cache);" + " $2commit(cache);" +
"}" "},"
}, },
{ {
// Add deleted=true to all target messages in the MESSAGE_DELETE_BULK event // 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: replace:
"function $1($2){" + "MESSAGE_DELETE_BULK:function($1){" +
" var cache = $3getOrCreate($2.channelId);" + " var cache = $2getOrCreate($1.channelId);" +
" cache = $self.handleDelete(cache, $2, true);" + " cache = $self.handleDelete(cache, $1, true);" +
" $3commit(cache);" + " $2commit(cache);" +
"}" "},"
}, },
{ {
// Add current cached content + new edit time to cached message's editHistory // 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" + replace: "$1" +
".update($4,m =>" + ".update($3,m =>" +
" (($3.message.flags & 64) === 64 || $self.shouldIgnore($3.message, true)) ? m :" + " (($2.message.flags & 64) === 64 || $self.shouldIgnore($2.message, true)) ? m :" +
" $3.message.edited_timestamp && $3.message.content !== m.content ?" + " $2.message.edited_timestamp && $2.message.content !== m.content ?" +
" m.set('editHistory',[...(m.editHistory || []), $self.makeEdit($3.message, m)]) :" + " m.set('editHistory',[...(m.editHistory || []), $self.makeEdit($2.message, m)]) :" +
" m" + " m" +
")" + ")" +
".update($4" ".update($3"
}, },
{ {
// fix up key (edit last message) attempting to edit a deleted message // fix up key (edit last message) attempting to edit a deleted message
@ -465,12 +465,12 @@ export default definePlugin({
find: '"ReferencedMessageStore"', find: '"ReferencedMessageStore"',
replacement: [ replacement: [
{ {
match: /MESSAGE_DELETE:\i,/, match: /MESSAGE_DELETE:function\((\i)\).+?},/,
replace: "MESSAGE_DELETE:()=>{}," replace: "MESSAGE_DELETE:function($1){},"
}, },
{ {
match: /MESSAGE_DELETE_BULK:\i,/, match: /MESSAGE_DELETE_BULK:function\((\i)\).+?},/,
replace: "MESSAGE_DELETE_BULK:()=>{}," replace: "MESSAGE_DELETE_BULK:function($1){},"
} }
] ]
}, },

View file

@ -182,8 +182,8 @@ export default definePlugin({
{ {
find: ".ORIGINAL_POSTER=", find: ".ORIGINAL_POSTER=",
replacement: { replacement: {
match: /(\i)=\{\}\)\);(?=let \i=100)/, match: /\((\i)=\{\}\)\)\[(\i)\.BOT/,
replace: "$1=$self.getTagTypes()));" replace: "($1=$self.getTagTypes()))[$2.BOT"
} }
}, },
{ {

View file

@ -25,6 +25,12 @@ import { Message } from "discord-types/general";
const RelationshipStore = findByPropsLazy("getRelationships", "isBlocked"); const RelationshipStore = findByPropsLazy("getRelationships", "isBlocked");
interface MessageDeleteProps {
collapsedReason: {
message: string;
};
}
export default definePlugin({ export default definePlugin({
name: "NoBlockedMessages", name: "NoBlockedMessages",
description: "Hides all blocked messages from chat completely.", description: "Hides all blocked messages from chat completely.",
@ -35,20 +41,20 @@ export default definePlugin({
replacement: [ replacement: [
{ {
match: /let\{[^}]*collapsedReason[^}]*\}/, match: /let\{[^}]*collapsedReason[^}]*\}/,
replace: "return null;$&" replace: "if($self.shouldHide(arguments[0]))return null;$&"
} }
] ]
}, },
...[ ...[
'"MessageStore"', '"MessageStore"',
'"displayName","ReadStateStore")' '"ReadStateStore"'
].map(find => ({ ].map(find => ({
find, find,
predicate: () => Settings.plugins.NoBlockedMessages.ignoreBlockedMessages === true, predicate: () => Settings.plugins.NoBlockedMessages.ignoreBlockedMessages === true,
replacement: [ replacement: [
{ {
match: /(?<=function (\i)\((\i)\){)(?=.*MESSAGE_CREATE:\1)/, match: /(?<=MESSAGE_CREATE:function\((\i)\){)/,
replace: (_, _funcName, props) => `if($self.isBlocked(${props}.message))return;` replace: (_, props) => `if($self.isBlocked(${props}.message))return;`
} }
] ]
})) }))
@ -68,5 +74,9 @@ export default definePlugin({
} catch (e) { } catch (e) {
new Logger("NoBlockedMessages").error("Failed to check if user is blocked:", e); new Logger("NoBlockedMessages").error("Failed to check if user is blocked:", e);
} }
},
shouldHide(props: MessageDeleteProps) {
return !props?.collapsedReason?.message.includes("deleted");
} }
}); });

View file

@ -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) // 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. // In short, only the red badge is hidden. Button visibility behavior isn't changed.
{ {
find: ".getSpamChannelsCount();", find: ".getSpamChannelsCount()",
predicate: () => settings.store.hideMessageRequestsCount, predicate: () => settings.store.hideMessageRequestsCount,
replacement: { replacement: {
match: /(?<=getSpamChannelsCount\(\);return )\i\.getMessageRequestsCount\(\)/, match: /(?<=getSpamChannelsCount\(\),\i=)\i\.getMessageRequestsCount\(\)/,
replace: "$self.getRealMessageRequestCount()" replace: "$self.getRealMessageRequestCount()"
} }
}, },

View file

@ -172,7 +172,7 @@ export default definePlugin({
{ {
find: ".VIEW_ALL_ROLES,", find: ".VIEW_ALL_ROLES,",
replacement: { replacement: {
match: /\.collapseButton,.+?}\)}\),/, match: /\.expandButton,.+?null,/,
replace: "$&$self.ViewPermissionsButton(arguments[0])," replace: "$&$self.ViewPermissionsButton(arguments[0]),"
} }
} }

View file

@ -92,16 +92,7 @@ export default definePlugin({
replace: '">0"' replace: '">0"'
} }
}, },
// empty word filter (why would anyone search "horny" in fucking server discovery... please... why are we patching this again??) // empty word filter
{
find: '"horny","fart"',
predicate: () => settings.store.disableDisallowedDiscoveryFilters,
replacement: {
match: /=\["egirl",.+?\]/,
replace: "=[]"
}
},
// empty 2nd word filter
{ {
find: '"pepe","nude"', find: '"pepe","nude"',
predicate: () => settings.store.disableDisallowedDiscoveryFilters, predicate: () => settings.store.disableDisallowedDiscoveryFilters,

View file

@ -42,8 +42,8 @@ export default definePlugin({
{ {
find: ",BURST_REACTION_EFFECT_PLAY", find: ",BURST_REACTION_EFFECT_PLAY",
replacement: { replacement: {
match: /((\i)=\i=>{.{50,100})(\i\(\i,\i\))>=\i(?=.*BURST_REACTION_EFFECT_PLAY:\2)/, match: /(BURST_REACTION_EFFECT_PLAY:\i=>{.{50,100})(\i\(\i,\i\))>=\d+/,
replace: "$1!$self.shouldPlayBurstReaction($3)" replace: "$1!$self.shouldPlayBurstReaction($2)"
} }
}, },
{ {

View file

@ -77,6 +77,11 @@ export default definePlugin({
match: /Math\.max.{0,30}\)\)/, match: /Math\.max.{0,30}\)\)/,
replace: "arguments[0]" replace: "arguments[0]"
}, },
// Fix streams not playing audio until you update them
{
match: /\}return"video"/,
replace: "this.updateAudioElement();$&"
},
// Patch the volume // Patch the volume
{ {
match: /\.volume=this\._volume\/100;/, match: /\.volume=this\._volume\/100;/,
@ -89,7 +94,7 @@ export default definePlugin({
find: "AudioContextSettingsMigrated", find: "AudioContextSettingsMigrated",
replacement: [ replacement: [
{ {
match: /(?<=isLocalMute\(\i,\i\),volume:(\i).+?\i\(\i,\i,)\1(?=\))/, match: /(?<=isLocalMute\(\i,\i\),volume:.+?volume:)\i(?=})/,
replace: "$&>200?200:$&" 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 // Prevent the MediaEngineStore from overwriting our LocalVolumes above 200 with the ones the Discord Audio Context Settings sync sends
{ {
find: '="MediaEngineStore",', find: '"MediaEngineStore"',
replacement: [ replacement: [
{ {
match: /(\.settings\.audioContextSettings.+?)(\i\[\i\])=(\i\.volume)(.+?setLocalVolume\(\i,).+?\)/, match: /(\.settings\.audioContextSettings.+?)(\i\[\i\])=(\i\.volume)(.+?setLocalVolume\(\i,).+?\)/,

View file

@ -113,8 +113,8 @@ export default definePlugin({
{ {
find: '"MessageReactionsStore"', find: '"MessageReactionsStore"',
replacement: { replacement: {
match: /function (\i)\(\){(\i)={}(?=.*CONNECTION_OPEN:\1)/, match: /(?<=CONNECTION_OPEN:function\(\){)(\i)={}/,
replace: "$&;$self.reactions=$2;" replace: "$&;$self.reactions=$1"
} }
}, },
{ {