Создание каналов привата и их удаление в дискорде
Я хочу сделать систему, когда пользователь заходит в канал создания привата, то создаются текстовый канал и голосовой, в текстовом создатель может давать и забирать права заходить в приват, а если хозяин выходит из привата, то через минуту каналы должны удаляться, а также данные о них из бд. Использую MongoDB.
Почти весь код я сделал, но код с удалением каналов не работает, а именно проверка на id канала. Также хочу сделать так, чтобы таймер на 30 отменялся, если создатель вернётся, мб есть какой-то более удобный способ для создания этого таймера.
@bot.event
async def on_voice_state_update(member, before, after):
if after.channel is not None:
if after.channel.id == 992120556256247808:
guild = bot.get_guild(642681537284014080)
category = discord.utils.get(guild.categories, name='Приват')
v_channel = await guild.create_voice_channel(name=f'Приват ({member.display_name})', category=category)
t_channel = await guild.create_text_channel(name=f'Выдача прав ({member.display_name})', category=category)
await v_channel.set_permissions(member, connect=True, speak=True, view_channel=True, stream=True, kick_members=True, mute_members=True, priority_speaker=True)
role = discord.utils.get(guild.roles, id=642681537284014080)
await v_channel.set_permissions(role, view_channel=False)
await t_channel.set_permissions(role, view_channel=False)
private_post = {
'_id': member.id,
'text_id':t_channel.id,
'voice_id':v_channel.id,
}
private.insert_one(private_post)
await member.move_to(v_channel)
if before.channel.id == private.find_one({'_id': member.id})['voice_id']: #Вот здесь ошибка
await bot.get_channel(private.find_one({'_id': member.id})['text_id']).send(f'`[PRIVATE]`: {member.mention} через 30 секунд ваш приват будет удален.')
time.sleep(30000)
await t_channel.delete()
await v_channel.delete()
@bot.command()
async def perm(ctx, member: discord.Member):
if ctx.channel.id == private.find_one({'text_id': ctx.channel.id})['text_id']:
v_channel = bot.get_channel(private.find_one({'text_id': ctx.channel.id})['voice_id'])
await v_channel.set_permissions(member, connect=True, speak=True, view_channel=True, stream=True)
@bot.command()
async def unperm(ctx, member: discord.Member):
if ctx.channel.id == private.find_one({'text_id': ctx.channel.id})['text_id']:
v_channel = bot.get_channel(private.find_one({'text_id': ctx.channel.id})['voice_id'])
await v_channel.set_permissions(member, connect=False, speak=False, view_channel=False, stream=False)
Код ошибки:
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:\bot\main.py", line 311, in on_voice_state_update
if before.channel.id == private.find_one({'_id': member.id})['voice_id']:
AttributeError: 'NoneType' object has no attribute 'id'