jarvis-tasks/jarvis_tasks/tasks/warning.py

41 lines
1.2 KiB
Python

"""JARVIS warnings tasks."""
import asyncio
from datetime import datetime, timedelta, timezone
from logging import Logger
from dis_snek import Snake
from jarvis_core.db import q
from jarvis_core.db.models import Warning
from jarvis_tasks.util import runat
queue = []
async def _unwarn(warn: Warning, logger: Logger) -> None:
logger.debug(f"Deactivating warning {warn.id}")
warn.active = False
await warn.commit()
queue.remove(warn.id)
async def unwarn(bot: Snake, logger: Logger) -> None:
"""
Deactivate warnings when they expire.
Args:
bot: Snake instance
logger: Global logger
"""
while True:
max_ts = datetime.now(tz=timezone.utc) + timedelta(minutes=55)
warns = Warning.find(q(active=True, created_at__lte=max_ts))
async for warn in warns:
if warn.id in queue:
continue
coro = _unwarn(warn, logger)
when = warn.created_at + timedelta(hours=warn.duration)
asyncio.create_task(runat(when, coro, logger))
queue.append(warn.id)
# Check every hour
await asyncio.sleep(3600)