Удаление канала при отсутствии участников в нем
Хочу сделать приватные каналы(заезжено), когда создатель заходит в спец.канал для него создается войс и текстовый каналы, хочу сделать так, чтобы при выходе создателя из его же привата, через 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 секунд и если на тот момент нет пользователей, то удаляете приват, а если есть, то нет.