From 8c2dc84f3b3c18e20fc5c8c94ea1b837a1a3b093 Mon Sep 17 00:00:00 2001 From: thororen <78185467+thororen1234@users.noreply.github.com> Date: Sun, 21 Sep 2025 22:38:57 -0400 Subject: [PATCH 1/5] Settings: fix debug info layout (#3673) --- src/plugins/_core/settings.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/_core/settings.tsx b/src/plugins/_core/settings.tsx index 4a0f297e4..4d12f37a1 100644 --- a/src/plugins/_core/settings.tsx +++ b/src/plugins/_core/settings.tsx @@ -39,7 +39,7 @@ export default definePlugin({ find: ".versionHash", replacement: [ { - match: /\[\(0,\i\.jsxs?\)\((.{1,10}),(\{[^{}}]+\{.{0,20}.versionHash,.+?\})\)," "/, + match: /\.info.+?\[\(0,\i\.jsxs?\)\((.{1,10}),(\{[^{}}]+\{.{0,20}.versionHash,.+?\})\)," "/, replace: (m, component, props) => { props = props.replace(/children:\[.+\]/, ""); return `${m},$self.makeInfoElements(${component}, ${props})`; From 80872f4ab9a0184c05d1b34dfec4a052c1c0709b Mon Sep 17 00:00:00 2001 From: quarty <142720982+qwertyquarty@users.noreply.github.com> Date: Mon, 22 Sep 2025 04:44:13 +0200 Subject: [PATCH 2/5] MessageLatency: add option to ignore own messages (#3677) Co-authored-by: V --- src/plugins/messageLatency/index.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/plugins/messageLatency/index.tsx b/src/plugins/messageLatency/index.tsx index b81c55cf7..437ce6440 100644 --- a/src/plugins/messageLatency/index.tsx +++ b/src/plugins/messageLatency/index.tsx @@ -11,7 +11,7 @@ import { isNonNullish } from "@utils/guards"; import definePlugin, { OptionType } from "@utils/types"; import { Message } from "@vencord/discord-types"; import { findComponentByCodeLazy } from "@webpack"; -import { SnowflakeUtils, Tooltip } from "@webpack/common"; +import { AuthenticationStore, SnowflakeUtils, Tooltip } from "@webpack/common"; type FillValue = ("status-danger" | "status-warning" | "status-positive" | "text-muted"); type Fill = [FillValue, FillValue, FillValue]; @@ -48,6 +48,11 @@ export default definePlugin({ type: OptionType.BOOLEAN, description: "Show milliseconds", default: false + }, + ignoreSelf: { + type: OptionType.BOOLEAN, + description: "Don't add indicator to your own messages", + default: false } }), @@ -91,7 +96,7 @@ export default definePlugin({ }, latencyTooltipData(message: Message) { - const { latency, detectDiscordKotlin, showMillis } = this.settings.store; + const { latency, detectDiscordKotlin, showMillis, ignoreSelf } = this.settings.store; const { id, nonce } = message; // Message wasn't received through gateway @@ -100,6 +105,8 @@ export default definePlugin({ // Bots basically never send a nonce, and if someone does do it then it's usually not a snowflake if (message.author.bot) return null; + if (ignoreSelf && message.author.id === AuthenticationStore.getId()) return null; + let isDiscordKotlin = false; let delta = SnowflakeUtils.extractTimestamp(id) - SnowflakeUtils.extractTimestamp(nonce); // milliseconds if (!showMillis) { From edd68fe08e5f929e95e6635ec65ec9fdc54089f7 Mon Sep 17 00:00:00 2001 From: nin0 Date: Sun, 21 Sep 2025 23:08:08 -0400 Subject: [PATCH 3/5] AppleMusicRichPresence: add status display type (#3669) Co-authored-by: V --- packages/discord-types/enums/activity.ts | 30 +++++++++ packages/discord-types/enums/index.ts | 1 + .../discord-types/src/common/Activity.d.ts | 36 ++++++++++ packages/discord-types/src/common/index.d.ts | 1 + src/plugins/appleMusic.desktop/index.tsx | 67 ++++++++----------- src/plugins/customRPC/index.tsx | 38 +---------- src/plugins/lastfmRichPresence/index.tsx | 51 ++------------ 7 files changed, 104 insertions(+), 120 deletions(-) create mode 100644 packages/discord-types/enums/activity.ts create mode 100644 packages/discord-types/src/common/Activity.d.ts diff --git a/packages/discord-types/enums/activity.ts b/packages/discord-types/enums/activity.ts new file mode 100644 index 000000000..513a65dee --- /dev/null +++ b/packages/discord-types/enums/activity.ts @@ -0,0 +1,30 @@ +export const enum ActivityType { + PLAYING = 0, + STREAMING = 1, + LISTENING = 2, + WATCHING = 3, + CUSTOM_STATUS = 4, + COMPETING = 5, + HANG_STATUS = 6 +} + +export const enum ActivityFlags { + INSTANCE = 1 << 0, + JOIN = 1 << 1, + /** @deprecated */ + SPECTATE = 1 << 2, + /** @deprecated */ + JOIN_REQUEST = 1 << 3, + SYNC = 1 << 4, + PLAY = 1 << 5, + PARTY_PRIVACY_FRIENDS = 1 << 6, + PARTY_PRIVACY_VOICE_CHANNEL = 1 << 7, + EMBEDDED = 1 << 8, + CONTEXTLESS = 1 << 9 +} + +export const enum ActivityStatusDisplayType { + NAME = 0, + STATE = 1, + DETAILS = 2 +} diff --git a/packages/discord-types/enums/index.ts b/packages/discord-types/enums/index.ts index 3d80895cd..a25ff3b5d 100644 --- a/packages/discord-types/enums/index.ts +++ b/packages/discord-types/enums/index.ts @@ -1,3 +1,4 @@ +export * from "./activity"; export * from "./channel"; export * from "./commands"; export * from "./messages"; diff --git a/packages/discord-types/src/common/Activity.d.ts b/packages/discord-types/src/common/Activity.d.ts new file mode 100644 index 000000000..d513780ac --- /dev/null +++ b/packages/discord-types/src/common/Activity.d.ts @@ -0,0 +1,36 @@ +import { ActivityFlags, ActivityStatusDisplayType, ActivityType } from "../../enums"; + +export interface ActivityAssets { + large_image?: string; + large_text?: string; + small_image?: string; + small_text?: string; +} + +export interface ActivityButton { + label: string; + url: string; +} + +export interface Activity { + name: string; + application_id: string; + type: ActivityType; + state?: string; + state_url?: string; + details?: string; + details_url?: string; + url?: string; + flags: ActivityFlags; + status_display_type?: ActivityStatusDisplayType; + timestamps?: { + start?: number; + end?: number; + }; + assets?: ActivityAssets; + buttons?: string[]; + metadata?: { + button_urls?: Array; + }; +} + diff --git a/packages/discord-types/src/common/index.d.ts b/packages/discord-types/src/common/index.d.ts index 5e50e96e0..65ad88562 100644 --- a/packages/discord-types/src/common/index.d.ts +++ b/packages/discord-types/src/common/index.d.ts @@ -1,3 +1,4 @@ +export * from "./Activity"; export * from "./Application"; export * from "./Channel"; export * from "./Guild"; diff --git a/src/plugins/appleMusic.desktop/index.tsx b/src/plugins/appleMusic.desktop/index.tsx index 57e5ae19e..f6fc9da93 100644 --- a/src/plugins/appleMusic.desktop/index.tsx +++ b/src/plugins/appleMusic.desktop/index.tsx @@ -7,49 +7,12 @@ import { definePluginSettings } from "@api/Settings"; import { Devs, IS_MAC } from "@utils/constants"; import definePlugin, { OptionType, PluginNative, ReporterTestable } from "@utils/types"; +import { Activity, ActivityAssets, ActivityButton } from "@vencord/discord-types"; +import { ActivityFlags, ActivityStatusDisplayType, ActivityType } from "@vencord/discord-types/enums"; import { ApplicationAssetUtils, FluxDispatcher, Forms } from "@webpack/common"; const Native = VencordNative.pluginHelpers.AppleMusicRichPresence as PluginNative; -interface ActivityAssets { - large_image?: string; - large_text?: string; - small_image?: string; - small_text?: string; -} - -interface ActivityButton { - label: string; - url: string; -} - -interface Activity { - state?: string; - details?: string; - timestamps?: { - start?: number; - end?: number; - }; - assets?: ActivityAssets; - buttons?: Array; - name: string; - application_id: string; - metadata?: { - button_urls?: Array; - }; - type: number; - flags: number; -} - -const enum ActivityType { - PLAYING = 0, - LISTENING = 2, -} - -const enum ActivityFlag { - INSTANCE = 1 << 0, -} - export interface TrackData { name: string; album?: string; @@ -90,6 +53,25 @@ const settings = definePluginSettings({ { label: "Listening", value: ActivityType.LISTENING } ], }, + statusDisplayType: { + description: "Show the track / artist name in the member list", + type: OptionType.SELECT, + options: [ + { + label: "Don't show (shows generic listening message)", + value: "off", + default: true + }, + { + label: "Show artist name", + value: "artist" + }, + { + label: "Show track name", + value: "track" + } + ] + }, refreshInterval: { type: OptionType.SLIDER, description: "The interval between activity refreshes (seconds)", @@ -258,7 +240,12 @@ export default definePlugin({ metadata: !isRadio && buttons.length ? { button_urls: buttons.map(v => v.url) } : undefined, type: settings.store.activityType, - flags: ActivityFlag.INSTANCE, + status_display_type: { + "off": ActivityStatusDisplayType.NAME, + "artist": ActivityStatusDisplayType.STATE, + "track": ActivityStatusDisplayType.DETAILS + }[settings.store.statusDisplayType], + flags: ActivityFlags.INSTANCE, }; } }); diff --git a/src/plugins/customRPC/index.tsx b/src/plugins/customRPC/index.tsx index d35dad135..9a5a1cd98 100644 --- a/src/plugins/customRPC/index.tsx +++ b/src/plugins/customRPC/index.tsx @@ -27,6 +27,8 @@ import { Margins } from "@utils/margins"; import { classes } from "@utils/misc"; import { useAwaiter } from "@utils/react"; import definePlugin, { OptionType } from "@utils/types"; +import { Activity } from "@vencord/discord-types"; +import { ActivityType } from "@vencord/discord-types/enums"; import { findByCodeLazy, findComponentByCodeLazy } from "@webpack"; import { ApplicationAssetUtils, Button, FluxDispatcher, Forms, React, UserStore } from "@webpack/common"; @@ -39,41 +41,7 @@ async function getApplicationAsset(key: string): Promise { return (await ApplicationAssetUtils.fetchAssetIds(settings.store.appID!, [key]))[0]; } -interface ActivityAssets { - large_image?: string; - large_text?: string; - small_image?: string; - small_text?: string; -} - -interface Activity { - state?: string; - details?: string; - timestamps?: { - start?: number; - end?: number; - }; - assets?: ActivityAssets; - buttons?: Array; - name: string; - application_id: string; - metadata?: { - button_urls?: Array; - }; - type: ActivityType; - url?: string; - flags: number; -} - -const enum ActivityType { - PLAYING = 0, - STREAMING = 1, - LISTENING = 2, - WATCHING = 3, - COMPETING = 5 -} - -const enum TimestampMode { +export const enum TimestampMode { NONE, NOW, TIME, diff --git a/src/plugins/lastfmRichPresence/index.tsx b/src/plugins/lastfmRichPresence/index.tsx index abf42d5ff..3c36e9dce 100644 --- a/src/plugins/lastfmRichPresence/index.tsx +++ b/src/plugins/lastfmRichPresence/index.tsx @@ -21,40 +21,11 @@ import { Link } from "@components/Link"; import { Devs } from "@utils/constants"; import { Logger } from "@utils/Logger"; import definePlugin, { OptionType } from "@utils/types"; +import { Activity, ActivityAssets, ActivityButton } from "@vencord/discord-types"; +import { ActivityFlags, ActivityStatusDisplayType, ActivityType } from "@vencord/discord-types/enums"; import { findByPropsLazy } from "@webpack"; import { ApplicationAssetUtils, FluxDispatcher, Forms } from "@webpack/common"; -interface ActivityAssets { - large_image?: string; - large_text?: string; - small_image?: string; - small_text?: string; -} - - -interface ActivityButton { - label: string; - url: string; -} - -interface Activity { - state: string; - details?: string; - timestamps?: { - start?: number; - }; - assets?: ActivityAssets; - buttons?: Array; - name: string; - application_id: string; - status_display_type?: number; - metadata?: { - button_urls?: Array; - }; - type: number; - flags: number; -} - interface TrackData { name: string; album: string; @@ -63,16 +34,6 @@ interface TrackData { imageUrl?: string; } -// only relevant enum values -const enum ActivityType { - PLAYING = 0, - LISTENING = 2, -} - -const enum ActivityFlag { - INSTANCE = 1 << 0, -} - const enum NameFormat { StatusName = "status-name", ArtistFirst = "artist-first", @@ -367,9 +328,9 @@ export default definePlugin({ details: trackData.name, state: trackData.artist, status_display_type: { - "off": 0, - "artist": 1, - "track": 2 + "off": ActivityStatusDisplayType.NAME, + "artist": ActivityStatusDisplayType.STATE, + "track": ActivityStatusDisplayType.DETAILS }[settings.store.statusDisplayType], assets, @@ -379,7 +340,7 @@ export default definePlugin({ }, type: settings.store.useListeningStatus ? ActivityType.LISTENING : ActivityType.PLAYING, - flags: ActivityFlag.INSTANCE, + flags: ActivityFlags.INSTANCE, }; } }); From 2e9d67f0b4dbc59088b22e317c634d96c92a5985 Mon Sep 17 00:00:00 2001 From: thororen <78185467+thororen1234@users.noreply.github.com> Date: Sun, 21 Sep 2025 23:15:14 -0400 Subject: [PATCH 4/5] add Vencord badges to user settings section (#3667) Co-authored-by: V --- src/plugins/_api/badges/index.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/plugins/_api/badges/index.tsx b/src/plugins/_api/badges/index.tsx index 8742a4bd3..8c900038d 100644 --- a/src/plugins/_api/badges/index.tsx +++ b/src/plugins/_api/badges/index.tsx @@ -111,6 +111,13 @@ export default definePlugin({ replace: "...$self.getBadgeMouseEventHandlers($1),$&" } ] + }, + { + find: "profileCardUsernameRow,children:", + replacement: { + match: /badges:(\i)(?<=displayProfile:(\i).+?)/, + replace: "badges:[...$self.getBadges($2),...$1]" + } } ], From 228b85a0c8287e72f88b89a821919c51cb982468 Mon Sep 17 00:00:00 2001 From: Vendicated Date: Mon, 22 Sep 2025 05:18:10 +0200 Subject: [PATCH 5/5] bump to v1.13.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 3f0e3371f..4f05e969d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vencord", "private": "true", - "version": "1.12.13", + "version": "1.13.0", "description": "The cutest Discord client mod", "homepage": "https://github.com/Vendicated/Vencord#readme", "bugs": { @@ -105,4 +105,4 @@ "engines": { "node": ">=18" } -} \ No newline at end of file +}