blob: ca60b2c8a066cba6e312a58349753ce36f7a36b8 [file] [log] [blame]
import { getCommandMentionByName } from "./../utils/getCommandDataByName.js";
import client from "../utils/client.js";
import keyValueList from "../utils/generateKeyValueList.js";
import singleNotify from "../utils/singleNotify.js";
import { streamAttachment } from "../reflex/scanners.js";
import EmojiEmbed from "../utils/generateEmojiEmbed.js";
import addPlural from "../utils/plurals.js";
import type { GuildTextBasedChannel, Message } from "discord.js";
export default async function logAttachment(message: Message): Promise<AttachmentLogSchema> {
if (message.guild) client.database.premium.hasPremium(message.guild.id).finally(() => {});
if (!message.guild) throw new Error("Tried to log an attachment in a non-guild message");
const { renderUser, renderChannel, renderDelta } = client.logger;
const attachments = [];
for (const attachment of message.attachments.values()) {
attachments.push({
local: (await streamAttachment(attachment.url))[0],
url: attachment.url,
height: attachment.height,
width: attachment.width,
size: attachment.size
});
}
const links = message.content.match(/https?:\/\/\S+/gi) ?? [];
for (const link of links) {
if (link.toLowerCase().match(/\.(jpg|jpeg|png|gif|gifv|webm|webp|mp4|wav|mp3|ogg)$/gi)) {
attachments.push({
local: (await streamAttachment(link))[0],
url: link,
height: null,
width: null
});
}
}
if (attachments.length === 0) return { files: [] };
if (await client.database.premium.hasPremium(message.guild.id)) {
const channel = (await client.database.guilds.read(message.guild.id)).logging.attachments.channel;
if (!channel) {
singleNotify(
"noAttachmentLogChannel",
message.guild.id,
`No channel set for attachment logging. You can set one with ${getCommandMentionByName(
"settings/logs/attachments"
)}`,
"Warning"
);
return { files: attachments };
}
const channelObj = await message.guild.channels.fetch(channel);
if (!channelObj) {
singleNotify(
"attachmentLogChannelDeleted",
message.guild.id,
`Your attachment history channel was deleted or is not longer accessible. You can set a new one with ${getCommandMentionByName(
"settings/logs/attachments"
)}`,
"Warning"
);
return { files: attachments };
}
const m = await (channelObj as GuildTextBasedChannel).send({
embeds: [
new EmojiEmbed()
.setTitle(`${addPlural(attachments.length, "Attachment")} Sent`)
.setDescription(
keyValueList({
messageId: `\`${message.id}\``,
sentBy: renderUser(message.author),
sentIn: renderChannel(message.channel as GuildTextBasedChannel),
sent: renderDelta(new Date(message.createdTimestamp).getTime())
}) + `\n[[Jump to message]](${message.url})`
)
.setEmoji("ICONS.ATTACHMENT")
.setStatus("Success")
],
files: attachments.map((file) => file.local)
});
client.database.guilds.write(message.guild.id, {
[`logging.attachments.saved.${message.channel.id}${message.id}`]: m.url
});
return { files: attachments, jump: m.url };
} else {
return { files: attachments };
}
}
export interface AttachmentLogSchema {
files: {
url: string;
local: string;
height: number | null;
width: number | null;
}[];
jump?: string;
}