package nl.voidcorp.dbot import net.dv8tion.jda.core.EmbedBuilder import net.dv8tion.jda.core.entities.* import net.dv8tion.jda.core.events.guild.member.GuildMemberNickChangeEvent import net.dv8tion.jda.core.events.message.guild.GuildMessageDeleteEvent import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent import net.dv8tion.jda.core.events.message.guild.GuildMessageUpdateEvent import net.dv8tion.jda.core.hooks.ListenerAdapter import nl.voidcorp.dbot.commands.GSM import java.awt.Color import java.time.LocalDateTime import java.time.temporal.TemporalAccessor import java.util.* object Logging : ListenerAdapter() { val map = mutableMapOf>() enum class Colors(val colorString: String) { NAMECHANGE("#00cc66"), MESSAGEDELETE("#ff3300"), MESSAGEEDIT("#ffcc66"), UNKNOWN("#000000") } override fun onGuildMessageReceived(event: GuildMessageReceivedEvent) { if (map[event.guild.idLong] == null) map[event.guild.idLong] = ArrayDeque() map[event.guild.idLong]?.apply { while (size > 100) { poll() } offer(event.message) } } fun logChannel(guild: Guild): TextChannel? { val log = GSM.getSettings(guild).logChannel return if (log != null) { guild.getTextChannelById(log) } else { null } } fun buildEmbed( affectedMember: Member?, message: String = "", color: Colors = Colors.UNKNOWN, title: String = color.name.toLowerCase().capitalize(), fields: Map = mutableMapOf(), timestamp: TemporalAccessor = LocalDateTime.now() ): MessageEmbed { val em = EmbedBuilder() .setTimestamp(timestamp) .setColor(Color.decode(color.colorString)) if (title.isNotBlank()) em.setTitle(title) if (message.isNotBlank()) em.setDescription(message) fields.forEach { name, content -> em.addField(name, content, true) } if (affectedMember != null) em.setFooter(affectedMember.user.name, affectedMember.user.effectiveAvatarUrl) return em.build() } private val nocheck = hashSetOf(260390293881356294, 144116077129891840, 131399667442384896) override fun onGuildMemberNickChange(event: GuildMemberNickChangeEvent) { val lc = logChannel(event.guild) if (event.user.idLong in nocheck) return if (lc != null) { val em = buildEmbed( event.member, fields = mutableMapOf( "Old name" to (event.prevNick ?: event.user.name), "New Name" to (event.newNick ?: event.user.name) ), color = Colors.NAMECHANGE ) lc.sendMessage(em).queue() } } override fun onGuildMessageDelete(event: GuildMessageDeleteEvent) { val lc = logChannel(event.guild) if (lc != null) { map[event.guild.idLong]?.firstOrNull { it.idLong == event.messageIdLong }.let { val em = buildEmbed( it?.member, color = Colors.MESSAGEDELETE, fields = mutableMapOf( "Message" to (it?.contentDisplay ?: "Something else (message too old...)"), "Channel" to event.channel.asMention ), timestamp = (it?.editedTime ?: it?.creationTime) ?: LocalDateTime.now() ) lc.sendMessage(em).queue() } } } override fun onGuildMessageUpdate(event: GuildMessageUpdateEvent) { val lc = logChannel(event.guild) if (lc != null) { (map[event.guild.idLong]?.firstOrNull { it.idLong == event.messageIdLong }).let { val em = buildEmbed( event.member, color = Colors.MESSAGEEDIT, fields = mutableMapOf( "Old message" to (it?.contentStripped ?: "Something else (message too old...)"), "New message" to event.message.contentStripped, "Channel" to event.channel.asMention ) ) map[event.guild.idLong]?.removeAll { old -> old.idLong == event.messageIdLong } map[event.guild.idLong]?.offer(event.message) lc.sendMessage(em).queue() } } } }