68 lines
1.9 KiB
Python
68 lines
1.9 KiB
Python
"""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)
|