如何使不和谐的机器人在闲置x分钟后离开语音通道?

时间:2020-08-30 14:41:02

标签: python python-3.x discord.py discord.py-rewrite

我正在尝试与discord.py建立音乐机器人。但是,我希望漫游器在一段时间(例如5分钟)内保持不活动状态。不活动是指该机器人没有播放任何歌曲。

开始播放歌曲的命令是

voice.play(discord.FFmpegPCMAudio(audio))

voice.stop()停止播放歌曲

voice objectdiscord.VoiceClient

3 个答案:

答案 0 :(得分:1)

嘿,我知道这个帖子已经快一年了,但我想我得到了一个代码,值得为仍然有这个问题的任何人发布。

@commands.Cog.listener()
async def on_voice_state_update(self, member, before, after):
    
    if not member.id == self.bot.user.id:
        return

    elif before.channel is None:
        voice = after.channel.guild.voice_client
        time = 0
        while True:
            await asyncio.sleep(1)
            time = time + 1
            if voice.is_playing() and not voice.is_paused():
                time = 0
            if time == 600:
                await voice.disconnect()
            if not voice.is_connected():
                break

首先,我发现将它放在 on_voice_state_update 事件中更好,因为将它放在 play 命令的 after 语句中会导致它在每次歌曲结束时运行该循环。

(如果您了解此代码的工作原理,则无需阅读其余部分,我只是要解释一下。)

好的,首先我们检查我们的机器人是否是触发事件的机器人:

if not member.id == self.bot.user.id:
    return

之后我们检查它是否是一个加入事件:

elif before.channel is None:

如果 before 通道为 none,则表示机器人不在语音通道中,然后它加入了我们正在寻找的通道。

然后如果它首先进入 elif 语句,它会声明变量 voice。我发现获得它的最快方法是使用像 voice = after.channel.guild.voice_client 这样的 after 语句,它可以让您访问公会语音客户端!

然后我们进入代码的主要部分!这是机器人将运行以检查机器人是否正在播放的循环:

    time = 0
    while True:
        await asyncio.sleep(1)
        time = time + 1
        if player.is_playing or player.is_paused:
            time = 0
        if time == 600:
            await voice.disconnect()
        if not player.is_connected:
            break

因此,我们创建了一个名为 time 的变量,它会在检测到机器人未播放时每秒加 1,并确认机器人实际上并未暂停……然后,如果机器人再次开始播放,它将返回零。但是如果它达到 600,也就是 10 分钟,它会断开机器人与通道的连接,然后它会中断循环。

哦,不要担心 @commands.Cog.listener() 这只是因为我在齿轮中使用它。如果不是,则应将其更改为 @client.event 并从函数语句中删除 self。

抱歉,我完全进入了教程模式,我只是想向人们解释我的代码,哈哈。

答案 1 :(得分:0)

您可以使用is_playing()方法检测是否未播放音频。因此,如果要这样做,我将使用asyncio模块执行类似的操作。

while True:
    await asyncio.sleep(5)

    if voice.is_playing() == False:
        await voice.disconnect()
        break

答案 2 :(得分:0)

我认为这应该有效。如果可以共享代码,我可以检查一下,但是可以尝试一下。就像@StarbuckBarista所说的那样,我们需要更多地了解您的代码。

while voice.is_playing(): #Checks if voice is playing
    await asyncio.sleep(1) #While it's playing it sleeps for 1 second
else:
    await asyncio.sleep(15) #If it's not playing it waits 15 seconds
    while voice.is_playing(): #and checks once again if the bot is not playing
        break #if it's playing it breaks
    else:
        await voice.disconnect() #if not it disconnects