python - 当该频道的成员为 0 时,创建私人语音频道并删除该频道
问题描述
我写了一个代码,如果你去某个语音通道会创建一个新的私人语音通道,问题是语音通道中没有人之后,它应该被删除,我为此写了一个代码,但是它确实不行。
这是代码本身:
@commands.Cog.listener()
async def on_voice_state_update(self, member, before, after):
cursor.execute(f'SELECT start_voice_channel FROM public."myBD" WHERE guild_id = \'{member.guild.id}\';')
v_c = cursor.fetchone()
voice_channel = v_c[0]
cursor.execute(f'SELECT categori FROM public."myBD" WHERE guild_id = \'{member.guild.id}\';')
c_c = cursor.fetchone()
channel_category = c_c[0]
if voice_channel is not None and channel_category is not None:
print(f'\n First before: {before}\n')
print(f'\n First after: {after}\n')
print(f'\n Second before: {before.channel.id}\n')
print(f'\n Second after: {after.channel.id}\n')
if after.channel.id == voice_channel:
maincategori = get(member.guild.categories, id = channel_category)
channel2 = await member.guild.create_voice_channel(name = f'Privat({member.display_name})', category = maincategori)
await channel2.set_permissions(member, connect = True, mute_members = True, move_members = True, manage_channels = True)
await member.move_to(channel2)
def check(self, x):
return len(channel2.members) == 0
await self.bot.wait_for('voice_channel_update', check = check)
await channel2.delete()
else:
pass
在我离开频道后,它给出了一个错误:
如果 after.channel.id == voice_channel:
AttributeError:“NoneType”对象没有属性“id”
刚刚做了一个检查,这是我得到的:
当我进入频道时:
First before: <VoiceState self_mute=False self_deaf=False self_stream=False channel=None>
Second after: <VoiceState self_mute=False self_deaf=False self_stream=False channel=<VoiceChannel id=751363819837718599 name='Voice Channel 1' position=0 bitrate=64000 user_limit=0 category_id=754670529268678669>>
Ignoring exception in on_voice_state_update
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.9/site-packages/discord/client.py", line 312, in _run_event
await coro(*args, **kwargs)
File "/app/cogs/commands/moderation/command/private_channel.py", line 43, in on_voice_state_update
print(f'\n Second before: {before.channel.id}\n')
AttributeError: 'NoneType' object has no attribute 'id'
出来的时候:
First before: <VoiceState self_mute=False self_deaf=False self_stream=False channel=<VoiceChannel id=751363819837718599 name='Voice Channel 1' position=0 bitrate=64000 user_limit=0 category_id=754670529268678669>>
First after: <VoiceState self_mute=False self_deaf=False self_stream=False channel=None>
Second before: 751363819837718599
Ignoring exception in on_voice_state_update
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.9/site-packages/discord/client.py", line 312, in _run_event
await coro(*args, **kwargs)
File "/app/cogs/commands/moderation/command/private_channel.py", line 44, in on_voice_state_update
print(f'\n Second after: {after.channel.id}\n')
AttributeError: 'NoneType' object has no attribute 'id'
如何解决这个问题?
解决方案
删除频道时,您必须使用before.channel
而不是after.channel
使用它,因为after.channel
它会给您 NoneType 错误,就好像您删除一个频道后不能有后续一样。
channel = discord.utils.get(guild.voice_channels, name=str(before.channel))
if channel is None:
return
else:
if len(channel.members) == 0:
await channel.delete(reason=None)
推荐阅读
- java - 可以在调用时将 DateTime 类型的变量解析(到方法中,而不是从扫描仪中)到方法中吗?
- google-bigquery - 如何从字符串中获取前两个单词?
- node.js - 如何快速删除 node_modules 文件夹?
- ruby - 创建对象的多个实例时,将它们视为内存中的同一个对象
- npm - 尝试创建 React App 时出现 Enoent 错误
- javascript - ExpressJS 和 PDFKit - 在内存中生成 PDF 并发送到客户端以供下载
- r - 最小化模糊匹配和 for 循环中的计算次数
- python - __getattr__ 什么时候被触发?
- php - 在 Laravel 中合并集合的值
- java - 为什么通过在 JPA 中加入两个不相关的实体来使用投影获取数据时没有设置投影字段?