"""JARVIS warnings tasks.""" import asyncio import logging from datetime import datetime, timedelta, timezone from jarvis_core.db import q from jarvis_core.db.models import Temprole from naff import Client from jarvis_tasks.util import runat queue = [] logger = logging.getLogger(__name__) async def _remove(bot: Client, temprole: Temprole) -> None: logger.debug(f"Removing temprole {temprole.id}") guild = await bot.fetch_guild(temprole.guild) if not guild: logger.warn(f"Temprole {temprole.id} invalid") await temprole.delete() return user = await guild.fetch_member(temprole.user) if not user: logger.warn(f"Temprole {temprole.id} invalid") await temprole.delete() return role = await guild.fetch_role(temprole.role) if not role: logger.warn(f"Temprole {temprole.id} invalid") await temprole.delete() return if user.has_role(role): try: await user.remove_role(role, "Temporary role expired") except Exception: logger.warn("Temprole failed to remove, ignoring") await temprole.delete() async def remove(bot: Client) -> None: """ Remove temproles when they expire. Args: bot: Client instance """ logger.debug("Starting Task-remove") while True: max_ts = datetime.now(tz=timezone.utc) + timedelta(seconds=45) temproles = Temprole.find(q(expires_at__lte=max_ts, id__nin=queue)) async for temprole in temproles: if temprole.id in queue: logger.warn("Temprole found despite filter") continue coro = _remove(bot, temprole) when = temprole.expires_at asyncio.create_task(runat(when, coro, logger)) queue.append(temprole.id) # Check every minute await asyncio.sleep(60)