summaryrefslogtreecommitdiff
path: root/src/discord/embeds.ts
blob: f88cec24f7c426a96b2c2b785e389278611d71b7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import type { DiscordEmbed } from './interfaces.ts';
import type { RedditPost } from '../reddit.ts';

function decodeHtmlEntities(str: string): string {
  return str
    .replace(/&/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;
}