Javascript Discord.js音乐机器人与队列不匹配';行不通

Javascript Discord.js音乐机器人与队列不匹配';行不通,javascript,audio,bots,discord,discord.js,Javascript,Audio,Bots,Discord,Discord.js,我正在尝试制作一个有队列的音乐不和谐机器人。当前,play命令起作用,我可以将音乐添加到队列(使用我的playlist命令显示)。问题是,当第一首音乐结束时,机器人完全停止并不播放下一首歌曲(它不会断开连接,看起来好像在播放什么)。 我使用Discord.jsv12、ffmpeg静态和Youtube API if (command === "play" || command === "p") { const args = message.content.split(" ");

我正在尝试制作一个有队列的音乐不和谐机器人。当前,play命令起作用,我可以将音乐添加到队列(使用我的playlist命令显示)。问题是,当第一首音乐结束时,机器人完全停止并不播放下一首歌曲(它不会断开连接,看起来好像在播放什么)。
我使用Discord.jsv12、ffmpeg静态和Youtube API

if (command === "play" || command === "p") {

    const args = message.content.split(" ");
    const searchString = args.slice(1).join(" ");
    if (!args[1]) {
      return message.channel.send('Il faut spécifier une URL !')
        .catch(console.error);
    }
    const url = args[1] ? args[1].replace(/<(.+)>/g, "$1") : "";
    const serverQueue = queue.get(message.guild.id);
    var voiceChannel = message.member.voice.channel;
    if (!voiceChannel) return message.channel.send("Tu dois être dans un salon vocal pour utiliser cette commande !");
    const permissions = voiceChannel.permissionsFor(message.client.user);
    if (!permissions.has("CONNECT")) {
      return message.channel.send("J'ai besoin de la permission **`CONNECT`** pour cette commande");
    }
    if (!permissions.has("SPEAK")) {
      return message.channel.send("J'ai besoin de la permission **`SPEAK`** pour parler");
    }

    if (url.match(/^https?:\/\/(www.youtube.com|youtube.com)\/playlist(.*)$/)) {
      const playlist = await youtube.getPlaylist(url);
      const videos = await playlist.getVideos();
      for (const video of Object.values(videos)) {
        const video2 = await youtube.getVideoByID(video.id); // eslint-disable-line no-await-in-loop
        await handleVideo(video2, message, voiceChannel, true); // eslint-disable-line no-await-in-loop
      }
      return message.channel.send(`:white_check_mark:  **|**  Playlist: **\`${playlist.title}\`** a été ajouté à la playlist !`);
    } else {
      try {
        var video = await youtube.getVideo(url);
      } catch (error) {
        try {
          var videos = await youtube.searchVideos(searchString, 10);
          let index = 0;
          // eslint-disable-next-line max-depth
          try {

          } catch (err) {
            console.error(err);
            return message.channel.send("Annulation de la commande...");
          }
          const videoIndex = parseInt(1);
          var video = await youtube.getVideoByID(videos[videoIndex - 1].id);
        } catch (err) {
          console.error(err);
          return message.channel.send("Try replacing 
"end"
with
"finish"
:

const dispatcher = serverQueue.connection.play(ytdl(song.url)).on("end", reason => {
if(command==“play”| | command==“p”){
const args=message.content.split(“”);
const searchString=args.slice(1.join(“”);
如果(!args[1]){
返回message.channel.send('Il faut spécifier une URL!')
.catch(控制台错误);
}
常量url=args[1]?args[1]。替换(//g,“$1”):”;
const serverQueue=queue.get(message.guild.id);
var voiceChannel=message.member.voice.channel;
if(!voiceChannel)返回message.channel.send(“tudoisêtre dans un salon voice pour userier cette commande!”);
const permissions=voiceChannel.permissions(message.client.user);
如果(!permissions.has(“CONNECT”)){
返回message.channel.send(“J'ai besoin de la permission**`CONNECT`**pour cette commande”);
}
如果(!permissions.has(“SPEAK”)){
返回message.channel.send(“J'ai besoin de la permission**`SPEAK`**pour parler”);
}
if(url.match(/^https?:\/\/(www.youtube.com | youtube.com)\/playlist(.*)$/){
const playlist=wait youtube.getPlaylist(url);
const videos=wait playlist.getVideos();
用于(对象的常量视频。值(视频)){
const video2=await youtube.getVideoByID(video.id);//eslint禁用循环中的无等待行
wait handleVideo(video2,message,voiceChannel,true);//eslint禁用行no wait in循环
}
返回message.channel.send(`:white\u check\u mark:*.**Playlist:*\`${Playlist.title}\`**aétéajoutéla Playlist!`);
}否则{
试一试{
var video=wait youtube.getVideo(url);
}捕获(错误){
试一试{
var videos=wait youtube.searchVideos(searchString,10);
设指数=0;
//eslint禁用下一行最大深度
试一试{
}捕捉(错误){
控制台错误(err);
返回消息。通道。发送(“命令无效…”);
}
const videoIndex=parseInt(1);
var video=wait youtube.getVideoByID(videos[videoIndex-1].id);
}捕捉(错误){
控制台错误(err);
返回消息.channel.send(“尝试将
“end”
替换为
“finish”


我建议您在play命令的第一行声明serverQueue变量后记录它,以查看您的队列是否为空或是否有其他错误。您还应该尝试记录song变量,以防万一Yep变量似乎为serverQueue空,但我不明白为什么我要自己执行一些测试,我是com如果我发现任何东西,我会回复你的。我真的很抱歉,但是我无法让你的代码在我的电脑上工作。我想我可能错过了正确的模块…从现在开始,我建议你尝试其他模块,比如
ytsr
查找歌曲,
ytpl
播放列表,以及使用
ytdl
获取信息(id、标题等),它可能会帮助您解决问题。您也可以执行我喜欢称之为“大规模日志记录”的操作,这包括记录代码的每一步,以查看错误的来源。我希望您能解决这个问题,如果您这样做,请让我知道:)哇,它成功了,谢谢!我没想到6个月后我会找到答案!
const dispatcher = serverQueue.connection.play(ytdl(song.url)).on("finish", reason => {