Skip to content

Commit 8e4e2c4

Browse files
pynappoCopilotJellyBrick
authored
feat(discord): add option to display artist/title in status (#3692)
Co-authored-by: Copilot <[email protected]> Co-authored-by: JellyBrick <[email protected]>
1 parent f31053c commit 8e4e2c4

File tree

5 files changed

+47
-2
lines changed

5 files changed

+47
-2
lines changed

src/i18n/resources/en.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,15 @@
444444
"hide-duration-left": "Hide duration left",
445445
"hide-github-button": "Hide GitHub link Button",
446446
"play-on-youtube-music": "Play on YouTube Music",
447-
"set-inactivity-timeout": "Set inactivity timeout"
447+
"set-inactivity-timeout": "Set inactivity timeout",
448+
"set-status-display-type": {
449+
"label": "Status text",
450+
"submenu": {
451+
"youtube-music": "Listening to YouTube Music",
452+
"artist": "Listening to {artist}",
453+
"title": "Listening to {song title}"
454+
}
455+
}
448456
},
449457
"name": "Discord Rich Presence",
450458
"prompt": {

src/plugins/discord/constants.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,13 @@ export enum TimerKey {
2323
UpdateTimeout = 'updateTimeout', // Timer for throttled activity updates
2424
DiscordConnectRetry = 'discordConnectRetry', // Timer for Discord connection retries
2525
}
26+
27+
/**
28+
* An enum for Discord's activity.status_display_type field, governing which field of the activity should be used after
29+
* "Listening to..." in the user's Discord status.
30+
*/
31+
export const DiscordStatusDisplayType = {
32+
YOUTUBE_MUSIC: 0,
33+
ARTIST: 1,
34+
TITLE: 2,
35+
} as const;

src/plugins/discord/discord-service.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,9 @@ export class DiscordService {
9898

9999
const activityInfo: SetActivity = {
100100
type: ActivityType.Listening,
101+
statusDisplayType: config.statusDisplayType,
101102
details: truncateString(songInfo.title, 128), // Song title
102-
detailsUrl: songInfo.url,
103+
detailsUrl: songInfo.url ?? undefined,
103104
state: truncateString(songInfo.artist, 128), // Artist name
104105
stateUrl: songInfo.artistUrl,
105106
largeImageKey: songInfo.imageSrc ?? undefined,

src/plugins/discord/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { createPlugin } from '@/utils';
22
import { backend } from './main';
33
import { onMenu } from './menu';
44
import { t } from '@/i18n';
5+
import { DiscordStatusDisplayType } from './constants';
56

67
export type DiscordPluginConfig = {
78
enabled: boolean;
@@ -33,6 +34,10 @@ export type DiscordPluginConfig = {
3334
* Hide the "duration left" in the rich presence
3435
*/
3536
hideDurationLeft: boolean;
37+
/**
38+
* Controls which field is displayed in the Discord status text
39+
*/
40+
statusDisplayType: (typeof DiscordStatusDisplayType)[keyof typeof DiscordStatusDisplayType];
3641
};
3742

3843
export default createPlugin({
@@ -47,6 +52,7 @@ export default createPlugin({
4752
playOnYouTubeMusic: true,
4853
hideGitHubButton: false,
4954
hideDurationLeft: false,
55+
statusDisplayType: DiscordStatusDisplayType.ARTIST,
5056
} as DiscordPluginConfig,
5157
menu: onMenu,
5258
backend,

src/plugins/discord/menu.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,18 @@ import type { MenuContext } from '@/types/contexts';
1212
import type { DiscordPluginConfig } from './index';
1313

1414
import type { MenuTemplate } from '@/menu';
15+
import { DiscordStatusDisplayType } from './constants';
1516

1617
const registerRefreshOnce = singleton((refreshMenu: () => void) => {
1718
discordService?.registerRefreshCallback(refreshMenu);
1819
});
1920

21+
const DiscordStatusDisplayTypeLabels = {
22+
[DiscordStatusDisplayType.YOUTUBE_MUSIC]: "plugins.discord.menu.set-status-display-type.submenu.youtube-music",
23+
[DiscordStatusDisplayType.ARTIST]: "plugins.discord.menu.set-status-display-type.submenu.artist",
24+
[DiscordStatusDisplayType.TITLE]: "plugins.discord.menu.set-status-display-type.submenu.title",
25+
}
26+
2027
export const onMenu = async ({
2128
window,
2229
getConfig,
@@ -92,6 +99,19 @@ export const onMenu = async ({
9299
label: t('plugins.discord.menu.set-inactivity-timeout'),
93100
click: () => setInactivityTimeout(window, config),
94101
},
102+
{
103+
label: t('plugins.discord.menu.set-status-display-type.label'),
104+
submenu: Object.values(DiscordStatusDisplayType).map((statusDisplayType) => ({
105+
label: t(DiscordStatusDisplayTypeLabels[statusDisplayType]),
106+
type: 'radio',
107+
checked: config.statusDisplayType == statusDisplayType,
108+
click() {
109+
setConfig({
110+
statusDisplayType
111+
});
112+
},
113+
})),
114+
},
95115
];
96116
};
97117

0 commit comments

Comments
 (0)