今天,我开始与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将其中一个通道留在了服务器上。
您有个好主意吗?
答案 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()
参考: