"""JARVIS autokick tasks.""" import asyncio import logging from datetime import datetime, timedelta, timezone from jarvis_core.db import q from jarvis_core.db.models import Setting from naff import Client logger = logging.getLogger(__name__) resync = {} async def autokick(bot: Client) -> None: """ Autokick unverified usersself. Args: bot: Bot instance """ logger.debug("Starting Task-autokick") while True: autokicks = Setting.find(q(setting="autokick", value__exists=True)) async for auto in autokicks: if auto.value <= 0: logger.warn("Autokick setting <= 0, deleting") await auto.delete() continue verified = await Setting.find_one( q(setting="verified", value__exists=True, guild=auto.guild) ) unverified = await Setting.find_one( q(setting="unverified", value__exists=True, guild=auto.guild) ) if not verified or not unverified: logger.debug( f"Guild {auto.guild} is missing one of: verified, unverified. Ignoring" ) continue guild = await bot.fetch_guild(auto.guild) if not guild: logger.warn(f"Guild {auto.guild} no longer exists, deleting setting") await auto.delete() await verified.delete() await unverified.delete() continue if guild.id not in resync or resync[guild.id] >= datetime.now(tz=timezone.utc): logger.info(f"Guild {guild.id} out of date, resyncing") limit = 1000 guild_id = guild.id after = None while members := await bot.http.list_members( guild_id=guild_id, limit=limit, after=after ): after = members[-1].id await asyncio.sleep(0.2) role = await guild.fetch_role(unverified.value) for member in role.members: if member.joined_at + timedelta(days=auto.value) >= datetime.now(tz=timezone.utc): await member.kick(reason="Failed to verify in {auto.value} days") await asyncio.sleep(14400)