Javascript 运行同一命令时,音频机器人离开频道

Javascript 运行同一命令时,音频机器人离开频道,javascript,node.js,bots,discord,discord.js,Javascript,Node.js,Bots,Discord,Discord.js,我最近制作了我的第一个discord机器人,我终于用下面的代码获得了通过机器人播放的音频。但是,如果与bot处于同一频道的人再次使用同一命令,bot将停止播放其音频并离开该频道。 此外,我将如何使它,使机器人无法切换频道之前,它已经完成播放其音频。 (注意:bot从包含mp3文件的URL播放音频,而不是使用YouTube插件,因为我只希望它为一些私人服务器播放特定内容) 代码如下: client.on('message', (message) => { if (message.co

我最近制作了我的第一个discord机器人,我终于用下面的代码获得了通过机器人播放的音频。但是,如果与bot处于同一频道的人再次使用同一命令,bot将停止播放其音频并离开该频道。 此外,我将如何使它,使机器人无法切换频道之前,它已经完成播放其音频。 (注意:bot从包含mp3文件的URL播放音频,而不是使用YouTube插件,因为我只希望它为一些私人服务器播放特定内容) 代码如下:

client.on('message', (message) => {
    if (message.content == '!play EXAMPLE') {
        var channel = message.member.voiceChannel;

        if (!channel) 
            message.channel.sendMessage ('You need to be in a voice channel to use this command.');

        if (!channel)
             return console.error("The channel does not exist!"); 

        channel.join().then(connection => {
            const dispatcher = connection.playArbitraryInput("URL TO AUDIO FILE");
            dispatcher.on("end", end => { 
                channel.leave(); 
            });
        });          
    }
});

非常感谢您的帮助。

我不知道API中是否有获取机器人当前通道的方法。但是,一种方法是将bot所在的通道存储在变量中

这只需在加入频道时设置一个
botChannel
变量,在离开频道时将其取消设置。因此,在加入成员频道之前,您可以检查频道是否已设置

我拆分代码以使其更易于可视化(至少对我来说是这样)


你应该正确地格式化你的代码。这很难阅读,一旦正确格式化,您可能会发现自己的错误。由于jtate,格式化。检查客户端是否已加入
频道
我认为正在发生的事情。。。我无法证实。。。机器人正在重新加入通道(所以这里什么也没有发生),然后“重新创建”调度程序并覆盖旧的调度程序。。。启动dispatcher.on(“end”)我在Reddit上查看了一下,他们说使用guild.voiceConnection来检测机器人是否已经在某个频道中,这将作为机器人是否运行命令的决定因素;我唯一不知道的是在哪里或者如何将它放入现有的代码中。谢谢,这段代码解决了这个问题。然而,有一点是,使用代码的多个实例/副本(例如,能够播放许多不同的音频文件)会导致新副本在变量已经声明的情况下出现大量解析错误,但是删除这些行会导致代码中断,因为这些变量尚未定义。有办法解决这个问题吗?非常感谢。@LgCas您能向我解释一下您想做什么吗?谢谢您的快速回复,我正在尝试为一个私人服务器制作一个机器人,该服务器能够使用不同的命令从internet播放一些不同的音频剪辑(例如!播放1将播放第一个剪辑,!播放2将播放另一个剪辑,依此类推,可能必须一个接一个地使用这些命令,以避免它们相互抵消,或使用排队系统或命令使其离开)。要实现这一点,您需要将音频url设置为
joinChannel
函数的参数。然后,您可以复制if语句并将url传递到那里。现在这不是非常干净,干净地编写此内容超出了此线程的范围。对于由此引起的任何混乱,我感到抱歉,我在匆忙中编写了错误的线程首先,我没有考虑清楚,因为最初的代码允许播放多个剪辑,但命令相互抵消,这是我制作的第一个机器人,没有意识到代码会受到某些更改的影响。这些参数会通过使用不同版本的playAudio行r我添加到bot的每个URL/存储的视频剪辑(不像YouTube bot那样搜索,而是手动添加到代码中,只允许播放预先添加的音频)
let botChannel = undefined;

const joinChannel = (channel) => {
    channel.join().then(connection => {
        botChannel = channel;
        playAudio(connection, 'AUDIO URL');
    });
}

const leaveChannel = () => {
    botChannel.leave();
    botChannel = undefined;
};

const playAudio = (connection, audioUrl) => {
    const dispatcher = connection.playArbitraryInput(audioUrl);
    dispatcher.on("end", end => {
        leaveChannel();
    });
};

client.on('message', (message) => {
    if (message.content == '!play EXAMPLE') {
        var channel = message.member.voiceChannel;

        if (!channel) {
            message.channel.sendMessage('You need to be in a voice channel to use this command.');
            return console.error("The channel does not exist!"); 
        }

        if (!botChannel) {
            joinChannel(channel);
        }     
    }
});