"""JARVIS Lockdown background task.""" import asyncio import logging from datetime import datetime, timedelta, timezone from dis_snek import Snake from dis_snek.models.discord.enums import Permissions from dis_snek.models.discord.role import Role from jarvis_core.db import q from jarvis_core.db.models import Lockdown from jarvis_tasks.util import runat queue = [] logger = logging.getLogger(__name__) async def _lift(role: Role, lock: Lockdown) -> None: logger.debug(f"Lifting lockdown {lock.id}") original_perms = Permissions(lock.original_perms) await role.edit(permissions=original_perms) lock.active = False await lock.commit() queue.remove(lock.id) async def lift(bot: Snake) -> None: """ Lift a lockdown. Args: bot: Bot instance logger: Global logger """ logger.debug("Starting Task-lift") while True: max_ts = datetime.now(tz=timezone.utc) + timedelta(seconds=55) locks = Lockdown.find(q(active=True, created_at__lte=max_ts)) async for lock in locks: if lock.id in queue: continue guild = await bot.fetch_guild(lock.guild) role = await guild.fetch_role(guild.id) coro = _lift(role, lock) when = lock.created_at + timedelta(minutes=lock.duration) asyncio.create_task(runat(when, coro, logger)) queue.append(lock.id) await asyncio.sleep(delay=60)