diff --git a/jarvis/cogs/twitter.py b/jarvis/cogs/twitter.py index 6bc8b81..bd92ddc 100644 --- a/jarvis/cogs/twitter.py +++ b/jarvis/cogs/twitter.py @@ -67,7 +67,8 @@ class TwitterCog(Scale): return try: - latest_tweet = await asyncio.to_thread(self.api.user_timeline, screen_name=handle)[0] + account = (await asyncio.to_thread(self.api.get_user(screen_name=handle)))[0] + latest_tweet = (await asyncio.to_thread(self.api.user_timeline, screen_name=handle))[0] except Exception: await ctx.send( "Unable to get user timeline. Are you sure the handle is correct?", ephemeral=True @@ -79,13 +80,14 @@ class TwitterCog(Scale): await ctx.send("Cannot follow more than 12 Twitter accounts", ephemeral=True) return - exists = Twitter.objects(handle=handle, guild=ctx.guild.id) + exists = Twitter.objects(twitter_id=account.id, guild=ctx.guild.id) if exists: - await ctx.send("Twitter handle already being followed in this guild", ephemeral=True) + await ctx.send("Twitter account already being followed in this guild", ephemeral=True) return t = Twitter( - handle=handle, + handle=account.screen_name, + twitter_id=account.id, guild=ctx.guild.id, channel=channel.id, admin=ctx.author.id, @@ -125,7 +127,7 @@ class TwitterCog(Scale): try: context = await self.bot.wait_for_component( - check=lambda x: ctx.author.id == x.author.id, + check=lambda x: ctx.author.id == x.context.author.id, messages=message, timeout=60 * 5, ) diff --git a/jarvis/db/models.py b/jarvis/db/models.py index 2449012..a99cb45 100644 --- a/jarvis/db/models.py +++ b/jarvis/db/models.py @@ -222,6 +222,7 @@ class Twitter(Document): """Twitter Follow object.""" active = BooleanField(default=True) + twitter_id = IntField(required=True) handle = StringField(required=True) channel = SnowflakeField(required=True) guild = SnowflakeField(required=True) @@ -229,6 +230,7 @@ class Twitter(Document): retweets = BooleanField(default=True) admin = SnowflakeField(required=True) created_at = DateTimeField(default=datetime.utcnow) + last_sync = DateTimeField() meta = {"db_alias": "main"} diff --git a/jarvis/tasks/twitter.py b/jarvis/tasks/twitter.py index fe1a9c1..3167e32 100644 --- a/jarvis/tasks/twitter.py +++ b/jarvis/tasks/twitter.py @@ -1,6 +1,7 @@ """J.A.R.V.I.S. twitter background task handler.""" import logging from asyncio import to_thread +from datetime import datetime, timedelta import tweepy from dis_snek.ext.tasks.task import Task @@ -23,18 +24,20 @@ async def _tweets() -> None: 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: + if not twitter.twitter_id or not twitter.last_sync: + user = __api.get_user(screen_name=twitter.handle) + twitter.twitter_id = user.id + twitter.handle = user.screen_name + twitter.last_sync = datetime.now() + + if twitter.last_sync + timedelta(hours=1) <= datetime.now(): + user = __api.get_user(id=twitter.twitter_id) + twitter.handle = user.screen_name + twitter.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)