"""JARVIS reminders.""" import asyncio from datetime import datetime, timedelta from dis_snek import Snake from jarvis_core.db import q from jarvis_core.db.models import Reminder from jarvis_core.util import build_embed async def remind(bot: Snake) -> None: """ Run reminders in the background. Args: bot: Snake instance """ while True: await asyncio.sleep(5) reminders = Reminder.find( q(remind_at__lte=datetime.utcnow() + timedelta(seconds=5), active=True) ) async for reminder in reminders: user = await 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 bot.fetch_guild(reminder.guild) member = await 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()