所以我制作了一个不和谐的机器人,只要它在通话中发现自己一个人,它就会断开与语音通道的连接。我就是这样做的:(注意,我使用的是齿轮)
@commands.Cog.listener("on_voice_state_update")
async def voiceStateUpdate(self, member, before, after):
voiceClient = discord.utils.get(self.bot.voice_clients, guild = member.guild) # Bot "voice_client"
if voiceClient.channel != None:
if len(voiceClient.channel.members) == 1:
await voiceClient.disconnect() # Disconnect
这很好用。但是,如果我在重新启动我的代码时忘记离开电话,我会在我的机器人重新启动时留在频道中(如预期的那样)。当我断开与呼叫的连接时,问题就出现了。机器人留在里面,只输出这个错误:(line 37, if voiceClient.channel != None:) AttributeError: 'NoneType' object has no attribute 'channel'
也许这是因为它不知道它仍在频道中? 我很困惑...谢谢你的时间。 :-)
答案 0 :(得分:1)
您可以更轻松地查询语音频道。此外,您需要以不同的方式请求事件,即使您的 ("on_voice_state_update")
是正确的。
如果机器人重新启动,它会立即或在几秒/分钟后离开所有语音通道,因此您无需担心。
看看以下事件:
@commands.Cog.listener()
async def on_voice_state_update(self, member, before, after):
voice_state = member.guild.voice_client # Get the member in the channel
if voice_state is not None and len(voice_state.channel.members) == 1: # If bot is alone
await voice_state.disconnect() # Disconnect
请注意,您必须启用 members
Intent 才能获得 len
的 channel.members
。您可以在 Discord Developer Portal 中执行此操作,并且需要将意图“导入”到您的代码中。