#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