mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-10 04:30:25 +02:00
add interval update and update on discord initalization (#1317)
This commit is contained in:
@@ -33,6 +33,8 @@ export const useDiscordRpc = () => {
|
|||||||
const [lastUniqueId, setlastUniqueId] = useState('');
|
const [lastUniqueId, setlastUniqueId] = useState('');
|
||||||
|
|
||||||
const previousEnabledRef = useRef<boolean>(discordSettings.enabled);
|
const previousEnabledRef = useRef<boolean>(discordSettings.enabled);
|
||||||
|
const intervalRef = useRef<NodeJS.Timeout | null>(null);
|
||||||
|
const previousActivityStateRef = useRef<ActivityState | null>(null);
|
||||||
|
|
||||||
const setActivity = useCallback(
|
const setActivity = useCallback(
|
||||||
async (current: ActivityState, previous: ActivityState) => {
|
async (current: ActivityState, previous: ActivityState) => {
|
||||||
@@ -99,18 +101,6 @@ export const useDiscordRpc = () => {
|
|||||||
reason = 'player_state_changed';
|
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 start = Math.round(Date.now() - current[1] * 1000);
|
||||||
const end = Math.round(start + song.duration);
|
const end = Math.round(start + song.duration);
|
||||||
|
|
||||||
@@ -235,12 +225,17 @@ export const useDiscordRpc = () => {
|
|||||||
meta: {
|
meta: {
|
||||||
albumName: song.album,
|
albumName: song.album,
|
||||||
artistName: song.artists?.[0]?.name,
|
artistName: song.artists?.[0]?.name,
|
||||||
|
currentStatus: current[2],
|
||||||
|
currentTime: current[1],
|
||||||
displayType: discordSettings.displayType,
|
displayType: discordSettings.displayType,
|
||||||
hasLargeImage: !!activity.largeImageKey,
|
hasLargeImage: !!activity.largeImageKey,
|
||||||
hasTimestamps: !!(activity.startTimestamp && activity.endTimestamp),
|
hasTimestamps: !!(activity.startTimestamp && activity.endTimestamp),
|
||||||
|
previousStatus: previous[2],
|
||||||
|
previousTime: previous[1],
|
||||||
|
reason,
|
||||||
showAsListening: discordSettings.showAsListening,
|
showAsListening: discordSettings.showAsListening,
|
||||||
songName: song.name,
|
songName: song.name,
|
||||||
status: current[2],
|
trackChanged,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
discordRpc?.setActivity(activity);
|
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 currentSong = state.getCurrentSong();
|
||||||
const currentTime = useTimestampStoreBase.getState().timestamp;
|
const currentTime = useTimestampStoreBase.getState().timestamp;
|
||||||
const status = state.player.status;
|
const status = state.player.status;
|
||||||
|
|
||||||
return [currentSong, currentTime, 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 () => {
|
return () => {
|
||||||
unsubSongChange();
|
unsubSongChange();
|
||||||
|
if (intervalRef.current) {
|
||||||
|
clearInterval(intervalRef.current);
|
||||||
|
intervalRef.current = null;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}, [discordSettings.clientId, discordSettings.enabled, privateMode, setActivity]);
|
}, [discordSettings.clientId, discordSettings.enabled, privateMode, setActivity]);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ export const logMsg = {
|
|||||||
[LogCategory.API]: {},
|
[LogCategory.API]: {},
|
||||||
[LogCategory.EXTERNAL]: {
|
[LogCategory.EXTERNAL]: {
|
||||||
discordRpcActivityCleared: 'Activity was cleared for Discord RPC',
|
discordRpcActivityCleared: 'Activity was cleared for Discord RPC',
|
||||||
discordRpcActivityUpdate: 'Activity was updated for Discord RPC',
|
|
||||||
discordRpcEnabled: 'Discord RPC was enabled',
|
discordRpcEnabled: 'Discord RPC was enabled',
|
||||||
discordRpcInitialized: 'Discord RPC was initialized',
|
discordRpcInitialized: 'Discord RPC was initialized',
|
||||||
discordRpcQuit: 'Discord RPC was quit',
|
discordRpcQuit: 'Discord RPC was quit',
|
||||||
|
|||||||
Reference in New Issue
Block a user