OttoBot/src/main/kotlin/nl/voidcorp/dbot/Logging.kt

122 lines
4.4 KiB
Kotlin

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<Long, Queue<Message>>()
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<String, String> = 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()
}
}
}
}