From 73676c28f4a036bf6a605ed56d8d7f91ccc00754 Mon Sep 17 00:00:00 2001 From: PandaNinjas Date: Sat, 14 Jan 2023 16:24:32 -0800 Subject: [PATCH] feat: expanding discord links --- src/index.ts | 3 +- src/utils/resolveMessage.ts | 72 +++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 src/utils/resolveMessage.ts diff --git a/src/index.ts b/src/index.ts index 75c6797..d69e2af 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,6 +10,7 @@ import { reuploadCommands } from './_reupload'; import * as BuildConfig from './constants'; import { parseLog } from './logs'; import { getLatestMinecraftVersion } from './utils/remoteVersions'; +import { expandDiscordLink } from "./utils/resolveMessage"; import { membersCommand } from './commands/members'; import { starsCommand } from './commands/stars'; @@ -87,12 +88,12 @@ client.once('ready', async () => { `${random(BuildConfig.ETA_MESSAGES)} <:pofat:1031701005559144458>` ); } - const log = await parseLog(e.content); if (log != null) { e.reply({ embeds: [log] }); return; } + await expandDiscordLink(e); }); }); diff --git a/src/utils/resolveMessage.ts b/src/utils/resolveMessage.ts new file mode 100644 index 0000000..9776f4e --- /dev/null +++ b/src/utils/resolveMessage.ts @@ -0,0 +1,72 @@ +import { Colors, EmbedBuilder, Message, ThreadChannel } from "discord.js"; + +function findFirstImage(message: Message): string | undefined { + const result = message.attachments.find((attach) => { + return attach.contentType?.startsWith("image/"); + }); + if (result == undefined) { + return undefined; + } else { + return result.url; + } +} + +export async function expandDiscordLink(message: Message): Promise { + const re = + /(https?:\/\/)?(?:canary\.|ptb\.)?discord(?:app)?\.com\/channels\/(?\d+)\/(?\d+)\/(?\d+)/g; + let execResult = re.exec(message.content); + while (!(execResult == null || execResult.groups == undefined)) { + if (execResult.groups.server_id != message.guildId) { + continue; // do not let the bot leak messages from one server to another + } + const channel = await message.guild?.channels.fetch( + execResult.groups.channel_id + ); + if (channel == undefined || channel == null || !channel.isTextBased()) { + continue; + } + if (channel instanceof ThreadChannel) { + if ( + !channel.parent?.members?.some((user) => user.id == message.author.id) + ) { + continue; // do not reveal a message to a user who can't see it + } + } else { + if (!channel.members?.some((user) => user.id == message.author.id)) { + continue; // do not reveal a message to a user who can't see it + } + } + try { + const messageToShow = await channel.messages.fetch( + execResult.groups.message_id + ); + const builder = new EmbedBuilder() + .setAuthor({ + name: `${messageToShow.author.username}#${messageToShow.author.discriminator}`, + iconURL: messageToShow.author.displayAvatarURL(), + }) + .setDescription(messageToShow.content) + .setColor(Colors.Aqua); + if (messageToShow.attachments.size > 0) { + let attachmentsString = ""; + messageToShow.attachments.forEach((value) => { + attachmentsString += `[${value.name}](${value.url}) `; + }); + builder.addFields({ name: "Attachments", value: attachmentsString }); + const firstImage = findFirstImage(messageToShow); + if (firstImage != undefined) { + builder.setImage(firstImage); + } + } + builder.addFields({ + name: "Source", + value: `[Jump to original message](${messageToShow.url})`, + }); + message.channel.send({ embeds: [builder] }); + } catch (e) { + console.error(e); + continue; + } + execResult = re.exec(message.content); + } +}