package nl.voidcorp.discord.events import net.dv8tion.jda.api.EmbedBuilder import net.dv8tion.jda.api.events.message.guild.GuildMessageDeleteEvent import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent import net.dv8tion.jda.api.events.message.guild.GuildMessageUpdateEvent import net.dv8tion.jda.api.hooks.ListenerAdapter import nl.voidcorp.discord.jda import nl.voidcorp.discord.storage.GuildRepo import nl.voidcorp.discord.storage.GuildStore import nl.voidcorp.discord.storage.MessageRepo import nl.voidcorp.discord.storage.MessageStore import java.awt.Color import java.time.Clock import java.time.LocalDateTime class LogListener(val repo: GuildRepo, val msg: MessageRepo) : ListenerAdapter() { private enum class EventType { EDIT, DELET } override fun onGuildMessageReceived(event: GuildMessageReceivedEvent) { msg.save(MessageStore(event.messageIdLong, event.message.contentRaw, event.guild.idLong, event.author.idLong)) } override fun onGuildMessageUpdate(event: GuildMessageUpdateEvent) { val past = msg.findByMsgId(event.messageIdLong) ?: MessageStore( event.messageIdLong, event.message.contentRaw, event.guild.idLong, event.author.idLong ) if (event.message.contentRaw != past.text) { past.past.add(past.text) past.text = event.message.contentRaw } msg.save(past) sendMessageModification(past, EventType.EDIT) } override fun onGuildMessageDelete(event: GuildMessageDeleteEvent) { val past = msg.findByMsgId(event.messageIdLong) ?: MessageStore( event.messageIdLong, "~~deleted~~", event.guild.idLong, -1 ) past.deleted = true msg.save(past) sendMessageModification(past, EventType.DELET) } private fun sendMessageModification(st: MessageStore, type: EventType) { val store = repo.findByGuildId(st.guildId) ?: GuildStore(st.guildId) if (store.loggingChannel != null) { val embedBuilder = EmbedBuilder().addField("Message", st.text, false) .addField("Past", st.past.joinToString("\n"), true) .addField("Sender", jda.getUserById(st.authorId)?.asTag ?: "someone#-1", true) .setTitle(type.toString()).setTimestamp(LocalDateTime.now(Clock.systemUTC())) .setColor(if (type == EventType.EDIT) Color.GREEN.brighter() else Color.RED.darker()) jda.getTextChannelById(store.loggingChannel ?: -1)?.sendMessage(embedBuilder.build())?.queue() } msg.deleteInBatch(msg.findByNowBefore(LocalDateTime.now().minusDays(2))) } }