我正在为音乐机器人使用 ytdl 核心,它不断输出未定义的播放



我正在使用ytdl-core和node-opus为我的机器人添加音乐功能。我也在遵循一个教程。在我开始添加排队功能之前,机器人工作正常。当我集成队列时,机器人仍然可以加入和离开语音频道,但无法播放音乐。它输出(node:22116) UnhandledPromiseRejectionWarning: ReferenceError: play is not defined

根据对视频的评论,我尝试play切换到playstream。这最初有效,但没有帮助,只是输出它没有定义。

这是命令:

      if (!message.member.voiceChannel) return message.channel.send("You must be connected to a voice channel.");
      if (!args[0]) return message.channel.send("You must supply a __valid__ URL.");
      let validate = await ytdl.validateURL(args[0]);
      if (!validate) return message.channel.send("You must supply a __valid__ URL.");
      let info = await ytdl.getInfo(args[0]);
      let data = active.get(message.guild.id) || {};
      if (!data.connection) data.connection = await message.member.voiceChannel.join();
      if (!data.queue) data.queue = [];
      data.guildID = message.guild.id; 
      data.queue.push ({
        songTitle: info.title,
        requester: message.author.tag,
        url: args[0],
        announceChannel: message.channel.id
      });
      if (!data.dispatcher) play();
      else {
        message.channel.send(`Added song to queue: ${info.title} || Requested by: ${message.author.id}`);
        active.set(message.guild.id, data);

我希望仍然能够按照教程完全集成队列。

您没有在以前的代码中定义 play() 函数,因此您也不能使用它。

下面是 play() 函数的外观示例

const queue = msg.client.queue;
const ytdl = require('ytdl-core');
async function play(guild, song) {
    const serverQueue = await queue.get(guild.id);
    if (!song) {
        await serverQueue.voiceChannel.leave();
        await queue.delete(guild.id);
        return;
    }
    const stream = await ytdl(song.url, {
        filter: 'audioonly'
    });
    const dispatcher = await serverQueue.connection.playStream(stream)
        .on('end', async reason => {
            if (reason === 'Stream is not generating quickly enough.');
            serverQueue.songs.shift('Stream is not generating quickly enough');
            await play(guild, serverQueue.songs[0]);
        })
        .on('error', error => console.error(error));
    dispatcher.setVolumeLogarithmic(serverQueue.volume / 5);
}

我的队列构造如下:

const queueConstruct = {
                    textChannel: msg.channel,
                    voiceChannel: voiceChannel,
                    connection: null,
                    songs: [],
                    volume: 2,
                    playing: true
                };

可能是您必须更改一些代码行,以便它适用于您的机器人!

最新更新