Move reminder and twitter tasks to tasks/
This commit is contained in:
parent
35104cc40b
commit
fa4785f073
3 changed files with 115 additions and 1 deletions
|
@ -1,5 +1,5 @@
|
||||||
"""J.A.R.V.I.S. background task handlers."""
|
"""J.A.R.V.I.S. background task handlers."""
|
||||||
from jarvis.tasks import unban, unlock, unwarn
|
from jarvis.tasks import twitter, unban, unlock, unwarn
|
||||||
|
|
||||||
|
|
||||||
def init() -> None:
|
def init() -> None:
|
||||||
|
@ -7,3 +7,4 @@ def init() -> None:
|
||||||
unban.unban.start()
|
unban.unban.start()
|
||||||
unlock.unlock.start()
|
unlock.unlock.start()
|
||||||
unwarn.unwarn.start()
|
unwarn.unwarn.start()
|
||||||
|
twitter.tweets.start()
|
||||||
|
|
46
jarvis/tasks/reminder.py
Normal file
46
jarvis/tasks/reminder.py
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
"""J.A.R.V.I.S. reminder background task handler."""
|
||||||
|
from asyncio import to_thread
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
|
from dis_snek.ext.tasks.task import Task
|
||||||
|
from dis_snek.ext.tasks.triggers import IntervalTrigger
|
||||||
|
|
||||||
|
import jarvis
|
||||||
|
from jarvis.db.models import Reminder
|
||||||
|
from jarvis.utils import build_embed
|
||||||
|
|
||||||
|
|
||||||
|
async def _remind() -> None:
|
||||||
|
"""J.A.R.V.I.S. reminder blocking task."""
|
||||||
|
reminders = Reminder.objects(remind_at__lte=datetime.utcnow() + timedelta(seconds=30))
|
||||||
|
for reminder in reminders:
|
||||||
|
if reminder.remind_at <= datetime.utcnow():
|
||||||
|
user = await jarvis.jarvis.fetch_user(reminder.user)
|
||||||
|
if not user:
|
||||||
|
reminder.delete()
|
||||||
|
continue
|
||||||
|
embed = build_embed(
|
||||||
|
title="You have a reminder",
|
||||||
|
description=reminder.message,
|
||||||
|
fields=[],
|
||||||
|
)
|
||||||
|
embed.set_author(
|
||||||
|
name=user.name + "#" + user.discriminator,
|
||||||
|
icon_url=user.display_avatar,
|
||||||
|
)
|
||||||
|
embed.set_thumbnail(url=user.display_avatar)
|
||||||
|
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:
|
||||||
|
await channel.send(f"{user.mention}", embed=embed)
|
||||||
|
finally:
|
||||||
|
reminder.delete()
|
||||||
|
|
||||||
|
|
||||||
|
@Task.create(trigger=IntervalTrigger(seconds=15))
|
||||||
|
async def remind() -> None:
|
||||||
|
"""J.A.R.V.I.S. reminder background task."""
|
||||||
|
await to_thread(_remind)
|
67
jarvis/tasks/twitter.py
Normal file
67
jarvis/tasks/twitter.py
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
"""J.A.R.V.I.S. twitter background task handler."""
|
||||||
|
import logging
|
||||||
|
from asyncio import to_thread
|
||||||
|
|
||||||
|
import tweepy
|
||||||
|
from dis_snek.ext.tasks.task import Task
|
||||||
|
from dis_snek.ext.tasks.triggers import IntervalTrigger
|
||||||
|
|
||||||
|
import jarvis
|
||||||
|
from jarvis.config import get_config
|
||||||
|
from jarvis.db.models import Twitter
|
||||||
|
|
||||||
|
logger = logging.getLogger("jarvis")
|
||||||
|
|
||||||
|
__auth = tweepy.AppAuthHandler(
|
||||||
|
get_config().twitter["consumer_key"], get_config().twitter["consumer_secret"]
|
||||||
|
)
|
||||||
|
__api = tweepy.API(__auth)
|
||||||
|
|
||||||
|
|
||||||
|
async def _tweets() -> None:
|
||||||
|
"""J.A.R.V.I.S. twitter blocking task."""
|
||||||
|
guild_cache = dict()
|
||||||
|
channel_cache = dict()
|
||||||
|
twitters = Twitter.objects(active=True)
|
||||||
|
handles = Twitter.objects.distinct("handle")
|
||||||
|
twitter_data = dict()
|
||||||
|
for handle in handles:
|
||||||
|
try:
|
||||||
|
data = __api.user_timeline(screen_name=handle)
|
||||||
|
twitter_data[handle] = data
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error with fetching: {e}")
|
||||||
|
for twitter in twitters:
|
||||||
|
try:
|
||||||
|
tweets = list(filter(lambda x: x.id > twitter.last_tweet, twitter_data[twitter.handle]))
|
||||||
|
if tweets:
|
||||||
|
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.get_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.last_tweet = newest.id
|
||||||
|
twitter.save()
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error with tweets: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
@Task.create(trigger=IntervalTrigger(minutes=1))
|
||||||
|
async def tweets() -> None:
|
||||||
|
"""J.A.R.V.I.S. twitter background task."""
|
||||||
|
await to_thread(_tweets)
|
Loading…
Add table
Reference in a new issue