python - 不和谐.py | 语音通道出错
问题描述
这段代码的目的是当参与者加入某个语音频道时,创建他的个人语音频道。并且当语音通道为空时,它会被自动删除。该代码完美地执行其任务,但我在控制台中收到错误。我该如何解决这个问题?
代码:
@Bot.event
async def on_voice_state_update(member,before,after):
if after.channel.id == 826351221145206855:
for guild in Bot.guilds:
maincategory = discord.utils.get(guild.categories, id=816323445213626368)
channel2 = await guild.create_voice_channel(name=f'HALL {member.display_name}',category = maincategory)
await channel2.set_permissions(member,connect=True,mute_members=True,move_members=True,manage_channels=True)
await member.move_to(channel2)
def check(x, y, z):
return len(channel2.members) == 0
await Bot.wait_for('voice_state_update', check=check)
await channel2.delete()
控制台中的错误:
Ignoring exception in on_voice_state_update
Traceback (most recent call last):
File "C:\Users\Маки\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\client.py", line 343, in _run_event
await coro(*args, **kwargs)
File "d:\import discord.py", line 242, in on_voice_state_update
if after.channel.id == 826351221145206855:
AttributeError: 'NoneType' object has no attribute 'id'
解决方案
如果成员离开语音频道,voice_state_update
则会触发一个事件,并且after.channel
将是None
,因为用户不再处于任何语音频道中。因此,您的第一个if
-statement 评估为
if None.id == 826351221145206855:
并产生您看到的错误。一个干净的解决方法是将行修改为
if after.channel and after.channel.id == 826351221145206855:
这样,您的机器人将首先检查用户是否在语音频道中,如果是这种情况,则仅尝试查看 id。这利用了 Python 机制,该机制if None
评估为False
whileif "actual channel"
评估为True
,并且不会干扰您的其余代码,因为当用户离开任何语音通道时不需要新的操作
推荐阅读
- python - 机器人测试接收的 unicode 与从 python 关键字发送的不同
- java - 为什么在前序遍历(二叉搜索树)上使用递归?
- android - 带有标题和边框的布局,类似于 Delphi 或 VB.NET GroupBox
- c# - 如何使用正则表达式查找不同的电话数字模式
- perl - 使用 perl 脚本比较日期(以字符串格式)的正确方法
- javascript - 有效地点击一个选项 javascript
- java - 如何确保我的 Java 程序不使用 Oracle JVM?
- ios - 通过 Firebase 获取 iOS 应用的下载次数
- apache-flex - 继承的 Flex 应用程序
- docker - Openshift:创建持久卷后应用程序目录为空