From b1076b9d904f8b97c465ee039ab8031fa317d9a9 Mon Sep 17 00:00:00 2001 From: zevaryx Date: Sat, 19 Feb 2022 02:46:05 -0700 Subject: [PATCH] Add reminder task --- jarvis_tasks/tasks/reminder.py | 54 ++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 jarvis_tasks/tasks/reminder.py diff --git a/jarvis_tasks/tasks/reminder.py b/jarvis_tasks/tasks/reminder.py new file mode 100644 index 0000000..75a0c6d --- /dev/null +++ b/jarvis_tasks/tasks/reminder.py @@ -0,0 +1,54 @@ +"""JARVIS reminders.""" +import asyncio +from datetime import datetime, timedelta +from typing import TYPE_CHECKING + +from jarvis_core.db import q +from jarvis_core.db.models import Reminder +from jarvis_core.util import build_embed + +if TYPE_CHECKING: + from dis_snek import Snake + + +async def remind(self, bot: "Snake") -> None: + """Run reminders in the background.""" + while True: + await asyncio.sleep(5) + reminders = await Reminder.find( + q(remind_at__lte=datetime.utcnow() + timedelta(seconds=5), active=True) + ) + for reminder in reminders: + user = await self._bot.fetch_user(reminder.user) + if not user: + await reminder.delete() + continue + + embed = build_embed( + title="You have a reminder!", description=reminder.message, fields=[] + ) + embed.set_author( + name=user.username + "#" + user.discriminator, icon_url=user.avatar.url + ) + + embed.set_thumbnail(url=user.avatar.url) + + try: + await user.send(embed=embed) + except Exception: + guild = await self._bot.fetch_guild(reminder.guild) + member = await self._bot.fetch_member(user.id) + if not member: + continue + channel = await guild.fetch_channel(reminder.channel) if guild else None + if channel and not reminder.private: + await channel.send(f"{member.mention}", embed=embed) + await reminder.delete() + else: + await channel.send( + f"{member.mention}, you had a private reminder set for now," + " but I couldn't send it to you.\n" + f"Use `/reminder fetch {str(reminder.id)}` to view" + ) + reminder.update(q(active=False)) + await reminder.commit()