【问题标题】:How to disconnect a discord bot from voice channel after user left?用户离开后如何断开不和谐机器人与语音通道的连接?
【发布时间】:2021-04-13 07:04:36
【问题描述】:

我想添加一个事件,如果用户在歌曲仍在播放时离开,我的音乐机器人会立即离开语音频道。如果频道中有多个用户,机器人当然应该留在频道中。我在那里只有一种方法,但需要帮助。我会尝试以下方法:

async def check_member(self, ctx):
    channel = ctx.author.voice.channel
    member_count = len(voice_channel.members)
    if member_count == 1:
        await channel.disconnect

但这似乎不起作用。 我知道事实上有一个 similar post 但这对我也不起作用,因为我定义了一些不同的东西。

我的第二次尝试是:

    async def check_member(self, ctx):
        channel = ctx.author.voice.channel
        member_count = len(channel.members)
        client = ctx.guild.voice_client
        if member_count == 1:
            await client.disconnect()

(也没有用。)

定义does not work:我现在以不同的方式构建函数:

    @tasks.loop(seconds=2)
    async def check(self, ctx):
        voice_channel = ctx.author.voice.channel
        member_count = len(voice_channel.members)
        client = ctx.guild.voice_client
        if member_count == 1:
            await client.disconnect()

现在这是一个完全不同的计数。我想要做的是每 2 秒循环一次 commands.Cog.listener() 函数。对于测试,我播放了一首歌曲,并在机器人开始播放后立即离开。我以为机器人也会离开频道,但事实并非如此。我的日志中没有输出表明我定义了错误。

【问题讨论】:

  • 描述“不起作用”?错误?奇怪的行为?另外,您能否添加更多相关代码,例如您如何使用此功能?
  • @stijndcl 编辑了帖子。总结一下:没有错误,但机器人也没有离开频道。
  • ctx参数怎么填?这是一项任务,没有像命令那样的调用上下文,默认情况下 Discord 不会填写它(因为它不存在)。此外,您没有收到任何错误,因为您使用的是默认情况下不显示错误的任务。任务需要自定义错误处理程序。
  • 他可能在Task.start(*args) 中传递了ctx 参数。此外,您的代码根本没有任何意义。

标签: asynchronous discord discord.py youtube-dl


【解决方案1】:

循环有点低效,你可以简单地使用on_voice_state_update事件

async def on_voice_state_update(member, before, after):
    voice_state = member.guild.voice_client
    # Checking if the bot is connected to a channel and if there is only 1 member connected to it (the bot itself)
    if voice_state is not None and len(voice_state.channel.members) == 1:
        # You should also check if the song is still playing
        await voice_state.disconnect()

参考:

【讨论】:

  • 所以我还添加了一个方法来检查机器人是否正在播放任何音频并实现了它。但是,机器人仍然没有断开连接。我们在这里需要before, after 做什么? `
  • 对不起,您应该比较 1 个成员(机器人本身)而不是 0。前后是更改前后的语音状态
  • 我需要为此导入意图吗?我没有看到任何错误,但即使在导入所需的意图之后,机器人也会再次罢工。我有以下checks。我是否可能需要对on_voice_state_update 本身进行检查或将函数放入Music 类中?我不知道这是否会影响。
  • 您需要启用 intents.membersintents.guildsintents.voice_states - 默认意图 + intents.members 也可以使用
  • 是的,我读过一篇关于此的文章。在导入intents 并正确启动它之后,机器人看起来并不喜欢我,因为我离开频道后他没有断开连接。我为您设置了一个video,您可能会看到它为什么不起作用,如果您也找不到错误,请告诉我。 (也许是因为我对 oder 方法的使用不同?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 2020-12-18
  • 2021-07-01
相关资源
最近更新 更多