Add autokick, closes jarvis-bot#74
This commit is contained in:
parent
853f833231
commit
b5f30a8b2d
2 changed files with 77 additions and 1 deletions
|
@ -8,7 +8,16 @@ from jarvis_core.log import get_logger
|
||||||
|
|
||||||
from jarvis_tasks import const
|
from jarvis_tasks import const
|
||||||
from jarvis_tasks.config import TaskConfig
|
from jarvis_tasks.config import TaskConfig
|
||||||
from jarvis_tasks.tasks import ban, lock, lockdown, reddit, reminder, twitter, warning
|
from jarvis_tasks.tasks import (
|
||||||
|
autokick,
|
||||||
|
ban,
|
||||||
|
lock,
|
||||||
|
lockdown,
|
||||||
|
reddit,
|
||||||
|
reminder,
|
||||||
|
twitter,
|
||||||
|
warning,
|
||||||
|
)
|
||||||
|
|
||||||
__version__ = const.__version__
|
__version__ = const.__version__
|
||||||
logger = None
|
logger = None
|
||||||
|
@ -43,6 +52,7 @@ async def _start(config: Optional[str] = "config.yaml") -> None:
|
||||||
try:
|
try:
|
||||||
logger.debug("Starting tasks")
|
logger.debug("Starting tasks")
|
||||||
functions = [
|
functions = [
|
||||||
|
autokick.autokick,
|
||||||
ban.unban,
|
ban.unban,
|
||||||
lock.unlock,
|
lock.unlock,
|
||||||
lockdown.lift,
|
lockdown.lift,
|
||||||
|
|
66
jarvis_tasks/tasks/autokick.py
Normal file
66
jarvis_tasks/tasks/autokick.py
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
"""JARVIS autokick 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 Setting
|
||||||
|
|
||||||
|
logger = logging.get_logger(__name__)
|
||||||
|
|
||||||
|
resync = {}
|
||||||
|
|
||||||
|
|
||||||
|
async def autokick(bot: Snake) -> 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)
|
Loading…
Add table
Reference in a new issue