"""JARVIS warnings tasks.""" import asyncio import logging from datetime import datetime, timedelta, timezone from beanie.operators import LTE, NotIn from jarvis_core.db.models import Temprole from interactions 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( LTE(Temprole.expires_at, max_ts), NotIn(Temprole.id, 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)