Support multiple images
This commit is contained in:
parent
05b15c0e29
commit
0cb744941c
1 changed files with 62 additions and 24 deletions
|
@ -2,10 +2,11 @@
|
||||||
import asyncio
|
import asyncio
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from logging import Logger
|
from logging import Logger
|
||||||
|
from typing import List
|
||||||
|
|
||||||
import tweepy
|
import tweepy
|
||||||
from dis_snek import Snake
|
from dis_snek import Snake
|
||||||
from dis_snek.models.discord.embed import EmbedAttachment
|
from dis_snek.models.discord.embed import Embed
|
||||||
from jarvis_core.db import q
|
from jarvis_core.db import q
|
||||||
from jarvis_core.db.models import TwitterAccount, TwitterFollow
|
from jarvis_core.db.models import TwitterAccount, TwitterFollow
|
||||||
from jarvis_core.util import build_embed
|
from jarvis_core.util import build_embed
|
||||||
|
@ -15,6 +16,62 @@ from jarvis_tasks.config import TaskConfig
|
||||||
config = TaskConfig.from_yaml()
|
config = TaskConfig.from_yaml()
|
||||||
|
|
||||||
|
|
||||||
|
def tweet_embeds(tweet: tweepy.models.Status) -> List[Embed]:
|
||||||
|
"""
|
||||||
|
Build a tweet embeds.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
tweet: Tweet to build embed
|
||||||
|
"""
|
||||||
|
url = f"https://twitter.com/{tweet.user.name}/status/{tweet.id}"
|
||||||
|
entities = tweet.__dict__.get("extended_entities", {})
|
||||||
|
media = entities.get("media", [])
|
||||||
|
|
||||||
|
photos = []
|
||||||
|
for item in media:
|
||||||
|
if item["type"] in ["photo", "animated_gif"]:
|
||||||
|
photos.append(item["media_url_https"])
|
||||||
|
|
||||||
|
text = tweet.text
|
||||||
|
if subtweet := tweet.__dict__.get("quoted_status", None):
|
||||||
|
subuser = subtweet.user
|
||||||
|
text += f"\n\n> [@{subuser.name}](https://twitter.com/{subuser.name})"
|
||||||
|
text += f"\n> {subtweet.text}"
|
||||||
|
if entites := subtweet.__dict__.get("extended_entities", {}):
|
||||||
|
submedia = entites.get("media", [])
|
||||||
|
for item in submedia:
|
||||||
|
if item["type"] in ["photo", "animated_gif"]:
|
||||||
|
photos.append(item["media_url_https"])
|
||||||
|
|
||||||
|
base_embed = build_embed(
|
||||||
|
title="",
|
||||||
|
description=(text + f"\n\n[View this tweet]({url})"),
|
||||||
|
fields=[],
|
||||||
|
color="#1DA1F2",
|
||||||
|
url=url,
|
||||||
|
)
|
||||||
|
base_embed.set_author(
|
||||||
|
name=tweet.user.name,
|
||||||
|
url=url,
|
||||||
|
icon_url=tweet.author.profile_image_url_https,
|
||||||
|
)
|
||||||
|
base_embed.set_footer(
|
||||||
|
text="Twitter",
|
||||||
|
icon_url="https://abs.twimg.com/icons/apple-touch-icon-192x192.png",
|
||||||
|
)
|
||||||
|
|
||||||
|
embeds = [base_embed]
|
||||||
|
|
||||||
|
if len(photos) > 0:
|
||||||
|
embeds[0].set_image(url=photos[0])
|
||||||
|
for photo in photos[1:4]:
|
||||||
|
embed = Embed(url=url)
|
||||||
|
embed.set_image(url=photo)
|
||||||
|
embeds.append(embed)
|
||||||
|
|
||||||
|
return embeds
|
||||||
|
|
||||||
|
|
||||||
async def twitter(bot: Snake, logger: Logger) -> None:
|
async def twitter(bot: Snake, logger: Logger) -> None:
|
||||||
"""
|
"""
|
||||||
Sync tweets in the background.
|
Sync tweets in the background.
|
||||||
|
@ -64,32 +121,13 @@ async def twitter(bot: Snake, logger: Logger) -> None:
|
||||||
if retweet and not follow.retweets:
|
if retweet and not follow.retweets:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
timestamp = int(tweet.created_at.timestamp())
|
embeds = tweet_embeds(tweet)
|
||||||
url = f"https://twitter.com/{account.handle}/status/{tweet.id}"
|
|
||||||
mod = "re" if retweet else ""
|
mod = "re" if retweet else ""
|
||||||
media = tweet.entities.get("media", None)
|
timestamp = int(tweet.created_at.timestamp())
|
||||||
photo = None
|
|
||||||
if media and media[0]["type"] in ["photo", "animated_gif"]:
|
|
||||||
photo = EmbedAttachment(url=media[0]["media_url_https"])
|
|
||||||
embed = build_embed(
|
|
||||||
title="",
|
|
||||||
description=(tweet.text + f"\n\n[View this tweet]({url})"),
|
|
||||||
fields=[],
|
|
||||||
color="#1DA1F2",
|
|
||||||
image=photo,
|
|
||||||
)
|
|
||||||
embed.set_author(
|
|
||||||
name=account.handle,
|
|
||||||
url=url,
|
|
||||||
icon_url=tweet.author.profile_image_url_https,
|
|
||||||
)
|
|
||||||
embed.set_footer(
|
|
||||||
text="Twitter",
|
|
||||||
icon_url="https://abs.twimg.com/icons/apple-touch-icon-192x192.png",
|
|
||||||
)
|
|
||||||
|
|
||||||
await channel.send(
|
await channel.send(
|
||||||
f"`@{account.handle}` {mod}tweeted this at <t:{timestamp}:f>"
|
f"`@{account.handle}` {mod}tweeted this at <t:{timestamp}:f>",
|
||||||
|
embeds=embeds,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Delete invalid follows
|
# Delete invalid follows
|
||||||
|
|
Loading…
Add table
Reference in a new issue