0

我有一个应该播放音乐的代码。但是当我实际输入命令时,机器人会加入 VC,但不会播放任何内容,并且会弹出错误代码。"(node:7888) UnhandledPromiseRejectionWarning: TypeError: Cannot set property 'songs' of undefined at stop" 我已经通过键入 "npm install discord.js ffmpeg fluent-ffmpeg @discordjs/opus ytdl-core --save" 安装了所有必要的东西进入命令行。有谁知道是什么导致错误?

const Discord = require('discord.js');
const ytdl = require('ytdl-core');
const client = new Discord.Client();
const queue = new Map();

client.on("message", async message => {
 if (message.author.bot) return;
 if (!message.content.startsWith('!')) return;

 const serverQueue = queue.get(message.guild.id);

 if (message.content.startsWith(`!play`)) {
   execute(message, serverQueue);
   return;
 } else if (message.content.startsWith(`!skip`)) {
   skip(message, serverQueue);
   return;
 } else if (message.content.startsWith(`!stop`)) {
   stop(message, serverQueue);
   return;
 }
});

async function execute(message, serverQueue) {
 const args = message.content.split(" ");

 const voiceChannel = message.member.voice.channel;
 if (!voiceChannel)
   return message.channel.send(
     "You need to be in a voice channel to play music!"
   );
 const permissions = voiceChannel.permissionsFor(message.client.user);
 if (!permissions.has("CONNECT") || !permissions.has("SPEAK")) {
   return message.channel.send(
     "I need the permissions to join and speak in your voice channel!"
   );
 }

 const songInfo = await ytdl.getInfo(args[1]);
 const song = {
   title: songInfo.title,
   url: songInfo.video_url
 };

 if (!serverQueue) {
   const queueContruct = {
     textChannel: message.channel,
     voiceChannel: voiceChannel,
     connection: null,
     songs: [],
     volume: 5,
     playing: true
   };

   queue.set(message.guild.id, queueContruct);

   queueContruct.songs.push(song);

   try {
     var connection = await voiceChannel.join();
     queueContruct.connection = connection;
     play(message.guild, queueContruct.songs[0]);
   } catch (err) {
     console.log(err);
     queue.delete(message.guild.id);
     return message.channel.send(err);
   }
 } else {
   serverQueue.songs.push(song);
   return message.channel.send(`${song.title} has been added to the queue!`);
 }
}

function skip(message, serverQueue) {
 if (!message.member.voice.channel)
   return message.channel.send(
     "You have to be in a voice channel to stop the music!"
   );
 if (!serverQueue)
   return message.channel.send("There is no song that I could skip!");
 serverQueue.connection.dispatcher.end();
}

function stop(message, serverQueue) {
 if (!message.member.voice.channel)
   return message.channel.send(
     "You have to be in a voice channel to stop the music!"
   );
 serverQueue.songs = [];
 serverQueue.connection.dispatcher.end();
}

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("finish", () => {
     serverQueue.songs.shift();
     play(guild, serverQueue.songs[0]);
   })
   .on("error", error => console.error(error));
 dispatcher.setVolumeLogarithmic(serverQueue.volume / 5);
 serverQueue.textChannel.send(`Start playing: **${song.title}**`);
}
4

0 回答 0