41 lines
1.3 KiB
Python
41 lines
1.3 KiB
Python
"""JARVIS Lockdown background task."""
|
|
import asyncio
|
|
from datetime import datetime, timedelta
|
|
from logging import Logger
|
|
|
|
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
|
|
|
|
|
|
async def _lift(role: Role, lock: Lockdown, logger: Logger) -> 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()
|
|
|
|
|
|
async def lift(bot: Snake, logger: Logger) -> None:
|
|
"""
|
|
Lift a lockdown.
|
|
|
|
Args:
|
|
bot: Bot instance
|
|
logger: Global logger
|
|
"""
|
|
while True:
|
|
max_ts = datetime.utcnow() + timedelta(seconds=55)
|
|
locks = Lockdown.find(q(active=True, created_at__lte=max_ts))
|
|
async for lock in locks:
|
|
guild = await bot.fetch_guild(lock.guild)
|
|
role = await guild.fetch_role(guild.id)
|
|
coro = _lift(role, lock, logger)
|
|
when = lock.created_at + timedelta(minutes=lock.duration)
|
|
asyncio.create_task(runat(when, coro, logger))
|
|
|
|
await asyncio.sleep(delay=60)
|