Move tasks to jarvis-tasks

This commit is contained in:
Zeva Rose 2022-02-19 17:04:43 -07:00
parent b8d1cb6cfc
commit fd97e82ed4
7 changed files with 1 additions and 212 deletions

View file

@ -9,7 +9,7 @@ from dis_snek import Context, Intents, Snake, listen
from jarvis_core.db import connect
# from jarvis import logo # noqa: F401
from jarvis import tasks, utils
from jarvis import utils
from jarvis.config import get_config
from jarvis.events import member, message
@ -102,12 +102,6 @@ async def on_ready() -> None:
print(" Connected to {} guild(s)".format(len(jarvis.guilds))) # noqa: T001
@listen()
async def on_startup() -> None:
"""Lepton on_startup override."""
tasks.init()
def run() -> None:
"""Run J.A.R.V.I.S."""
connect(**jconfig.mongo["connect"], testing=jconfig.mongo["database"] == "jarvis")

View file

@ -1,10 +0,0 @@
"""J.A.R.V.I.S. background task handlers."""
from jarvis.tasks import twitter, unban, unlock, unwarn
def init() -> None:
"""Start the background task handlers."""
unban.unban.start()
unlock.unlock.start()
unwarn.unwarn.start()
twitter.tweets.start()

View file

@ -1,45 +0,0 @@
"""J.A.R.V.I.S. reminder background task handler."""
from datetime import datetime, timedelta
from dis_snek.models.snek.tasks.task import Task
from dis_snek.models.snek.tasks.triggers import IntervalTrigger
from jarvis_core.db import q
from jarvis_core.db.models import Reminder
import jarvis
from jarvis.utils import build_embed
@Task.create(trigger=IntervalTrigger(seconds=15))
async def remind() -> None:
"""J.A.R.V.I.S. reminder background task."""
reminders = Reminder.find(q(remind_at__lte=datetime.utcnow() + timedelta(seconds=30)))
async for reminder in reminders:
if reminder.remind_at <= datetime.utcnow():
user = await jarvis.jarvis.fetch_user(reminder.user)
if not user:
await reminder.delete()
continue
embed = build_embed(
title="You have a reminder",
description=reminder.message,
fields=[],
)
embed.set_author(
name=user.username + "#" + user.discriminator, icon_url=user.avatar.url
)
embed.set_thumbnail(url=user.display_avatar.url)
try:
await user.send(embed=embed)
except Exception:
guild = jarvis.jarvis.fetch_guild(reminder.guild)
channel = guild.get_channel(reminder.channel) if guild else None
if channel and not reminder.private:
await channel.send(f"{user.mention}", embed=embed)
else:
await channel.send(
f"{user.mention}, you had a private reminder set for now, "
"but I couldn't send it to you."
)
finally:
await reminder.delete()

View file

@ -1,63 +0,0 @@
"""J.A.R.V.I.S. twitter background task handler."""
import logging
from datetime import datetime, timedelta
import tweepy
from dis_snek.models.snek.tasks.task import Task
from dis_snek.models.snek.tasks.triggers import IntervalTrigger
from jarvis_core.db import q
from jarvis_core.db.models import Twitter
import jarvis
logger = logging.getLogger("jarvis")
@Task.create(trigger=IntervalTrigger(minutes=1))
async def tweets() -> None:
"""J.A.R.V.I.S. twitter background task."""
config = jarvis.config.get_config()
__auth = tweepy.AppAuthHandler(
config.twitter["consumer_key"], jarvis.jconfig.twitter["consumer_secret"]
)
__api = tweepy.API(__auth)
guild_cache = {}
channel_cache = {}
twitters = Twitter.find(q(active=True))
async for twitter in twitters:
try:
if not twitter.twitter_id or not twitter.last_sync:
user = __api.get_user(screen_name=twitter.handle)
twitter.update(
q(twitter_id=user.id, handle=user.screen_name, last_sync=datetime.now())
)
if twitter.last_sync + timedelta(hours=1) <= datetime.now():
user = __api.get_user(id=twitter.twitter_id)
twitter.update(q(handle=user.screen_name, last_sync=datetime.now()))
if tweets := __api.user_timeline(id=twitter.twitter_id):
guild_id = twitter.guild
channel_id = twitter.channel
tweets = sorted(tweets, key=lambda x: x.id)
if guild_id not in guild_cache:
guild_cache[guild_id] = await jarvis.jarvis.fetch_guild(guild_id)
guild = guild_cache[twitter.guild]
if channel_id not in channel_cache:
channel_cache[channel_id] = await guild.fetch_channel(channel_id)
channel = channel_cache[channel_id]
for tweet in tweets:
retweet = "retweeted_status" in tweet.__dict__
if retweet and not twitter.retweets:
continue
timestamp = int(tweet.created_at.timestamp())
url = f"https://twitter.com/{twitter.handle}/status/{tweet.id}"
verb = "re" if retweet else ""
await channel.send(
f"`@{twitter.handle}` {verb}tweeted this at <t:{timestamp}:f>: {url}"
)
newest = max(tweets, key=lambda x: x.id)
twitter.update(q(last_tweet=newest.id))
await twitter.commit()
except Exception as e:
logger.error(f"Error with tweets: {e}")

View file

@ -1,33 +0,0 @@
"""J.A.R.V.I.S. unban background task handler."""
from datetime import datetime, timedelta
from dis_snek.models.snek.tasks.task import Task
from dis_snek.models.snek.tasks.triggers import IntervalTrigger
from jarvis_core.db import q
from jarvis_core.db.models import Ban, Unban
import jarvis
@Task.create(IntervalTrigger(minutes=10))
async def _unban() -> None:
"""J.A.R.V.I.S. unban background task."""
jarvis_id = jarvis.jconfig.client_id
bans = Ban.find(q(type="temp", active=True))
async for ban in bans:
if ban.created_at + timedelta(hours=ban.duration) < datetime.now() + timedelta(minutes=10):
guild = await jarvis.jarvis.fetch_guild(ban.guild)
user = await jarvis.jarvis.fetch_user(ban.user)
if user:
await guild.unban(user=user, reason="Ban expired")
ban.update(q(active=False))
await ban.commit()
u = Unban(
user=user.id,
guild=guild.id,
username=user.name,
discrim=user.discriminator,
admin=jarvis_id,
reason="Ban expired",
)
await u.commit()

View file

@ -1,37 +0,0 @@
"""J.A.R.V.I.S. unlock background task handler."""
from asyncio import to_thread
from datetime import datetime, timedelta
from dis_snek.models.snek.tasks.task import Task
from dis_snek.models.snek.tasks.triggers import IntervalTrigger
import jarvis
from jarvis.db.models import Lock
async def _unlock() -> None:
"""J.A.R.V.I.S. unlock blocking task."""
locks = Lock.objects(active=True)
# Block execution for now
# TODO: Reevaluate with admin/lock[down]
if False:
for lock in locks:
if lock.created_at + timedelta(minutes=lock.duration) < datetime.utcnow():
guild = await jarvis.jarvis.fetch_guild(lock.guild)
channel = await guild.fetch_channel(lock.channel)
if channel:
roles = await guild.fetch_roles()
for role in roles:
overrides = channel.overwrites_for(role)
overrides.send_messages = None
await channel.set_permissions(
role, overwrite=overrides, reason="Lock expired"
)
lock.active = False
lock.save()
@Task.create(IntervalTrigger(minutes=1))
async def unlock() -> None:
"""J.A.R.V.I.S. unlock background task."""
await to_thread(_unlock)

View file

@ -1,17 +0,0 @@
"""J.A.R.V.I.S. unwarn background task handler."""
from datetime import datetime, timedelta
from dis_snek.models.snek.tasks.task import Task
from dis_snek.models.snek.tasks.triggers import IntervalTrigger
from jarvis_core.db import q
from jarvis_core.db.models import Warning
@Task.create(IntervalTrigger(hours=1))
async def unwarn() -> None:
"""J.A.R.V.I.S. unwarn background task."""
warns = Warning.find(q(active=True))
async for warn in warns:
if warn.created_at + timedelta(hours=warn.duration) < datetime.now():
warn.update(q(active=False))
await warn.commit()