Как мне заставить моего discord бота ждать окончания текущей песни, а не пропускать текущую песню в очереди при добавлении новой

#javascript #discord #discord.js

#javascript #Discord #discord.js

Вопрос:

Я пытаюсь создать функцию музыкального бота discord для моего бота. всякий раз, когда я использую команду воспроизведения, бот останавливает воспроизведение текущей песни и сразу же начинает воспроизведение новой песни, которую я поставил в очередь, как мне заставить его дождаться окончания текущей песни, а затем перейти к следующей в очереди.

 var servers = {};

function play(connection, message) {
    var server = servers[message.guild.id];
    const dispatcher = connection.play(ytdl(server.queue[0], { filter: 
        "audioonly" }));

    server.dispatcher = connection.play(ytdl(server.queue[0], { filter: 
    "audioonly" }));

    dispatcher.on('error', console.error);

    server.dispatcher.setVolume(0.2);

    server.dispatcher.on("end", function () {

        server.queue.shift();

    if (server.queue[0]) play(connection, message);
    else connection.disconnect();

});

}

Crashbot.on('message', async message =>{

    let args = message.content.substring(PREFIX.length).split(" ");

switch (args[0]) {
 case "play":
        if (!args[1]) {
            message.reply(`You need to put a link after ${PREFIX}play to add a song to the queue`)
            return;
        }
        if (!message.member.voice.channel) {
            message.channel.send("You must be in a voice channel to use this command")
            return;
        }
        if (!servers[message.guild.id]) servers[message.guild.id] = {
            queue: []
        }
        var server = servers[message.guild.id];

        server.queue.push(args[1]);

        if (!message.guild.voiceConnection) message.member.voice.channel.join().then(function (connection) {
                play(connection, message);
        });
        break;
 case "skip":
        var server = servers[message.guild.id];

        if (server.dispatcher) server.dispatcher.end();
        break;

 case "stop":
        var server = servers[message.guild.id];

        if (message.guild.voiceConnection) message.guild.voiceConnection.disconnect();
        break;
}

})
  

Ответ №1:

Вам нужно либо сохранить состояние текущей песни, воспроизводимой через переменную, либо посмотреть на библиотеку, которую вы используете для воспроизведения песен, чтобы увидеть, есть ли проверка состояния.

Вариант 1

глобальном статусе или создать класс, который содержит ваш экземпляр воспроизведения со статусом. Затем, когда воспроизведение по хитам заканчивается или вы отключаетесь из-за того, что кто-то нажал «Стоп», вы меняете статус.

Идея заключается в том, что когда пользователь нажимает кнопку воспроизведения, чтобы добавить новую песню в очередь, и статус paused/stopped , тогда воспроизводится песня. Если статус playing , то вы просто добавляете песню в очередь и не вызываете функцию воспроизведения

Вариант 2

Зависит от вашей библиотеки, поэтому посмотрите документы, чтобы лучше понять, что доступно, когда дело доходит до текущего статуса воспроизведения. Как только у вас это будет, выполните те же проверки статуса, что и в варианте 1