Автоматическое снятие роли mute(discord.py)
Существует банальный код для выдачи Mute:
async def mute(ctx, member: discord.Member, time: int, *, reason = "Без причины"):
timeID = time * 60
guild = ctx.guild
role = discord.utils.get(ctx.message.guild.roles, name="Muted")
await member.add_roles(role)
emb = discord.Embed(title="Мут", color=0xc25151, timestamp=datetime.datetime.utcnow())
emb.add_field(name='Модератор:',value=ctx.message.author.mention,inline=True)
await ctx.send(embed=emb)
await asyncio.sleep(timeID)
await member.remove_roles(role)
Параметры {ctx.author.id}, {member.id}, {time}, "{reason}", {ctx.guild.id}, "{ctx.guild.name}", "{datetime.datetime.now().replace(second=0, microsecond=0)} я сохраняю в sqlite3.
В коде, который предоставлен выше, это не прописано, но данные есть.
Так вот суть проблемы. Данные сохраняются и код работает, но есть один фактор. При перезапуске бота, информация слетает, то есть если у человека была роль Muted(Её выдал модератор), то бот её просто не снимет. Возможно ли через sqlite3, чтобы бот при запуске проверял информацию, и если дата, когда мут должен быть снят, бот автоматически его снимал. Желательно всё это делать через: @bot.event
Буду очень благодарен за помощь.
Ответы (2 шт):
Если я правильно понимаю, что вы хотите реализовать, то Вам необходимо для начала создать цикл. Для этого можно использовать tasks.loop:
from discord.ext import tasks
Далее создадим сам цикл:
@tasks.loop(seconds=0) #Вместо 0 указываем время в секундах, через которое он будет повторяться.
async def mutecheck():
Далее в этом цикле мы уже и достаем данные из базы данных и проверяем, что-то подобное:
now = datetime.datetime.now()
#возьмём для примера день.
time = int(now.strftime("%d"))
if time == #дата из бд:
Сам цикл необходимо запустить с помощью on_ready:
@client.event
async def on_ready():
mutecheck.start()
Мне пришла в голову ещё одна идея. Можно попробовать сделать фактически такой же процесс, только не много по-другому.
Предположим вы выдали мут таким образом: .mute @user 10м. Теперь Вам необходимо занести 10 минут в базу данных, но при этом это должно быть значение в секундах. Для этого конвертируем:
try:
t = int(time)
except:
convertTimeList = {'с':1, 'м':60, 'ч':3600, 'д':86400, 'С':1, 'М':60, 'Ч':3600, 'Д':86400}
t = int(time[:-1]) * convertTimeList[time[-1]]
Далее заносим полученное значение в бд.
Создаем цикл:
@tasks.loop(seconds=60) #данные будут обновляться каждые 60 секунд.
async def mutecheck():
# for test in ..... - достаем из бд наше время мута.
if test[0] == 60:
#обновляем бд и ставим значение 0 и забираем мут у пользователя.
if test[0] > 0:
#обновляем бд и забираем 60 секунд из нашей переменной.
Конечно это всё расписано в кратце. На самом деле здесь довольно большой код получится.