Move tasks to jarvis-tasks
This commit is contained in:
parent
b8d1cb6cfc
commit
fd97e82ed4
7 changed files with 1 additions and 212 deletions
|
@ -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")
|
||||
|
|
|
@ -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()
|
|
@ -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()
|
|
@ -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}")
|
|
@ -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()
|
|
@ -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)
|
|
@ -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()
|
Loading…
Add table
Reference in a new issue