summaryrefslogtreecommitdiff
path: root/src/discord/embeds.ts
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-09-09 18:05:15 -0700
committerFuwn <[email protected]>2025-09-09 18:05:15 -0700
commit9678e4e1e87a5d73c47683fe85848888ca8e857b (patch)
tree42235ab613eba920ef46ceaba946f2fdc6362427 /src/discord/embeds.ts
parentfix: Properly handle videos (diff)
downloadumabotdiscord-9678e4e1e87a5d73c47683fe85848888ca8e857b.tar.xz
umabotdiscord-9678e4e1e87a5d73c47683fe85848888ca8e857b.zip
refactor: Move Discord APIs to Discord module
Diffstat (limited to 'src/discord/embeds.ts')
-rw-r--r--src/discord/embeds.ts90
1 files changed, 90 insertions, 0 deletions
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(/&amp;/g, '&')
+ .replace(/&lt;/g, '<')
+ .replace(/&gt;/g, '>')
+ .replace(/&quot;/g, '"')
+ .replace(/&#x27;/g, "'")
+ .replace(/&#x2F;/g, '/')
+ .replace(/&#x60;/g, '`')
+ .replace(/&#x3D;/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;
+}