feat(discord): add option to display artist/title in status (#3692)

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: JellyBrick <shlee1503@naver.com>
This commit is contained in:
pynappo
2025-09-04 23:58:26 -07:00
committed by GitHub
parent f31053cf3c
commit 8e4e2c42f6
5 changed files with 47 additions and 2 deletions

View File

@ -444,7 +444,15 @@
"hide-duration-left": "Hide duration left", "hide-duration-left": "Hide duration left",
"hide-github-button": "Hide GitHub link Button", "hide-github-button": "Hide GitHub link Button",
"play-on-youtube-music": "Play on YouTube Music", "play-on-youtube-music": "Play on YouTube Music",
"set-inactivity-timeout": "Set inactivity timeout" "set-inactivity-timeout": "Set inactivity timeout",
"set-status-display-type": {
"label": "Status text",
"submenu": {
"youtube-music": "Listening to YouTube Music",
"artist": "Listening to {artist}",
"title": "Listening to {song title}"
}
}
}, },
"name": "Discord Rich Presence", "name": "Discord Rich Presence",
"prompt": { "prompt": {

View File

@ -23,3 +23,13 @@ export enum TimerKey {
UpdateTimeout = 'updateTimeout', // Timer for throttled activity updates UpdateTimeout = 'updateTimeout', // Timer for throttled activity updates
DiscordConnectRetry = 'discordConnectRetry', // Timer for Discord connection retries DiscordConnectRetry = 'discordConnectRetry', // Timer for Discord connection retries
} }
/**
* An enum for Discord's activity.status_display_type field, governing which field of the activity should be used after
* "Listening to..." in the user's Discord status.
*/
export const DiscordStatusDisplayType = {
YOUTUBE_MUSIC: 0,
ARTIST: 1,
TITLE: 2,
} as const;

View File

@ -98,8 +98,9 @@ export class DiscordService {
const activityInfo: SetActivity = { const activityInfo: SetActivity = {
type: ActivityType.Listening, type: ActivityType.Listening,
statusDisplayType: config.statusDisplayType,
details: truncateString(songInfo.title, 128), // Song title details: truncateString(songInfo.title, 128), // Song title
detailsUrl: songInfo.url, detailsUrl: songInfo.url ?? undefined,
state: truncateString(songInfo.artist, 128), // Artist name state: truncateString(songInfo.artist, 128), // Artist name
stateUrl: songInfo.artistUrl, stateUrl: songInfo.artistUrl,
largeImageKey: songInfo.imageSrc ?? undefined, largeImageKey: songInfo.imageSrc ?? undefined,

View File

@ -2,6 +2,7 @@ import { createPlugin } from '@/utils';
import { backend } from './main'; import { backend } from './main';
import { onMenu } from './menu'; import { onMenu } from './menu';
import { t } from '@/i18n'; import { t } from '@/i18n';
import { DiscordStatusDisplayType } from './constants';
export type DiscordPluginConfig = { export type DiscordPluginConfig = {
enabled: boolean; enabled: boolean;
@ -33,6 +34,10 @@ export type DiscordPluginConfig = {
* Hide the "duration left" in the rich presence * Hide the "duration left" in the rich presence
*/ */
hideDurationLeft: boolean; hideDurationLeft: boolean;
/**
* Controls which field is displayed in the Discord status text
*/
statusDisplayType: (typeof DiscordStatusDisplayType)[keyof typeof DiscordStatusDisplayType];
}; };
export default createPlugin({ export default createPlugin({
@ -47,6 +52,7 @@ export default createPlugin({
playOnYouTubeMusic: true, playOnYouTubeMusic: true,
hideGitHubButton: false, hideGitHubButton: false,
hideDurationLeft: false, hideDurationLeft: false,
statusDisplayType: DiscordStatusDisplayType.ARTIST,
} as DiscordPluginConfig, } as DiscordPluginConfig,
menu: onMenu, menu: onMenu,
backend, backend,

View File

@ -12,11 +12,18 @@ import type { MenuContext } from '@/types/contexts';
import type { DiscordPluginConfig } from './index'; import type { DiscordPluginConfig } from './index';
import type { MenuTemplate } from '@/menu'; import type { MenuTemplate } from '@/menu';
import { DiscordStatusDisplayType } from './constants';
const registerRefreshOnce = singleton((refreshMenu: () => void) => { const registerRefreshOnce = singleton((refreshMenu: () => void) => {
discordService?.registerRefreshCallback(refreshMenu); discordService?.registerRefreshCallback(refreshMenu);
}); });
const DiscordStatusDisplayTypeLabels = {
[DiscordStatusDisplayType.YOUTUBE_MUSIC]: "plugins.discord.menu.set-status-display-type.submenu.youtube-music",
[DiscordStatusDisplayType.ARTIST]: "plugins.discord.menu.set-status-display-type.submenu.artist",
[DiscordStatusDisplayType.TITLE]: "plugins.discord.menu.set-status-display-type.submenu.title",
}
export const onMenu = async ({ export const onMenu = async ({
window, window,
getConfig, getConfig,
@ -92,6 +99,19 @@ export const onMenu = async ({
label: t('plugins.discord.menu.set-inactivity-timeout'), label: t('plugins.discord.menu.set-inactivity-timeout'),
click: () => setInactivityTimeout(window, config), click: () => setInactivityTimeout(window, config),
}, },
{
label: t('plugins.discord.menu.set-status-display-type.label'),
submenu: Object.values(DiscordStatusDisplayType).map((statusDisplayType) => ({
label: t(DiscordStatusDisplayTypeLabels[statusDisplayType]),
type: 'radio',
checked: config.statusDisplayType == statusDisplayType,
click() {
setConfig({
statusDisplayType
});
},
})),
},
]; ];
}; };