From b6d727607fcc890dff7b175490f4592284e20c63 Mon Sep 17 00:00:00 2001 From: hich4t Date: Sun, 2 Nov 2025 18:24:16 +0200 Subject: [PATCH 1/4] CustomRPC: add detail/state and image URL fields (#3758) Co-authored-by: Vendicated --- .../discord-types/src/common/Activity.d.ts | 2 ++ src/plugins/customRPC/RpcSettings.tsx | 28 +++++++++++++++---- src/plugins/customRPC/index.tsx | 22 +++++++++++++-- 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/packages/discord-types/src/common/Activity.d.ts b/packages/discord-types/src/common/Activity.d.ts index 733872057..42de81364 100644 --- a/packages/discord-types/src/common/Activity.d.ts +++ b/packages/discord-types/src/common/Activity.d.ts @@ -3,8 +3,10 @@ import { ActivityFlags, ActivityStatusDisplayType, ActivityType } from "../../en export interface ActivityAssets { large_image?: string; large_text?: string; + large_url?: string; small_image?: string; small_text?: string; + small_url?: string; } export interface ActivityButton { diff --git a/src/plugins/customRPC/RpcSettings.tsx b/src/plugins/customRPC/RpcSettings.tsx index 845c088cf..637d049e3 100644 --- a/src/plugins/customRPC/RpcSettings.tsx +++ b/src/plugins/customRPC/RpcSettings.tsx @@ -73,6 +73,11 @@ function isNumberValid(value: number) { return true; } +function isUrlValid(value: string) { + if (value && !/^https?:\/\/.+/.test(value)) return "Must be a valid URL."; + return true; +} + function isImageKeyValid(value: string) { if (/https?:\/\/(cdn|media)\.discordapp\.(com|net)\//.test(value)) return "Don't use a Discord link. Use an Imgur image link instead."; if (/https?:\/\/(?!i\.)?imgur\.com\//.test(value)) return "Imgur link must be a direct link to the image (e.g. https://i.imgur.com/...). Right click the image and click 'Copy image address'"; @@ -180,8 +185,15 @@ export function RPCSettings() { { settingsKey: "appName", label: "Application Name", isValid: makeValidator(128, true) }, ]} /> - - + + + @@ -211,21 +225,23 @@ export function RPCSettings() { { settingsKey: "imageBig", label: "Large Image URL/Key", isValid: isImageKeyValid }, { settingsKey: "imageBigTooltip", label: "Large Image Text", isValid: maxLength128 }, ]} /> + + diff --git a/src/plugins/customRPC/index.tsx b/src/plugins/customRPC/index.tsx index e6f460a16..90df95c28 100644 --- a/src/plugins/customRPC/index.tsx +++ b/src/plugins/customRPC/index.tsx @@ -60,15 +60,19 @@ export const settings = definePluginSettings({ appID?: string; appName?: string; details?: string; + detailsURL?: string; state?: string; + stateURL?: string; type?: ActivityType; streamLink?: string; timestampMode?: TimestampMode; startTime?: number; endTime?: number; imageBig?: string; + imageBigURL?: string; imageBigTooltip?: string; imageSmall?: string; + imageSmallURL?: string; imageSmallTooltip?: string; buttonOneText?: string; buttonOneURL?: string; @@ -83,14 +87,18 @@ async function createActivity(): Promise { appID, appName, details, + detailsURL, state, + stateURL, type, streamLink, startTime, endTime, imageBig, + imageBigURL, imageBigTooltip, imageSmall, + imageSmallURL, imageSmallTooltip, buttonOneText, buttonOneURL, @@ -137,6 +145,14 @@ async function createActivity(): Promise { break; } + if (detailsURL) { + activity.details_url = detailsURL; + } + + if (stateURL) { + activity.state_url = stateURL; + } + if (buttonOneText) { activity.buttons = [ buttonOneText, @@ -154,7 +170,8 @@ async function createActivity(): Promise { if (imageBig) { activity.assets = { large_image: await getApplicationAsset(imageBig), - large_text: imageBigTooltip || undefined + large_text: imageBigTooltip || undefined, + large_url: imageBigURL || undefined }; } @@ -162,7 +179,8 @@ async function createActivity(): Promise { activity.assets = { ...activity.assets, small_image: await getApplicationAsset(imageSmall), - small_text: imageSmallTooltip || undefined + small_text: imageSmallTooltip || undefined, + small_url: imageSmallURL || undefined }; } From 3992f971d021b97481e1d5a16e4fb897c9304e39 Mon Sep 17 00:00:00 2001 From: Vendicated Date: Sun, 2 Nov 2025 18:21:42 +0100 Subject: [PATCH 2/4] fix missing Toolbox --- src/plugins/vencordToolbox/index.tsx | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/plugins/vencordToolbox/index.tsx b/src/plugins/vencordToolbox/index.tsx index 5a7b8cad1..719a14ea7 100644 --- a/src/plugins/vencordToolbox/index.tsx +++ b/src/plugins/vencordToolbox/index.tsx @@ -25,7 +25,7 @@ import { Devs } from "@utils/constants"; import definePlugin from "@utils/types"; import { findComponentByCodeLazy } from "@webpack"; import { Menu, Popout, useRef, useState } from "@webpack/common"; -import type { ReactNode } from "react"; +import type { PropsWithChildren, ReactNode } from "react"; const HeaderBarIcon = findComponentByCodeLazy(".HEADER_BAR_BADGE_TOP:", '.iconBadge,"top"'); @@ -131,16 +131,20 @@ export default definePlugin({ { find: '?"BACK_FORWARD_NAVIGATION":', replacement: { - // TODO: (?:\.button) is for stable compat and should be removed soon:tm: - match: /focusSectionProps:"HELP".{0,20},className:(\i(?:\.button)?)\}\),/, - replace: "$& $self.renderVencordPopoutButton($1)," + match: /(?<=trailing:.{0,50})\i\.Fragment,\{(?=.+?className:(\i))/, + replace: "$self.TrailingWrapper,{className:$1," } } ], - renderVencordPopoutButton: (buttonClass: string) => ( - - - - ) + TrailingWrapper({ children, className }: PropsWithChildren<{ className: string; }>) { + return ( + <> + {children} + + + + + ); + }, }); From 44a75e4e9446ccfed81782d2a8634b6585a4cf4d Mon Sep 17 00:00:00 2001 From: thororen <78185467+thororen1234@users.noreply.github.com> Date: Sun, 2 Nov 2025 12:28:53 -0500 Subject: [PATCH 3/4] fix Decor & NoTrack (#3752) Co-authored-by: Vendicated --- src/plugins/_core/noTrack.ts | 2 +- src/plugins/decor/index.tsx | 2 +- src/plugins/experiments/index.tsx | 9 --------- 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/src/plugins/_core/noTrack.ts b/src/plugins/_core/noTrack.ts index eada58cbf..cd6234dc4 100644 --- a/src/plugins/_core/noTrack.ts +++ b/src/plugins/_core/noTrack.ts @@ -49,7 +49,7 @@ export default definePlugin({ }, }, { - find: ".METRICS", + find: ".METRICS_V2", replacement: [ { match: /this\._intervalId=/, diff --git a/src/plugins/decor/index.tsx b/src/plugins/decor/index.tsx index 528e91546..3fcc049f7 100644 --- a/src/plugins/decor/index.tsx +++ b/src/plugins/decor/index.tsx @@ -70,7 +70,7 @@ export default definePlugin({ replacement: [ // Add Decor avatar decoration hook to avatar decoration hook { - match: /(?<=TryItOut:\i,guildId:\i}\),)(?<=user:(\i).+?)/, + match: /(?<=\.avatarDecoration,guildId:\i\}\)\),)(?<=user:(\i).+?)/, replace: "vcDecorAvatarDecoration=$self.useUserDecorAvatarDecoration($1)," }, // Use added hook diff --git a/src/plugins/experiments/index.tsx b/src/plugins/experiments/index.tsx index 49f55c358..8063fff3a 100644 --- a/src/plugins/experiments/index.tsx +++ b/src/plugins/experiments/index.tsx @@ -104,15 +104,6 @@ export default definePlugin({ replace: "false", } }, - // Enable option to always record clips even if you are not streaming - { - find: "isDecoupledGameClippingEnabled(){", - replacement: { - match: /\i\.isStaff\(\)/, - replace: "true" - } - }, - // Enable experiment embed on sent experiment links { find: "dev://experiment/", From 7c708acf0b61132e6799be43798c92247319fc0a Mon Sep 17 00:00:00 2001 From: Vendicated Date: Sun, 2 Nov 2025 18:35:01 +0100 Subject: [PATCH 4/4] bump to v1.13.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 83812c394..c86b84d4f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vencord", "private": "true", - "version": "1.13.4", + "version": "1.13.5", "description": "The cutest Discord client mod", "homepage": "https://github.com/Vendicated/Vencord#readme", "bugs": {