From 99d83cbcc80b36b7857415d80198a7740df7872b Mon Sep 17 00:00:00 2001 From: Tix Date: Fri, 28 Nov 2025 16:08:59 +0700 Subject: [PATCH 1/5] discord activity sanitizer --- src/plugins/discord/discord-service.ts | 8 ++++---- src/plugins/discord/utils.ts | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/plugins/discord/discord-service.ts b/src/plugins/discord/discord-service.ts index 728836c0ef..8b5c2909fa 100644 --- a/src/plugins/discord/discord-service.ts +++ b/src/plugins/discord/discord-service.ts @@ -9,7 +9,7 @@ import { TimerManager } from './timer-manager'; import { buildDiscordButtons, padHangulFields, - truncateString, + sanitizeActivityText, isSeek, } from './utils'; @@ -99,13 +99,13 @@ export class DiscordService { const activityInfo: SetActivity = { type: ActivityType.Listening, statusDisplayType: config.statusDisplayType, - details: truncateString(songInfo.alternativeTitle ?? songInfo.title, 128), // Song title + details: sanitizeActivityText(songInfo.alternativeTitle ?? songInfo.title), // Song title detailsUrl: songInfo.url ?? undefined, - state: truncateString(songInfo.tags?.at(0) ?? songInfo.artist, 128), // Artist name + state: sanitizeActivityText(songInfo.tags?.at(0) ?? songInfo.artist), // Artist name stateUrl: songInfo.artistUrl, largeImageKey: songInfo.imageSrc ?? undefined, largeImageText: songInfo.album - ? truncateString(songInfo.album, 128) + ? sanitizeActivityText(songInfo.album) : undefined, buttons: buildDiscordButtons(config, songInfo), }; diff --git a/src/plugins/discord/utils.ts b/src/plugins/discord/utils.ts index f37177604b..12a18d4d41 100644 --- a/src/plugins/discord/utils.ts +++ b/src/plugins/discord/utils.ts @@ -17,6 +17,26 @@ export const truncateString = (str: string, length: number): string => { return str; }; +/** + * Sanitizes a string for Discord Activity. + * @param input - The string to sanitize. + * @returns The sanitized string. + */ +export function sanitizeActivityText(input: string): string { + if (!input) { + throw new Error("Activity text cannot be empty."); + } + + const trimmed = input.trim(); + let safeString = truncateString(trimmed, 128); + + if (safeString.length < 2) { + safeString = safeString + "⠀"; // change if you have better replacement + } + + return safeString; +} + /** * Builds the array of buttons for the Discord Rich Presence activity. * @param config - The plugin configuration. From 925dc08ca24cc26520c189166d815cb610a693da Mon Sep 17 00:00:00 2001 From: Tix Date: Fri, 28 Nov 2025 16:17:22 +0700 Subject: [PATCH 2/5] fix --- src/plugins/discord/utils.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/plugins/discord/utils.ts b/src/plugins/discord/utils.ts index 12a18d4d41..8fa895d123 100644 --- a/src/plugins/discord/utils.ts +++ b/src/plugins/discord/utils.ts @@ -20,16 +20,20 @@ export const truncateString = (str: string, length: number): string => { /** * Sanitizes a string for Discord Activity. * @param input - The string to sanitize. - * @returns The sanitized string. + * @returns The sanitized string or undefined. */ -export function sanitizeActivityText(input: string): string { +export function sanitizeActivityText(input?: string): string { if (!input) { - throw new Error("Activity text cannot be empty."); + return "undefined"; } const trimmed = input.trim(); let safeString = truncateString(trimmed, 128); + if (safeString.length <= 0) { + return "undefined"; + } + if (safeString.length < 2) { safeString = safeString + "⠀"; // change if you have better replacement } From 08997f49d17e0848a9fbad31aaef199b763ca4a7 Mon Sep 17 00:00:00 2001 From: Tix Date: Fri, 28 Nov 2025 16:21:32 +0700 Subject: [PATCH 3/5] prettier --- src/plugins/discord/discord-service.ts | 8 ++++++-- src/plugins/discord/utils.ts | 6 +++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/plugins/discord/discord-service.ts b/src/plugins/discord/discord-service.ts index 8b5c2909fa..ad5399d4ce 100644 --- a/src/plugins/discord/discord-service.ts +++ b/src/plugins/discord/discord-service.ts @@ -99,9 +99,13 @@ export class DiscordService { const activityInfo: SetActivity = { type: ActivityType.Listening, statusDisplayType: config.statusDisplayType, - details: sanitizeActivityText(songInfo.alternativeTitle ?? songInfo.title), // Song title + details: sanitizeActivityText( + songInfo.alternativeTitle ?? songInfo.title + ), // Song title detailsUrl: songInfo.url ?? undefined, - state: sanitizeActivityText(songInfo.tags?.at(0) ?? songInfo.artist), // Artist name + state: sanitizeActivityText( + songInfo.tags?.at(0) ?? songInfo.artist + ), // Artist name stateUrl: songInfo.artistUrl, largeImageKey: songInfo.imageSrc ?? undefined, largeImageText: songInfo.album diff --git a/src/plugins/discord/utils.ts b/src/plugins/discord/utils.ts index 8fa895d123..320f3f2b1f 100644 --- a/src/plugins/discord/utils.ts +++ b/src/plugins/discord/utils.ts @@ -24,18 +24,18 @@ export const truncateString = (str: string, length: number): string => { */ export function sanitizeActivityText(input?: string): string { if (!input) { - return "undefined"; + return 'undefined'; } const trimmed = input.trim(); let safeString = truncateString(trimmed, 128); if (safeString.length <= 0) { - return "undefined"; + return 'undefined'; } if (safeString.length < 2) { - safeString = safeString + "⠀"; // change if you have better replacement + safeString = safeString + '⠀'; // change if you have better replacement } return safeString; From e8db80d158c3ba5e82fd61e46c601ad879bda67a Mon Sep 17 00:00:00 2001 From: Tix Date: Sun, 30 Nov 2025 16:29:58 +0700 Subject: [PATCH 4/5] sanitize function fallback --- src/plugins/discord/utils.ts | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/plugins/discord/utils.ts b/src/plugins/discord/utils.ts index 320f3f2b1f..c79f200b5a 100644 --- a/src/plugins/discord/utils.ts +++ b/src/plugins/discord/utils.ts @@ -18,24 +18,21 @@ export const truncateString = (str: string, length: number): string => { }; /** - * Sanitizes a string for Discord Activity. + * Sanitizes a string for Discord Rich Presence activity, ensuring it meets length requirements. * @param input - The string to sanitize. - * @returns The sanitized string or undefined. + * @param fallback - A fallback string to use if the input is empty or whitespace. Defaults to 'undefined'. + * @returns The sanitized string, compliant with Discord's requirements. */ -export function sanitizeActivityText(input?: string): string { - if (!input) { - return 'undefined'; - } - - const trimmed = input.trim(); - let safeString = truncateString(trimmed, 128); +export function sanitizeActivityText(input: string | undefined, fallback: string = 'undefined'): string { + const text = (input && input.trim()) ? input.trim() : fallback.trim(); + let safeString = truncateString(text, 128); - if (safeString.length <= 0) { - return 'undefined'; + if (safeString.length === 0) { + return 'undefined'; // change if necessary } if (safeString.length < 2) { - safeString = safeString + '⠀'; // change if you have better replacement + safeString = safeString.padEnd(2, '⠀'); // change if necessary } return safeString; From 51d8d17567e9b8072d7b12df0778d1af6c827b7d Mon Sep 17 00:00:00 2001 From: Tix Date: Mon, 1 Dec 2025 00:16:35 +0700 Subject: [PATCH 5/5] Update src/plugins/discord/utils.ts Co-authored-by: Angelos Bouklis --- src/plugins/discord/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/discord/utils.ts b/src/plugins/discord/utils.ts index c79f200b5a..caf2f5a1af 100644 --- a/src/plugins/discord/utils.ts +++ b/src/plugins/discord/utils.ts @@ -28,7 +28,7 @@ export function sanitizeActivityText(input: string | undefined, fallback: string let safeString = truncateString(text, 128); if (safeString.length === 0) { - return 'undefined'; // change if necessary + return fallback; } if (safeString.length < 2) {