使用Discord.py创建漫游器时,如何使观众离开时我的音乐漫游器离开?

时间:2020-05-15 19:55:12

标签: python discord discord.py

今天,我开始与discord.py创建自己的音乐机器人,以解决不一致的问题。 我正在使用命令扩展来简化结构。

到目前为止,我已经创建了用于加入和退出语音通道的命令(已删除安全检查):

@bot.command()
async def join(ctx):
  v_channel = ctx.message.author.voice.channel
  await v_channel.connect()

@bot.command()
async def leave(ctx):
  player = ctx.message.guild.voice_client
  await player.disconnect()

现在,我想实现一项功能,以便如果“观众”(非机器人成员)离开了语音通道,该机器人也将离开。如果“召集”该漫游器的用户离开但其他成员仍在语音通道中,则漫游器不得离开。

我考虑过使用这样的东西:

@bot.event
async def on_voice_state_update():
    If len(ctx.channel.members) == 1 and ctx.channel.members[0].bot:
       ctx.channel.disconnect()

但是我不确定如何将所有内容放在一起以及如何获取频道上下文。我宁愿检查音乐bot语音客户端的确切位置,因为服务器上有多个bot。 on_voice_state_update()似乎是全局的,您获得的唯一上下文是用户X将其中一个通道留在了服务器上。

您有个好主意吗?

1 个答案:

答案 0 :(得分:0)

我会这样做:

@bot.event
async def on_voice_state_update(member, prev, cur):
    if bot.user in prev.channel.members and len([m for m in prev.channel.members if not m.bot]) == 0:
        channel = discord.utils.get(bot.voice_clients, channel=prev.channel)
        await channel.disconnect()

参考: