Удаление канала при отсутствии участников в нем

Хочу сделать приватные каналы(заезжено), когда создатель заходит в спец.канал для него создается войс и текстовый каналы, хочу сделать так, чтобы при выходе создателя из его же привата, через 2 минуты каналы удалялись, через sleep() не вариант, т.к. если хозяин вернется в канал, то он все равно удалится Юзаю MongoDB

@bot.event
async def on_voice_state_update(member, before, after):

if after.channel is not None:
    if after.channel.id == 1200091472138084402: #id создания привата
        guild = bot.get_guild(1105205137837916170) #id сервера
        category = discord.utils.get(guild.categories, name='Private')
        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)

        embed = discord.Embed(
            title='',
            description='Вы успешно создали свой приватный канал!\nЧтобы дать возможность заходить к вам используйте команду `+perm <user>`\nЧтобы забрать права используйте команду `+unperm <user>`',
            color=0x000000
        )
        await t_channel.send(embed=embed)

        await v_channel.set_permissions(member, view_channel=True, connect=True, speak=True, stream=True, kick_members=True, mute_members=True, priority_speaker=True)
        await t_channel.set_permissions(member, view_channel=True)
        role = discord.utils.get(guild.roles, id=1105205137837916170)
        await v_channel.set_permissions(role, view_channel=False)
        await t_channel.set_permissions(role, view_channel=False)

        await member.move_to(v_channel)

        if private.count_documents({'_id':member.id}) == 1:
            private.delete_one({'_id':member.id})
        
        private_post = {
            '_id': member.id,
            'text_id':t_channel.id,
            'voice_id':v_channel.id,
        }
        private.insert_one(private_post)

if before.channel is not None:
    channels = private.find_one({'_id':member.id})
    t_channel = bot.get_channel(channels['text_id'])
    v_channel = bot.get_channel(channels['voice_id'])
    # if len(v_channel.members) == 0:
    #     await t_channel.send(f'`[PRIVATE]`: {member.mention}, Ваш приват будет удалён через 1 минуту!')
    #     await asyncio.sleep(60)
    #     await t_channel.delete()
    #     await v_channel.delete()
    #     private.delete_one({'_id': member.id}) попытки что-то придумать, но безрезультатно

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

Автор решения: Black Square

Попробуйте так:

import asyncio


@bot.event
async def on_voice_state_update(member, before, after):
    if after.channel:
        if after.channel.id == 1200091472138084402:  # id создания привата
            guild = bot.get_guild(1105205137837916170)  # id сервера
            category = discord.utils.get(guild.categories, name='Private')
            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)

            embed = discord.Embed(
                title='',
                description='Вы успешно создали свой приватный канал!\nЧтобы дать возможность заходить к вам используйте команду `+perm <user>`\nЧтобы забрать права используйте команду `+unperm <user>`',
                color=0x000000
            )
            await t_channel.send(embed=embed)

            await v_channel.set_permissions(member, view_channel=True, connect=True, speak=True, stream=True, kick_members=True, mute_members=True, priority_speaker=True)
            await t_channel.set_permissions(member, view_channel=True)
            role = discord.utils.get(guild.roles, id=1105205137837916170)
            await v_channel.set_permissions(role, view_channel=False)
            await t_channel.set_permissions(role, view_channel=False)

            await member.move_to(v_channel)

            if private.count_documents({'_id': member.id}) == 1:
                private.delete_one({'_id': member.id})

            private_post = {
                '_id': member.id,
                'text_id': t_channel.id,
                'voice_id': v_channel.id,
            }
            private.insert_one(private_post)

    if before.channel:
        channels = private.find_one({'_id': member.id})
        t_channel = bot.get_channel(channels['text_id'])
        v_channel = bot.get_channel(channels['voice_id'])

        if len(v_channel.members) == 0:
            asyncio.create_task(suicide(member, t_channel, v_channel))


async def suicide(member, t_channel, v_channel):
    timer = 60
    delay = 1

    for i in range(timer//delay):
        await t_channel.send(f'`[PRIVATE]`: {member.mention}, Ваш приват будет удалён через {timer-i+1} секунд!')

        if len(v_channel.members) != 0:
            return await t_channel.send(f'`[PRIVATE]`: {member.mention}, Удаление привата бьло остановлено')

        await asyncio.sleep(delay)

    await t_channel.delete()
    await v_channel.delete()

Создаете асинхронный таск который ждет n секунд и если на тот момент нет пользователей, то удаляете приват, а если есть, то нет.

→ Ссылка