From 2f6cf886c3cde3b3ff92c92fc9780493bef7136b Mon Sep 17 00:00:00 2001
From: Wizzard <rich@bandaholics.cash>
Date: Thu, 10 Apr 2025 14:31:41 -0400
Subject: [PATCH] Fix track restarting when a new song is added to the queue
 and repeat is enabled

---
 utils/queueManager.js | 60 ++++++++++++++++++++++++++++---------------
 1 file changed, 39 insertions(+), 21 deletions(-)

diff --git a/utils/queueManager.js b/utils/queueManager.js
index 5e3ce4a..cc4c2b1 100644
--- a/utils/queueManager.js
+++ b/utils/queueManager.js
@@ -19,8 +19,10 @@ function addToQueue(guildId, filePath, title, voiceChannel, url, requester, avat
     }
 
     const audioPlayer = playerMap.get(guildId);
+    const isPlaying = audioPlayer && audioPlayer.state.status === AudioPlayerStatus.Playing;
+    const repeat = repeatMap.get(guildId) || false;
 
-    if (!audioPlayer || audioPlayer.state.status !== AudioPlayerStatus.Playing) {
+    if (!isPlaying) {
         playNextInQueue(guildId);
     }
 }
@@ -58,31 +60,31 @@ function playNextInQueue(guildId) {
     const currentTrack = getCurrentTrack(guildId);
     const repeat = repeatMap.get(guildId);
     const voiceChannel = voiceChannelMap.get(guildId);
+    const player = playerMap.get(guildId);
+    const isPlaying = player && player.state.status === AudioPlayerStatus.Playing;
 
     if (!voiceChannel) {
         console.error("Voice channel is undefined. Cannot play track.");
         return false;
     }
 
-    if (currentTrack && !repeat) {
+    let trackToPlay = null;
+
+    if (currentTrack && repeat && isPlaying) {
+        return true;
+    } else if (currentTrack && repeat) {
+        trackToPlay = currentTrack;
+    } else if (queue.length > 0) {
+        trackToPlay = queue.shift();
+        currentTrackMap.set(guildId, trackToPlay);
+    } else if (currentTrack && !repeat) {
         return false;
-    }
-
-    let trackToPlay = currentTrack;
-
-    if (!trackToPlay) {
-        if (queue.length > 0) {
-            trackToPlay = queue.shift();
-            currentTrackMap.set(guildId, trackToPlay);
-        } else if (repeat && currentTrack) {
-            trackToPlay = currentTrack;
-        } else {
-            const connection = playerMap.get(guildId)?._state?.subscription?.connection;
-            if (connection && connection.state.status !== 'destroyed') {
-                connection.destroy();
-            }
-            return false;
+    } else {
+        const connection = playerMap.get(guildId)?._state?.subscription?.connection;
+        if (connection && connection.state.status !== 'destroyed') {
+            connection.destroy();
         }
+        return false;
     }
 
     playTrack(guildId, voiceChannel, trackToPlay);
@@ -102,15 +104,19 @@ function playTrack(guildId, voiceChannel, track) {
         playerMap.set(guildId, audioPlayer);
 
         audioPlayer.on(AudioPlayerStatus.Idle, () => {
-            if (!repeatMap.get(guildId)) {
+            const isRepeatEnabled = repeatMap.get(guildId);
+            const queue = getQueue(guildId);
+            
+            if (!isRepeatEnabled) {
                 currentTrackMap.delete(guildId);
                 fs.unlink(track.filePath, (err) => {
                     if (err) console.error('Error deleting file:', track.filePath, err);
                 });
             }
 
-            const queue = getQueue(guildId);
-            if (queue.length > 0 || repeatMap.get(guildId)) {
+            if (queue.length > 0) {
+                playNextInQueue(guildId);
+            } else if (isRepeatEnabled) {
                 playNextInQueue(guildId);
             } else {
                 if (connection && connection.state.status !== 'destroyed') {
@@ -164,6 +170,7 @@ function playTrack(guildId, voiceChannel, track) {
 function skipTrack(guildId) {
     const player = playerMap.get(guildId);
     const queue = getQueue(guildId);
+    const wasRepeatEnabled = repeatMap.get(guildId);
 
     if (!player) {
         console.error('No player found for this guild.');
@@ -171,10 +178,21 @@ function skipTrack(guildId) {
     }
 
     currentTrackMap.delete(guildId);
+    
+    if (wasRepeatEnabled) {
+        repeatMap.set(guildId, false);
+    }
+    
     player.stop();
 
     if (queue.length > 0) {
         playNextInQueue(guildId);
+    } else if (wasRepeatEnabled) {
+        repeatMap.set(guildId, true);
+        const connection = playerMap.get(guildId)?._state?.subscription?.connection;
+        if (connection && connection.state.status !== 'destroyed') {
+            connection.destroy();
+        }
     } else {
         const connection = playerMap.get(guildId)?._state?.subscription?.connection;
         if (connection && connection.state.status !== 'destroyed') {