From 9678e4e1e87a5d73c47683fe85848888ca8e857b Mon Sep 17 00:00:00 2001 From: Fuwn Date: Tue, 9 Sep 2025 18:05:15 -0700 Subject: refactor: Move Discord APIs to Discord module --- src/discord/embeds.ts | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/discord/embeds.ts (limited to 'src/discord/embeds.ts') diff --git a/src/discord/embeds.ts b/src/discord/embeds.ts new file mode 100644 index 0000000..f88cec2 --- /dev/null +++ b/src/discord/embeds.ts @@ -0,0 +1,90 @@ +import type { DiscordEmbed } from './interfaces.ts'; +import type { RedditPost } from '../reddit.ts'; + +function decodeHtmlEntities(str: string): string { + return str + .replace(/&/g, '&') + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(///g, '/') + .replace(/`/g, '`') + .replace(/=/g, '='); +} + +export function createPostEmbed(post: RedditPost): DiscordEmbed { + const mediaUrl = + post.media?.reddit_video?.fallback_url || + post.secure_media?.reddit_video?.fallback_url || + post.url; + + let description = post.selftext || ''; + + if (description.length > 1000) + description = description.substring(0, 997).trim() + ' ...'; + + const embed: DiscordEmbed = { + title: post.title, + description: description, + url: `https://reddit.com${post.permalink}`, + color: 0xff4500, + author: { + name: `u/${post.author}`, + url: `https://reddit.com/u/${post.author}`, + }, + fields: [ + { + name: 'Score', + value: `${post.score} ⬆️`, + inline: true, + }, + { + name: 'Comments', + value: `${post.num_comments} 💬`, + inline: true, + }, + ], + timestamp: new Date(post.created_utc * 1000).toISOString(), + footer: { + text: 'r/okbuddyumamusume', + }, + }; + + if (mediaUrl) + if (post.media?.reddit_video || post.secure_media?.reddit_video) { + if (!description) description = ''; + + description += + '\n\n📹 **This post contains a video** - [Click here to view](' + + mediaUrl + + ')'; + embed.description = description; + + if (post.preview?.images?.[0]?.source?.url) { + const decodedURL = decodeHtmlEntities( + post.preview.images[0].source.url, + ); + + console.log('Using preview image:', decodedURL); + + embed.image = { url: decodedURL }; + } else if ( + post.thumbnail && + post.thumbnail !== 'self' && + post.thumbnail !== 'default' + ) { + const decodedThumbnail = decodeHtmlEntities(post.thumbnail); + + console.log('Using thumbnail:', decodedThumbnail); + + embed.image = { url: decodedThumbnail }; + } else { + console.log('No suitable thumbnail found for video post'); + } + } else { + embed.image = { url: mediaUrl }; + } + + return embed; +} -- cgit v1.2.3