summaryrefslogtreecommitdiff
path: root/src/discord/embeds.ts
blob: db23f8015b387b82667a70ad95002f8cbbf58932 (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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import type { DiscordEmbed } from "./interfaces.ts";
import type { RedditPost } from "../reddit.ts";

const 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 const 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;
};

export const createComplaintEmbed = (
  complaintContent: string,
  complainant: { username: string; id: string; avatar?: string },
  timestamp: number,
  isDM: boolean = true,
): DiscordEmbed => {
  return {
    title: "🚨 New Complaint",
    description: complaintContent,
    color: 0xff6b6b,
    fields: [
      {
        name: "Complainant",
        value: `${complainant.username} (${complainant.id})`,
        inline: true,
      },
      {
        name: "Timestamp",
        value: `<t:${Math.floor(timestamp / 1000)}:F>`,
        inline: true,
      },
    ],
    thumbnail: complainant.avatar
      ? {
          url: `https://cdn.discordapp.com/avatars/${complainant.id}/${complainant.avatar}.png?size=256`,
        }
      : undefined,
    footer: {
      text: isDM
        ? "Complaint submitted via DM"
        : "Complaint submitted from server",
    },
  };
};