"""JARVIS autokick tasks.""" import asyncio import logging from datetime import datetime, timedelta, timezone from beanie.operators import Exists from jarvis_core.db.models import Setting from interactions 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(Setting.setting == "autokick", Exists(Setting.value)) async for auto in autokicks: if auto.value <= 0: logger.warn("Autokick setting <= 0, deleting") await auto.delete() continue verified = await Setting.find_one( Setting.setting == "verified", Exists(Setting.value), Setting.guild == auto.guild, ) unverified = await Setting.find_one( Setting.setting == "unverified", Exists(Setting.value), Setting.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)