Fix: discord activity sanitizer (#4119)

Co-authored-by: Angelos Bouklis <me@arjix.dev>
This commit is contained in:
Tix
2026-01-29 16:04:31 +07:00
committed by GitHub
parent 12fcb92a8a
commit bc890943ef
2 changed files with 29 additions and 4 deletions

View File

@ -9,7 +9,7 @@ import { TimerManager } from './timer-manager';
import { import {
buildDiscordButtons, buildDiscordButtons,
padHangulFields, padHangulFields,
truncateString, sanitizeActivityText,
isSeek, isSeek,
} from './utils'; } from './utils';
@ -114,13 +114,17 @@ export class DiscordService {
const activityInfo: SetActivity = { const activityInfo: SetActivity = {
type: ActivityType.Listening, type: ActivityType.Listening,
statusDisplayType: config.statusDisplayType, statusDisplayType: config.statusDisplayType,
details: truncateString(songInfo.alternativeTitle ?? songInfo.title, 128), // Song title details: sanitizeActivityText(
songInfo.alternativeTitle ?? songInfo.title
), // Song title
detailsUrl: songInfo.url ?? undefined, 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, stateUrl: songInfo.artistUrl,
largeImageKey: songInfo.imageSrc ?? undefined, largeImageKey: songInfo.imageSrc ?? undefined,
largeImageText: songInfo.album largeImageText: songInfo.album
? truncateString(songInfo.album, 128) ? sanitizeActivityText(songInfo.album)
: undefined, : undefined,
buttons: buildDiscordButtons(config, songInfo), buttons: buildDiscordButtons(config, songInfo),
}; };

View File

@ -19,6 +19,27 @@ export const truncateString = (str: string, length: number): string => {
return str; return str;
}; };
/**
* Sanitizes a string for Discord Rich Presence activity, ensuring it meets length requirements.
* @param input - The string to sanitize.
* @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 | undefined, fallback: string = 'undefined'): string {
const text = (input && input.trim()) ? input.trim() : fallback.trim();
let safeString = truncateString(text, 128);
if (safeString.length === 0) {
return fallback;
}
if (safeString.length < 2) {
safeString = safeString.padEnd(2, ''); // change if necessary
}
return safeString;
}
/** /**
* Builds the array of buttons for the Discord Rich Presence activity. * Builds the array of buttons for the Discord Rich Presence activity.
* @param config - The plugin configuration. * @param config - The plugin configuration.