【问题标题】:Create private voice channels and delete this channel when members in this channel 0当该频道的成员为 0 时,创建私人语音频道并删除该频道
【发布时间】:2021-01-29 05:58:59
【问题描述】:

我写了一个代码,如果你去某个语音频道会创建一个新的私人语音频道,问题是语音频道中没有人之后,它应该被删除,我为此写了一个代码,但它不起作用。

这是代码本身:

@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'

如何解决这个问题?

【问题讨论】:

    标签: python discord bots discord.py discord.py-rewrite


    【解决方案1】:

    删除频道时,您必须使用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)
    

    【讨论】:

    • 是的,问题是当我进入频道时,一切正常,但是当我出来时,它给出了关于我写的窗口的一个,如果@,我无法回滚987654325@ 检查特定频道是否是初始频道以创建私人频道
    猜你喜欢
    • 1970-01-01
    • 2019-04-07
    • 2014-11-29
    • 1970-01-01
    • 2020-02-05
    • 2018-07-27
    • 2021-07-13
    • 2019-11-30
    • 2021-04-13
    相关资源
    最近更新 更多