Add temprole background task

This commit is contained in:
Zeva Rose 2022-05-02 12:11:17 -06:00
parent 2ef725abed
commit 34983b0f19
3 changed files with 69 additions and 1 deletions

View file

@ -16,6 +16,7 @@ from jarvis_tasks.tasks import (
lockdown, lockdown,
reddit, reddit,
reminder, reminder,
temprole,
twitter, twitter,
warning, warning,
) )
@ -62,6 +63,7 @@ async def _start(config: Optional[str] = "config.yaml") -> None:
lockdown.lift, lockdown.lift,
reddit.reddit, reddit.reddit,
reminder.remind, reminder.remind,
temprole.remove,
twitter.twitter, twitter.twitter,
warning.unwarn, warning.unwarn,
] ]

View file

@ -0,0 +1,66 @@
"""JARVIS warnings tasks."""
import asyncio
import logging
from datetime import datetime, timedelta, timezone
from dis_snek import Snake
from jarvis_core.db import q
from jarvis_core.db.models import Temprole
from jarvis_tasks.util import runat
queue = []
logger = logging.getLogger(__name__)
async def _remove(bot: Snake, 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: Snake) -> None:
"""
Remove temproles when they expire.
Args:
bot: Snake instance
"""
logger.debug("Starting Task-remove")
while True:
max_ts = datetime.now(tz=timezone.utc) + timedelta(minutes=55)
temproles = Temprole.find(q(expires_at__lte=max_ts, id__nin=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 hour
await asyncio.sleep(3600)

View file

@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "jarvis-tasks" name = "jarvis-tasks"
version = "0.6.1" version = "0.7.0"
description = "" description = ""
authors = ["Your Name <you@example.com>"] authors = ["Your Name <you@example.com>"]