Bot musik Discord.js dengan antrian tidak berfungsi

Saya mencoba membuat Bot Discord musik dengan antrian. Saat ini, perintah putar berfungsi dan saya dapat menambahkan musik ke antrian (ditampilkan dengan perintah daftar putar saya). Masalahnya adalah ketika musik pertama berakhir, bot berhenti sepenuhnya dan tidak memutar lagu berikutnya (tidak terputus dan sepertinya sedang memutar sesuatu).
Saya menggunakan Discord.js v12, ffmpeg-static dan 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("????  **|**  Je n'obtiens aucun résultat :pensive:");
        }
      }
      return handleVideo(video, message, voiceChannel);
    }
}


async function handleVideo(video, message, voiceChannel, playlist = false) {
  const serverQueue = queue.get(message.guild.id);
  const song = {
    id: video.id,
    title: Util.escapeMarkdown(video.title),
    url: `https://www.youtube.com/watch?v=${video.id}`
  };
  console.log(song.url)
  if (!serverQueue) {
    const queueConstruct = {
      textChannel: message.channel,
      voiceChannel: voiceChannel,
      connection: null,
      songs: [],
      volume: 5,
      playing: true
    };
    queue.set(message.guild.id, queueConstruct);

    queueConstruct.songs.push(song);

    try {
      var connection = await voiceChannel.join();
      queueConstruct.connection = connection;
      play(message.guild, queueConstruct.songs[0]);
    } catch (error) {
      console.error(`Je ne peux pas rejoindre le salon vocal : ${error}`);
      queue.delete(message.guild.id);
      return message.channel.send(`Je ne peux pas rejoindre le salon vocal : **\`${error}\`**`);
    }
  } else {
    serverQueue.songs.push(song);
    if (playlist) return undefined;
    else return message.channel.send(`:white_check_mark:  **|** **\`${song.title}\`** a été ajouté à la playlist !`);
  }
  return undefined;
}


function play(guild, song) {
  const serverQueue = queue.get(guild.id);

  if (!song) {
    serverQueue.voiceChannel.leave();
    queue.delete(guild.id);
    return;
  }

  const dispatcher = serverQueue.connection.play(ytdl(song.url))
    .on("end", reason => {
      if (reason === "Stream is not generating quickly enough.") console.log("Musique terminée.");
      else console.log(reason);
      serverQueue.songs.shift();
      play(guild, serverQueue.songs[0]);
    })
    .on("error", error => console.error(error));
  dispatcher.setVolumeLogarithmic(serverQueue.volume / 5);

  serverQueue.textChannel.send(`????  **|**  En cours de lecture : **\`${song.title}\`**`);
};

person Nathn    schedule 04.06.2020    source sumber
comment
Saya menyarankan Anda untuk mencatat variabel serverQueue setelah mendeklarasikannya pada baris pertama perintah play, untuk melihat apakah antrian Anda kosong atau ada yang salah. Anda juga harus mencoba mencatat variabel lagu, untuk berjaga-jaga   -  person Tenclea    schedule 04.06.2020
comment
ya variabelnya sepertinya serverQueue kosong tapi saya tidak mengerti kenapa   -  person Nathn    schedule 04.06.2020
comment
Saya akan melakukan beberapa pengujian sendiri, saya akan kembali kepada Anda jika saya menemukan sesuatu   -  person Tenclea    schedule 04.06.2020
comment
Saya benar-benar minta maaf, tetapi saya tidak dapat membuat kode Anda berfungsi di komputer saya.. Saya kira saya mungkin kehilangan modul yang tepat... Mulai sekarang, saya menyarankan Anda untuk mencoba modul lain, seperti ytsr untuk menemukan lagu, ytpl untuk playlist, dan menggunakan ytdl untuk pengambilan informasi (id, judul, dll...) dan ini mungkin dapat membantu Anda memperbaiki masalah Anda. Anda juga dapat melakukan apa yang saya sebut sebagai logging besar-besaran, yang terdiri dari mencatat setiap langkah kode Anda untuk melihat dari mana kesalahan itu berasal. Saya harap Anda bisa mengetahuinya, dan jika ya, beri tahu saya :)   -  person Tenclea    schedule 04.06.2020


Jawaban (1)


Coba ganti "end" dengan "finish":

const dispatcher = serverQueue.connection.play(ytdl(song.url)).on("end", reason => {

to

const dispatcher = serverQueue.connection.play(ytdl(song.url)).on("finish", reason => {
person Jhemeson Ferreira    schedule 06.10.2020
comment
Wah berhasil, terima kasih! Saya tidak berpikir saya akan menemukan jawabannya 6 bulan kemudian! - person Nathn; 25.10.2020