运行相同命令时音频机器人离开频道

Posted

技术标签:

【中文标题】运行相同命令时音频机器人离开频道【英文标题】:Audio bot leaves channel when same command ran 【发布时间】:2019-01-03 18:06:02 【问题描述】:

我最近一直在制作我的第一个不和谐机器人,我终于可以使用下面的代码通过机器人播放音频。但是,如果与机器人在同一频道中的人再次使用相同的命令,机器人将停止播放其音频并离开频道。 此外,我将如何使机器人在完成播放音频之前无法切换频道。 (注意:机器人从包含 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(); 
            );
        );          
    
);

非常感谢任何帮助。

【问题讨论】:

你真的应该正确地格式化你的代码。这很难阅读,一旦格式正确,您可能会发现自己的错误。 格式化,感谢 jtate。 检查客户是否已经加入channel 认为 发生了什么......我无法验证它...是机器人正在重新加入频道(所以这里什么都没有发生)然后“重新创建”调度程序并覆盖旧调度程序...触发dispatcher.on("end") 我在 Reddit 上看了看,他们说使用 guild.voiceConnection 来检测机器人是否已经在频道中,这将用作决定机器人是否会运行命令与否;我唯一想不通的是在哪里或如何将它放入现有代码中 【参考方案1】:

不知道API中是否有获取bot当前频道的方法。但是,执行此操作的一种方法是将机器人所在的频道存储在变量中。

这只是在加入频道时设置botChannel 变量,并在离开频道时取消设置。所以在加入会员频道之前,可以先检查一下频道是否设置好了。

我将代码拆分以便更容易可视化(至少对我来说是这样)

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);
             
    
);

【讨论】:

谢谢,该代码解决了这个问题。然而有一件事,使用代码的多个实例/副本(例如,能够播放许多不同的音频文件)会导致新副本在已经声明变量的地方有很多解析错误,但是删除这些行会使代码中断通过说这些变量尚未定义。有没有什么办法解决这一问题?非常感谢。 @LgCas 你能解释一下你想做什么吗? 感谢您的快速回复,我正在尝试为私人服务器制作一个机器人,该机器人能够使用不同的命令播放来自互联网的一些不同的音频剪辑(例如!play 1 会播放第一个剪辑,!play 2 将播放另一个,依此类推,大概这些命令必须一个接一个地使用,以避免它们相互抵消,或者使用排队系统或命令让它离开)。 为此,您需要将音频 url 设置为 joinChannel 函数的参数。然后,您可以复制您的 if 语句并在那里传递 url。现在这不是很干净,干净地写这个超出了这个线程的范围。 很抱歉造成的任何混乱,我发帖时很着急,首先是一个错误;而且我没有仔细考虑,因为原始代码允许播放多个剪辑,但命令相互抵消,这是我制作的第一个机器人,并没有意识到代码会如何受到某些更改的影响。这些参数是否会通过对我添加到机器人的每个 URL/存储的视频剪辑使用不同版本的 playAudio 行来制作(不像 YouTube 机器人那样搜索,而是手动添加到代码中以仅允许播放预添加的音频)

以上是关于运行相同命令时音频机器人离开频道的主要内容,如果未能解决你的问题,请参考以下文章

Bot 在离开前未完成播放音频

Discord 机器人不离开语音频道

如何修复 Discord.py 不为语音命令运行我的异步功能?

当有人加入或离开其语音频道时,让机器人向文本频道发送消息

离开语音频道

歌曲结束时,Discord 音乐机器人不会离开服务器