Создания приватных голосовых каналов

Написал код который если зайти в определённый голосовой канал создаст новый приватный голосовой канал, проблема в том что после того как в голосовом канале никого не будет он должен удалится я написал код для этого, но он не работает.

Вот сам код:

@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 Первый before: {before}\n')
        print(f'\n Первый after: {after}\n')
        print(f'\n Второй before: {before.channel.id}\n')
        print(f'\n Второй 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'Приватный({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

После того как я вышел с канала выдает ошибку:

if after.channel.id == voice_channel:

AttributeError: 'NoneType' object has no attribute 'id'

Только что сделал проверку вот что получил:

Когда зашел в канал:

Первый before: <VoiceState self_mute=False self_deaf=False self_stream=False channel=None>
Первый 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 Второй before: {before.channel.id}\n')
AttributeError: 'NoneType' object has no attribute 'id'

Когда вышел:

Первый  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>>
Первый after: <VoiceState self_mute=False self_deaf=False self_stream=False channel=None>
Второй 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 Второй after: {after.channel.id}\n')
AttributeError: 'NoneType' object has no attribute 'id'

Как это можно исправить?


Ответы (2 шт):

Автор решения: xZartsust

Вот ссылка на полностью рабочий код для создания приватных голосовых каналов: GitHub

→ Ссылка
Автор решения: LeonidM

Ошибка возникает в связи с тем, что ты пытаешься вывести параметры before.channel и after.channel, которые могут быть None (например, ты полностью отключился и before.channel теперь None). Просто убери print() и всё будет работать, либо делай проверку на None перед print().

→ Ссылка