Создание таймера с помощью discord.ext.tasks
Я хочу сделать систему создания приватных каналов. Когда пользователь заходит в спец. канал, то создаётся приватный голосовой канал и текстовый, где создатель может давать разрешение на подключение. А после выхода хозяина из голосового привата запускается таймер в минуту, если в течении минуты хозяин не зайдёт, то каналы удалятся.
Я почти сделал нужный код, но если создатель вернётся в канал, то он всё равно удалится, мне сказали сделать с помощью discord.ext.tasks, но я не умею этим пользоваться.
@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)
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, 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)
await member.move_to(v_channel)
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 and after.channel is 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 before.channel.id != v_channel.id:
return
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})
@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)
await ctx.send(f'`[PRIVATE]`: {ctx.author.mention}, вы выдали права пользователю {member.mention}')
@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)
if member in v_channel.members:
await member.move_to(None)
await ctx.send(f'`[PRIVATE]`: {ctx.author.mention}, вы забрали права у пользователя {member.mention}')