summaryrefslogtreecommitdiff
path: root/src/handlers/seekCommand.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/handlers/seekCommand.js')
-rw-r--r--src/handlers/seekCommand.js51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/handlers/seekCommand.js b/src/handlers/seekCommand.js
new file mode 100644
index 0000000..e48f603
--- /dev/null
+++ b/src/handlers/seekCommand.js
@@ -0,0 +1,51 @@
+const { EmbedBuilder } = require('discord.js');
+const { playSong, getCurrentProgress, formatDuration, safeCleanup } = require('../utils/player');
+const { getQueueOrReply } = require('../utils/helpers');
+
+function handleSeek(interaction, queues) {
+ const queue = getQueueOrReply(interaction, queues, 'Nothing is playing!');
+ if (!queue || queue.songs.length === 0) {
+ if (queue) interaction.reply('Nothing is playing!');
+ return;
+ }
+
+ if (queue.isSeeking) {
+ return interaction.reply('Already seeking, please wait!');
+ }
+
+ const seconds = interaction.options.getInteger('seconds');
+ const progress = getCurrentProgress(queue);
+
+ if (!progress) {
+ return interaction.reply('Cannot seek right now!');
+ }
+
+ let newPosition = progress.elapsed + seconds;
+ const song = queue.songs[0];
+
+ if (newPosition < 0) {
+ newPosition = 0;
+ }
+
+ if (newPosition >= song.duration) {
+ queue.player.stop();
+ return interaction.reply('Skipped to next song!');
+ }
+
+ queue.isSeeking = true;
+ safeCleanup(queue, 'Seek');
+
+ queue.player.stop();
+
+ console.log(`[SEEK] Guild: ${interaction.guild.id}, From: ${progress.elapsed}s, To: ${newPosition}s`);
+
+ playSong(interaction.guild.id, queue, newPosition);
+
+ const embed = new EmbedBuilder()
+ .setColor(0x00ff00)
+ .setDescription(`⏩ Seeking to ${formatDuration(newPosition)} / ${formatDuration(song.duration)}`);
+
+ interaction.reply({ embeds: [embed] });
+}
+
+module.exports = { handleSeek };