From 3554572dc2c3f880e613d625fe87b5b8f60eb867 Mon Sep 17 00:00:00 2001 From: jeffvli Date: Fri, 5 Dec 2025 01:08:47 -0800 Subject: [PATCH] add interval update and update on discord initalization (#1317) --- .../features/discord-rpc/use-discord-rpc.ts | 76 +++++++++++++++---- src/renderer/utils/logger-message.ts | 1 - 2 files changed, 60 insertions(+), 17 deletions(-) diff --git a/src/renderer/features/discord-rpc/use-discord-rpc.ts b/src/renderer/features/discord-rpc/use-discord-rpc.ts index 74133c619..49d000264 100644 --- a/src/renderer/features/discord-rpc/use-discord-rpc.ts +++ b/src/renderer/features/discord-rpc/use-discord-rpc.ts @@ -33,6 +33,8 @@ export const useDiscordRpc = () => { const [lastUniqueId, setlastUniqueId] = useState(''); const previousEnabledRef = useRef(discordSettings.enabled); + const intervalRef = useRef(null); + const previousActivityStateRef = useRef(null); const setActivity = useCallback( async (current: ActivityState, previous: ActivityState) => { @@ -99,18 +101,6 @@ export const useDiscordRpc = () => { reason = 'player_state_changed'; } - logFn.debug(logMsg[LogCategory.EXTERNAL].discordRpcActivityUpdate, { - category: LogCategory.EXTERNAL, - meta: { - currentStatus: current[2], - currentTime: current[1], - previousStatus: previous[2], - previousTime: previous[1], - reason, - trackChanged, - }, - }); - const start = Math.round(Date.now() - current[1] * 1000); const end = Math.round(start + song.duration); @@ -235,12 +225,17 @@ export const useDiscordRpc = () => { meta: { albumName: song.album, artistName: song.artists?.[0]?.name, + currentStatus: current[2], + currentTime: current[1], displayType: discordSettings.displayType, hasLargeImage: !!activity.largeImageKey, hasTimestamps: !!(activity.startTimestamp && activity.endTimestamp), + previousStatus: previous[2], + previousTime: previous[1], + reason, showAsListening: discordSettings.showAsListening, songName: song.name, - status: current[2], + trackChanged, }, }); discordRpc?.setActivity(activity); @@ -300,16 +295,65 @@ export const useDiscordRpc = () => { }, }); - const unsubSongChange = usePlayerStore.subscribe((state): ActivityState => { + const getCurrentActivityState = (): ActivityState => { + const state = usePlayerStore.getState(); const currentSong = state.getCurrentSong(); const currentTime = useTimestampStoreBase.getState().timestamp; const status = state.player.status; - return [currentSong, currentTime, status]; - }, setActivity); + }; + + const resetInterval = () => { + if (intervalRef.current) { + clearInterval(intervalRef.current); + } + intervalRef.current = setInterval(() => { + const current = getCurrentActivityState(); + const previous = previousActivityStateRef.current || current; + setActivity(current, previous); + previousActivityStateRef.current = current; + }, 15000); + }; + + resetInterval(); + + const initialState = getCurrentActivityState(); + let previousUniqueId = initialState[0]?._uniqueId || ''; + + previousActivityStateRef.current = initialState; + + // Set activity immediately when Discord RPC is enabled + setActivity(initialState, initialState); + + const unsubSongChange = usePlayerStore.subscribe( + (state): ActivityState => { + const currentSong = state.getCurrentSong(); + const currentTime = useTimestampStoreBase.getState().timestamp; + const status = state.player.status; + + return [currentSong, currentTime, status]; + }, + (current, previous) => { + const currentUniqueId = current[0]?._uniqueId || ''; + const trackChanged = previousUniqueId !== currentUniqueId; + + if (trackChanged && current[0]) { + resetInterval(); + previousUniqueId = currentUniqueId; + } + + previousActivityStateRef.current = previous; + + setActivity(current, previous); + }, + ); return () => { unsubSongChange(); + if (intervalRef.current) { + clearInterval(intervalRef.current); + intervalRef.current = null; + } }; }, [discordSettings.clientId, discordSettings.enabled, privateMode, setActivity]); }; diff --git a/src/renderer/utils/logger-message.ts b/src/renderer/utils/logger-message.ts index c713da184..07f4f2d07 100644 --- a/src/renderer/utils/logger-message.ts +++ b/src/renderer/utils/logger-message.ts @@ -8,7 +8,6 @@ export const logMsg = { [LogCategory.API]: {}, [LogCategory.EXTERNAL]: { discordRpcActivityCleared: 'Activity was cleared for Discord RPC', - discordRpcActivityUpdate: 'Activity was updated for Discord RPC', discordRpcEnabled: 'Discord RPC was enabled', discordRpcInitialized: 'Discord RPC was initialized', discordRpcQuit: 'Discord RPC was quit',