import { APIEmbedField, Channel, EmbedBuilder, GuildTextBasedChannel, messageLink } from 'discord.js'; import { Database } from '../shared/Database'; import { Message } from '../events'; import { deserializeMessagePart, getModifiedAttachments, getModifiedStickers } from './message-utils'; import { LoggedMessage } from '../types'; export async function logEdit(loggedMessage: LoggedMessage, newMessage: Message) { const settings = await Database.getGuildSettings(newMessage.guildId); if (!settings || !settings.event_logs_channel_id) return; const channel = await newMessage.guild.channels.fetch(settings.event_logs_channel_id); if (!channel || !channel.isSendable()) return; const fields: APIEmbedField[] = []; fields.push(...getMainEmbeds(loggedMessage, newMessage)); fields.push(...getEditEmbeds(loggedMessage, newMessage)); const embed = new EmbedBuilder() .setTitle('Edited Message') .setColor(0xFFFF00) .setTimestamp(newMessage.createdTimestamp) .addFields(...fields); channel.send({ embeds: [embed] }); } export async function logDeletion(loggedMessage: LoggedMessage, deletedMessage: Message) { const settings = await Database.getGuildSettings(deletedMessage.guildId); if (!settings || !settings.event_logs_channel_id) return; const channel = await deletedMessage.guild.channels.fetch(settings.event_logs_channel_id); if (!channel || !channel.isSendable()) return; const fields: APIEmbedField[] = []; fields.push(...getMainEmbeds(loggedMessage, deletedMessage)); fields.push(...getDeletedEmbeds(loggedMessage)); const embed = new EmbedBuilder() .setTitle('Deleted Message') .setColor(0xFF0000) .setTimestamp(deletedMessage.createdTimestamp) .addFields(...fields); channel.send({ embeds: [embed] }); } function getMainEmbeds(loggedMessage: LoggedMessage, newMessage: Message): APIEmbedField[] { const channelString = `${newMessage.channel.toString()}\n${newMessage.channel.name}`; const userString = `<@${loggedMessage.author_id}>\n${loggedMessage.author_name}`; return [ { name: 'Channel', value: channelString, inline: true }, { name: 'User', value: userString, inline: true }, { name: 'Message', value: `[${newMessage.id}](${newMessage.url})`, inline: true }, ]; } function getDeletedEmbeds(loggedMessage: LoggedMessage): APIEmbedField[] { const fields: APIEmbedField[] = []; if (loggedMessage.content != '') { fields.push({ name: 'Content', value: loggedMessage.content, inline: false }); } for (const attachment of deserializeMessagePart(loggedMessage.attachments)) { fields.push({ name: 'Attachment', value: attachment, inline: true }); } for (const sticker of deserializeMessagePart(loggedMessage.stickers)) { fields.push({ name: 'Stickers', value: sticker, inline: true }); } return fields; } function getEditEmbeds(loggedMessage: LoggedMessage, newMessage: Message): APIEmbedField[] { const fields: APIEmbedField[] = []; if (loggedMessage.content != newMessage.content) { fields.push( { name: 'Before', value: loggedMessage.content, inline: false }, { name: 'After', value: newMessage.content, inline: false } ); } const { addedAttachments, removedAttachments } = getModifiedAttachments(loggedMessage, newMessage); for (const removedAttachment of removedAttachments) { fields.push({ name: 'Removed Attachment', value: removedAttachment, inline: true }); } for (const addedAttachment of addedAttachments) { fields.push({ name: 'Added Attachment', value: addedAttachment, inline: true }); } const { addedStickers, removedStickers } = getModifiedStickers(loggedMessage, newMessage); for (const removedSticker of addedStickers) { fields.push({ name: 'Removed Sticker', value: removedSticker, inline: true }); } for (const addedSticker of removedStickers) { fields.push({ name: 'Added Sticker', value: addedSticker, inline: true }); } return fields; }