Merge pull request #198 from absidue/attach-listeners-cleanup-previous

Cleanup old listeners in attachListeners even if the player doesn't idle
This commit is contained in:
Killer069 2021-12-14 14:53:49 +05:30 committed by GitHub
commit 63b86922b4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -423,14 +423,29 @@ export function authorization(): void {
* @param resource A {@link YouTubeStream} or {@link SoundCloudStream}
*/
export function attachListeners(player: EventEmitter, resource: YouTubeStream | SoundCloudStream) {
// cleanup existing listeners if they are still registered
type listenerType = (...args: any[]) => void;
const listeners = player.listeners(AudioPlayerStatus.Idle);
for (const cleanup of listeners) {
if ((cleanup as any).__playDlAttachedListener) {
cleanup();
player.removeListener(AudioPlayerStatus.Idle, cleanup as listenerType);
}
}
const pauseListener = () => resource.pause();
const resumeListener = () => resource.resume();
player.on(AudioPlayerStatus.Paused, pauseListener);
player.on(AudioPlayerStatus.AutoPaused, pauseListener);
player.on(AudioPlayerStatus.Playing, resumeListener);
player.once(AudioPlayerStatus.Idle, () => {
const idleListener = () => {
player.removeListener(AudioPlayerStatus.Paused, pauseListener);
player.removeListener(AudioPlayerStatus.AutoPaused, pauseListener);
player.removeListener(AudioPlayerStatus.Playing, resumeListener);
});
};
pauseListener.__playDlAttachedListener = true;
resumeListener.__playDlAttachedListener = true;
idleListener.__playDlAttachedListener = true;
player.on(AudioPlayerStatus.Paused, pauseListener);
player.on(AudioPlayerStatus.AutoPaused, pauseListener);
player.on(AudioPlayerStatus.Playing, resumeListener);
player.once(AudioPlayerStatus.Idle, idleListener);
}