discord.js 音乐机器人 dispatcher.on("finish") 逻辑运行多次从队列中删除歌曲然后断开机器人
discord.js music bot dispatcher.on("finish") logic runs multiple times removing songs from queue and then disconnecting bot
我设置了一个 discord 机器人来获取 youtube url 并在启动机器人命令的用户所在的当前语音频道中播放它们。机器人可以创建一个包含多个 youtube 链接的队列,但是当队列中的第一首歌曲完成播放时,下面的代码给我一个问题,它似乎 运行 逻辑的次数与队列中歌曲的次数一样多。例如,如果队列中有 6 首歌曲,则 server.dispatcher.on(finish) 逻辑会连续执行 6 次,一首一首地删除队列中的歌曲,直到队列中没有歌曲为止,然后机器人断开与语音通道。
function playF(connectionF, message){
console.log("starting the play function ");
var server = servers[message.guild.id];
if(!playingMusic){
console.log("not playing music, running this logic ");
server.dispatcher = connectionF.play(ytdl(server.queue[0], {filter: "audioonly"}));
server.queue.shift();
playingMusic = true;
}
server.dispatcher.on("finish", () => {
console.log("running the finish logic ");
console.log("heres your queue length in finish " + server.queue.length);
playingMusic = false;
if(server.queue[0]){
playF(connectionF, message);
} else {
connectionF.disconnect();
}
});
}
```
所以我发现我需要进行一些重组以将 .on("finish") 添加到第 8 行的 server.dispatcher。以下代码解决了我的问题。
function playF(connectionF, message){
console.log("starting the play function ");
var server = servers[message.guild.id];
if(!playingMusic){
playingMusic = true;
console.log("not playing music, running this logic ");
server.dispatcher = connectionF.play(ytdl(server.queue[0], {filter: "audioonly"})).on("finish", () =>{
playingMusic = false;
if(server.queue[0]){
playF(connectionF, message);
} else {
connectionF.disconnect();
}
});
server.queue.shift();
}
}
```
我设置了一个 discord 机器人来获取 youtube url 并在启动机器人命令的用户所在的当前语音频道中播放它们。机器人可以创建一个包含多个 youtube 链接的队列,但是当队列中的第一首歌曲完成播放时,下面的代码给我一个问题,它似乎 运行 逻辑的次数与队列中歌曲的次数一样多。例如,如果队列中有 6 首歌曲,则 server.dispatcher.on(finish) 逻辑会连续执行 6 次,一首一首地删除队列中的歌曲,直到队列中没有歌曲为止,然后机器人断开与语音通道。
function playF(connectionF, message){
console.log("starting the play function ");
var server = servers[message.guild.id];
if(!playingMusic){
console.log("not playing music, running this logic ");
server.dispatcher = connectionF.play(ytdl(server.queue[0], {filter: "audioonly"}));
server.queue.shift();
playingMusic = true;
}
server.dispatcher.on("finish", () => {
console.log("running the finish logic ");
console.log("heres your queue length in finish " + server.queue.length);
playingMusic = false;
if(server.queue[0]){
playF(connectionF, message);
} else {
connectionF.disconnect();
}
});
}
```
所以我发现我需要进行一些重组以将 .on("finish") 添加到第 8 行的 server.dispatcher。以下代码解决了我的问题。
function playF(connectionF, message){
console.log("starting the play function ");
var server = servers[message.guild.id];
if(!playingMusic){
playingMusic = true;
console.log("not playing music, running this logic ");
server.dispatcher = connectionF.play(ytdl(server.queue[0], {filter: "audioonly"})).on("finish", () =>{
playingMusic = false;
if(server.queue[0]){
playF(connectionF, message);
} else {
connectionF.disconnect();
}
});
server.queue.shift();
}
}
```