diff --git a/build.gradle.kts b/build.gradle.kts index 28230fe..ee59819 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,8 @@ version = Versions.BOT description = "judgebot" plugins { - kotlin("jvm") version "1.5.10" + kotlin("jvm") version "1.6.0" + kotlin("plugin.serialization") version "1.6.0" id("com.github.johnrengelman.shadow") version "7.0.0" } diff --git a/src/main/kotlin/me/ddivad/judgebot/Main.kt b/src/main/kotlin/me/ddivad/judgebot/Main.kt index 35acb86..5e9c7e2 100644 --- a/src/main/kotlin/me/ddivad/judgebot/Main.kt +++ b/src/main/kotlin/me/ddivad/judgebot/Main.kt @@ -1,7 +1,6 @@ package me.ddivad.judgebot import dev.kord.common.annotation.KordPreview -import dev.kord.common.kColor import dev.kord.core.supplier.EntitySupplyStrategy import dev.kord.gateway.Intent import dev.kord.gateway.Intents @@ -11,8 +10,9 @@ import me.ddivad.judgebot.dataclasses.Permissions import me.ddivad.judgebot.services.* import me.ddivad.judgebot.services.infractions.BanService import me.ddivad.judgebot.services.infractions.MuteService -import me.jakejmattson.discordkt.api.dsl.bot -import me.jakejmattson.discordkt.api.extensions.addInlineField +import me.jakejmattson.discordkt.dsl.bot +import me.jakejmattson.discordkt.extensions.addInlineField +import me.jakejmattson.discordkt.extensions.pfpUrl import java.awt.Color @KordPreview @@ -24,8 +24,9 @@ suspend fun main() { require(token != null) { "Expected the bot token as an environment variable" } bot(token) { + val configuration = data("config/config.json") { Configuration() } + prefix { - val configuration = discord.getInjectionObjects(Configuration::class) guild?.let { configuration[guild!!.id.value]?.prefix } ?: defaultPrefix } @@ -49,11 +50,9 @@ suspend fun main() { val botStats = it.discord.getInjectionObjects(BotStatsService::class) val channel = it.channel val self = channel.kord.getSelf() - - color = it.discord.configuration.theme?.kColor - + color = it.discord.configuration.theme thumbnail { - url = self.avatar.url + url = self.pfpUrl } field { @@ -70,7 +69,7 @@ suspend fun main() { field { name = "Build Info" value = "```" + - "Version: 2.6.0\n" + + "Version: 2.7.0\n" + "DiscordKt: ${versions.library}\n" + "Kord: ${versions.kord}\n" + "Kotlin: $kotlinVersion" + diff --git a/src/main/kotlin/me/ddivad/judgebot/arguments/GuildConfigArg.kt b/src/main/kotlin/me/ddivad/judgebot/arguments/GuildConfigArg.kt index 162d53b..05bcf59 100644 --- a/src/main/kotlin/me/ddivad/judgebot/arguments/GuildConfigArg.kt +++ b/src/main/kotlin/me/ddivad/judgebot/arguments/GuildConfigArg.kt @@ -1,7 +1,7 @@ package me.ddivad.judgebot.arguments -import me.jakejmattson.discordkt.api.arguments.* -import me.jakejmattson.discordkt.api.commands.CommandEvent +import me.jakejmattson.discordkt.arguments.* +import me.jakejmattson.discordkt.commands.CommandEvent val validConfigParameters = mutableListOf( "setPrefix", diff --git a/src/main/kotlin/me/ddivad/judgebot/arguments/LowerMemberArg.kt b/src/main/kotlin/me/ddivad/judgebot/arguments/LowerMemberArg.kt index 6fafc3f..84ab0a7 100644 --- a/src/main/kotlin/me/ddivad/judgebot/arguments/LowerMemberArg.kt +++ b/src/main/kotlin/me/ddivad/judgebot/arguments/LowerMemberArg.kt @@ -1,10 +1,10 @@ package me.ddivad.judgebot.arguments import dev.kord.core.entity.Member -import me.jakejmattson.discordkt.api.arguments.* -import me.jakejmattson.discordkt.api.commands.CommandEvent -import me.jakejmattson.discordkt.api.extensions.isSelf -import me.jakejmattson.discordkt.api.extensions.toSnowflakeOrNull +import me.jakejmattson.discordkt.arguments.* +import me.jakejmattson.discordkt.commands.CommandEvent +import me.jakejmattson.discordkt.extensions.isSelf +import me.jakejmattson.discordkt.extensions.toSnowflakeOrNull open class LowerMemberArg(override val name: String = "LowerMemberArg") : Argument { companion object : LowerMemberArg() diff --git a/src/main/kotlin/me/ddivad/judgebot/arguments/LowerUserArg.kt b/src/main/kotlin/me/ddivad/judgebot/arguments/LowerUserArg.kt index 8a599bd..c96d99b 100644 --- a/src/main/kotlin/me/ddivad/judgebot/arguments/LowerUserArg.kt +++ b/src/main/kotlin/me/ddivad/judgebot/arguments/LowerUserArg.kt @@ -1,10 +1,10 @@ package me.ddivad.judgebot.arguments import dev.kord.core.entity.User -import me.jakejmattson.discordkt.api.arguments.* -import me.jakejmattson.discordkt.api.commands.CommandEvent -import me.jakejmattson.discordkt.api.extensions.isSelf -import me.jakejmattson.discordkt.api.extensions.toSnowflakeOrNull +import me.jakejmattson.discordkt.arguments.* +import me.jakejmattson.discordkt.commands.CommandEvent +import me.jakejmattson.discordkt.extensions.isSelf +import me.jakejmattson.discordkt.extensions.toSnowflakeOrNull open class LowerUserArg(override val name: String = "LowerUserArg") : Argument { companion object : LowerUserArg() diff --git a/src/main/kotlin/me/ddivad/judgebot/arguments/RuleArg.kt b/src/main/kotlin/me/ddivad/judgebot/arguments/RuleArg.kt index 54ccf1a..107c136 100644 --- a/src/main/kotlin/me/ddivad/judgebot/arguments/RuleArg.kt +++ b/src/main/kotlin/me/ddivad/judgebot/arguments/RuleArg.kt @@ -3,8 +3,8 @@ package me.ddivad.judgebot.arguments import dev.kord.core.entity.Guild import me.ddivad.judgebot.dataclasses.Rule import me.ddivad.judgebot.services.DatabaseService -import me.jakejmattson.discordkt.api.arguments.* -import me.jakejmattson.discordkt.api.commands.CommandEvent +import me.jakejmattson.discordkt.arguments.* +import me.jakejmattson.discordkt.commands.CommandEvent open class RuleArg(override val name: String = "Rule") : Argument { override val description = "A rule number" diff --git a/src/main/kotlin/me/ddivad/judgebot/commands/GuildCommands.kt b/src/main/kotlin/me/ddivad/judgebot/commands/GuildCommands.kt index 9318621..8988a75 100644 --- a/src/main/kotlin/me/ddivad/judgebot/commands/GuildCommands.kt +++ b/src/main/kotlin/me/ddivad/judgebot/commands/GuildCommands.kt @@ -8,13 +8,13 @@ import me.ddivad.judgebot.dataclasses.Permissions import me.ddivad.judgebot.embeds.createActivePunishmentsEmbed import me.ddivad.judgebot.services.DatabaseService import me.ddivad.judgebot.services.infractions.MuteService -import me.jakejmattson.discordkt.api.commands.commands +import me.jakejmattson.discordkt.commands.commands @Suppress("unused") fun guildConfigCommands(configuration: Configuration, databaseService: DatabaseService, muteService: MuteService) = commands("Guild") { - guildCommand("setup") { + command("setup") { description = "Configure a guild to use Judgebot." requiredPermission = Permissions.ADMINISTRATOR execute { @@ -30,7 +30,7 @@ fun guildConfigCommands(configuration: Configuration, } } - guildCommand("configuration") { + command("configuration") { description = "Update configuration parameters for this guild (conversation)." requiredPermission = Permissions.STAFF execute(GuildConfigArg.optional("options")) { @@ -44,7 +44,7 @@ fun guildConfigCommands(configuration: Configuration, } } - guildCommand("activePunishments") { + command("activePunishments") { description = "View active punishments for a guild." requiredPermission = Permissions.STAFF execute { diff --git a/src/main/kotlin/me/ddivad/judgebot/commands/InfoCommands.kt b/src/main/kotlin/me/ddivad/judgebot/commands/InfoCommands.kt index 05d8979..dea0ed1 100644 --- a/src/main/kotlin/me/ddivad/judgebot/commands/InfoCommands.kt +++ b/src/main/kotlin/me/ddivad/judgebot/commands/InfoCommands.kt @@ -9,14 +9,14 @@ import me.ddivad.judgebot.dataclasses.Permissions import me.ddivad.judgebot.embeds.createInformationEmbed import me.ddivad.judgebot.extensions.testDmStatus import me.ddivad.judgebot.services.DatabaseService -import me.jakejmattson.discordkt.api.arguments.EveryArg -import me.jakejmattson.discordkt.api.arguments.IntegerArg -import me.jakejmattson.discordkt.api.commands.commands -import me.jakejmattson.discordkt.api.extensions.sendPrivateMessage +import me.jakejmattson.discordkt.arguments.EveryArg +import me.jakejmattson.discordkt.arguments.IntegerArg +import me.jakejmattson.discordkt.commands.commands +import me.jakejmattson.discordkt.extensions.sendPrivateMessage @Suppress("unused") fun createInformationCommands(databaseService: DatabaseService) = commands("Information") { - guildCommand("info") { + command("info") { description = "Send an information message to a guild member" requiredPermission = Permissions.MODERATOR execute(LowerMemberArg, EveryArg("Info Content")) { @@ -30,7 +30,7 @@ fun createInformationCommands(databaseService: DatabaseService) = commands("Info return@execute } val user = databaseService.users.getOrCreateUser(target, guild) - val information = Info(content, author.id.asString) + val information = Info(content, author.id.toString()) databaseService.users.addInfo(guild, user, information) target.sendPrivateMessage { createInformationEmbed(guild, target, information) @@ -39,13 +39,13 @@ fun createInformationCommands(databaseService: DatabaseService) = commands("Info } } - guildCommand("removeInfo") { + command("removeInfo") { description = "Remove an information message from a member record." requiredPermission = Permissions.STAFF execute(LowerMemberArg, IntegerArg("Info ID")) { val (target, id) = args val user = databaseService.users.getOrCreateUser(target, guild) - if (user.getGuildInfo(guild.id.asString).info.isEmpty()) { + if (user.getGuildInfo(guild.id.toString()).info.isEmpty()) { respond("${target.mention} has no information records.") return@execute } diff --git a/src/main/kotlin/me/ddivad/judgebot/commands/InfractionCommands.kt b/src/main/kotlin/me/ddivad/judgebot/commands/InfractionCommands.kt index 000b5ca..4277a5f 100644 --- a/src/main/kotlin/me/ddivad/judgebot/commands/InfractionCommands.kt +++ b/src/main/kotlin/me/ddivad/judgebot/commands/InfractionCommands.kt @@ -17,11 +17,11 @@ import me.ddivad.judgebot.services.* import me.ddivad.judgebot.services.infractions.BadPfpService import me.ddivad.judgebot.services.infractions.BadnameService import me.ddivad.judgebot.services.infractions.InfractionService -import me.jakejmattson.discordkt.api.arguments.BooleanArg -import me.jakejmattson.discordkt.api.arguments.EveryArg -import me.jakejmattson.discordkt.api.arguments.IntegerArg -import me.jakejmattson.discordkt.api.commands.commands -import me.jakejmattson.discordkt.api.conversations.ConversationResult +import me.jakejmattson.discordkt.arguments.BooleanArg +import me.jakejmattson.discordkt.arguments.EveryArg +import me.jakejmattson.discordkt.arguments.IntegerArg +import me.jakejmattson.discordkt.commands.commands +import me.jakejmattson.discordkt.conversations.ConversationResult @KordPreview @Suppress("unused") @@ -30,7 +30,7 @@ fun createInfractionCommands(databaseService: DatabaseService, infractionService: InfractionService, badPfpService: BadPfpService, badnameService: BadnameService) = commands("Infraction") { - guildCommand("strike", "s", "S") { + command("strike", "s", "S") { description = "Strike a user." requiredPermission = Permissions.STAFF execute(LowerMemberArg, IntegerArg("Weight").optional(1), EveryArg("Reason")) { @@ -59,7 +59,7 @@ fun createInfractionCommands(databaseService: DatabaseService, } } - guildCommand("warn", "w", "W") { + command("warn", "w", "W") { description = "Warn a user." requiredPermission = Permissions.MODERATOR execute(LowerMemberArg, EveryArg("Reason")) { @@ -77,7 +77,7 @@ fun createInfractionCommands(databaseService: DatabaseService, } } - guildCommand("badpfp") { + command("badpfp") { description = "Notifies the user that they should change their profile pic and applies a 30 minute mute. Bans the user if they don't change picture." requiredPermission = Permissions.STAFF execute(BooleanArg("cancel", "apply", "cancel").optional(true), LowerMemberArg) { @@ -102,13 +102,13 @@ fun createInfractionCommands(databaseService: DatabaseService, return@execute } - val badPfp = Infraction(author.id.asString, "BadPfp", InfractionType.BadPfp) + val badPfp = Infraction(author.id.toString(), "BadPfp", InfractionType.BadPfp) badPfpService.applyBadPfp(targetMember, guild, timeLimit) respond("${targetMember.mention} has been muted and a badpfp has been triggered with a time limit of $minutesUntilBan minutes.") } } - guildCommand("badname") { + command("badname") { description = "Rename a guild member that has a bad name." requiredPermission = Permissions.MODERATOR execute(LowerMemberArg) { @@ -117,12 +117,12 @@ fun createInfractionCommands(databaseService: DatabaseService, } } - guildCommand("cleanseInfractions") { + command("cleanseInfractions") { description = "Use this to delete (permanently) as user's infractions." requiredPermission = Permissions.ADMINISTRATOR execute(LowerUserArg) { val user = databaseService.users.getOrCreateUser(args.first, guild) - if (user.getGuildInfo(guild.id.asString).infractions.isEmpty()) { + if (user.getGuildInfo(guild.id.toString()).infractions.isEmpty()) { respond("User has no infractions.") return@execute } @@ -131,12 +131,12 @@ fun createInfractionCommands(databaseService: DatabaseService, } } - guildCommand("removeInfraction") { + command("removeInfraction") { description = "Use this to delete (permanently) an infraction from a user." requiredPermission = Permissions.ADMINISTRATOR execute(LowerUserArg, IntegerArg("Infraction ID")) { val user = databaseService.users.getOrCreateUser(args.first, guild) - if (user.getGuildInfo(guild.id.asString).infractions.isEmpty()) { + if (user.getGuildInfo(guild.id.toString()).infractions.isEmpty()) { respond("User has no infractions.") return@execute } diff --git a/src/main/kotlin/me/ddivad/judgebot/commands/MuteCommands.kt b/src/main/kotlin/me/ddivad/judgebot/commands/MuteCommands.kt index 0e34742..699f202 100644 --- a/src/main/kotlin/me/ddivad/judgebot/commands/MuteCommands.kt +++ b/src/main/kotlin/me/ddivad/judgebot/commands/MuteCommands.kt @@ -9,15 +9,15 @@ import me.ddivad.judgebot.extensions.testDmStatus import me.ddivad.judgebot.services.infractions.MuteService import me.ddivad.judgebot.services.infractions.RoleState import me.ddivad.judgebot.util.timeToString -import me.jakejmattson.discordkt.api.arguments.EveryArg -import me.jakejmattson.discordkt.api.arguments.TimeArg -import me.jakejmattson.discordkt.api.arguments.UserArg -import me.jakejmattson.discordkt.api.commands.commands +import me.jakejmattson.discordkt.arguments.EveryArg +import me.jakejmattson.discordkt.arguments.TimeArg +import me.jakejmattson.discordkt.arguments.UserArg +import me.jakejmattson.discordkt.commands.commands import kotlin.math.roundToLong @Suppress("unused") fun createMuteCommands(muteService: MuteService) = commands("Mute") { - guildCommand("mute") { + command("mute") { description = "Mute a user for a specified time." requiredPermission = Permissions.MODERATOR execute(LowerMemberArg, TimeArg("Time"), EveryArg("Reason")) { @@ -34,7 +34,7 @@ fun createMuteCommands(muteService: MuteService) = commands("Mute") { } } - guildCommand("unmute") { + command("unmute") { description = "Unmute a user." requiredPermission = Permissions.MODERATOR execute(LowerMemberArg) { @@ -49,7 +49,7 @@ fun createMuteCommands(muteService: MuteService) = commands("Mute") { } } - guildCommand("gag") { + command("gag") { description = "Mute a user for 5 minutes while you deal with something" requiredPermission = Permissions.MODERATOR execute(LowerMemberArg) { diff --git a/src/main/kotlin/me/ddivad/judgebot/commands/NoteCommands.kt b/src/main/kotlin/me/ddivad/judgebot/commands/NoteCommands.kt index 9e4c36d..63dc5a0 100644 --- a/src/main/kotlin/me/ddivad/judgebot/commands/NoteCommands.kt +++ b/src/main/kotlin/me/ddivad/judgebot/commands/NoteCommands.kt @@ -3,46 +3,46 @@ package me.ddivad.judgebot.commands import me.ddivad.judgebot.arguments.LowerMemberArg import me.ddivad.judgebot.dataclasses.Permissions import me.ddivad.judgebot.services.DatabaseService -import me.jakejmattson.discordkt.api.arguments.EveryArg -import me.jakejmattson.discordkt.api.arguments.IntegerArg -import me.jakejmattson.discordkt.api.arguments.UserArg -import me.jakejmattson.discordkt.api.commands.commands +import me.jakejmattson.discordkt.arguments.EveryArg +import me.jakejmattson.discordkt.arguments.IntegerArg +import me.jakejmattson.discordkt.arguments.UserArg +import me.jakejmattson.discordkt.commands.commands @Suppress("unused") fun noteCommands(databaseService: DatabaseService) = commands("Note") { - guildCommand("note") { + command("note") { description = "Use this to add a note to a user." requiredPermission = Permissions.MODERATOR execute(UserArg, EveryArg("Note Content")) { val (target, note) = args val user = databaseService.users.getOrCreateUser(target, guild) - databaseService.users.addNote(guild, user, note, author.id.asString) + databaseService.users.addNote(guild, user, note, author.id.toString()) respond("Note added to ${target.mention}.") } } - guildCommand("editNote") { + command("editNote") { description = "Use this to edit a note." requiredPermission = Permissions.MODERATOR execute(UserArg, IntegerArg("Note to edit"), EveryArg("Note Content")) { val (target, noteId, note) = args val user = databaseService.users.getOrCreateUser(target, guild) - if (user.getGuildInfo(guild.id.asString).notes.none{ it.id == noteId }) { + if (user.getGuildInfo(guild.id.toString()).notes.none{ it.id == noteId }) { respond("User has no note with ID $noteId.") return@execute } - databaseService.users.editNote(guild, user, noteId, note, author.id.asString) + databaseService.users.editNote(guild, user, noteId, note, author.id.toString()) respond("Note edited.") } } - guildCommand("deleteNote") { + command("deleteNote") { description = "Use this to add a delete a note from a user." requiredPermission = Permissions.STAFF execute(LowerMemberArg, IntegerArg("Note ID")) { val (target, noteId) = args val user = databaseService.users.getOrCreateUser(target, guild) - if (user.getGuildInfo(guild.id.asString).notes.isEmpty()) { + if (user.getGuildInfo(guild.id.toString()).notes.isEmpty()) { respond("User has no notes.") return@execute } @@ -51,13 +51,13 @@ fun noteCommands(databaseService: DatabaseService) = commands("Note") { } } - guildCommand("cleanseNotes") { + command("cleanseNotes") { description = "Use this to delete (permanently) as user's notes." requiredPermission = Permissions.ADMINISTRATOR execute(LowerMemberArg) { val target = args.first val user = databaseService.users.getOrCreateUser(target, guild) - if (user.getGuildInfo(guild.id.asString).notes.isEmpty()) { + if (user.getGuildInfo(guild.id.toString()).notes.isEmpty()) { respond("User has no notes.") return@execute } diff --git a/src/main/kotlin/me/ddivad/judgebot/commands/RuleCommands.kt b/src/main/kotlin/me/ddivad/judgebot/commands/RuleCommands.kt index 08883e1..aafb0ff 100644 --- a/src/main/kotlin/me/ddivad/judgebot/commands/RuleCommands.kt +++ b/src/main/kotlin/me/ddivad/judgebot/commands/RuleCommands.kt @@ -11,14 +11,14 @@ import me.ddivad.judgebot.embeds.createRuleEmbed import me.ddivad.judgebot.embeds.createRulesEmbed import me.ddivad.judgebot.embeds.createRulesEmbedDetailed import me.ddivad.judgebot.services.DatabaseService -import me.jakejmattson.discordkt.api.arguments.MessageArg -import me.jakejmattson.discordkt.api.commands.commands -import me.jakejmattson.discordkt.api.extensions.jumpLink +import me.jakejmattson.discordkt.arguments.MessageArg +import me.jakejmattson.discordkt.commands.commands +import me.jakejmattson.discordkt.extensions.jumpLink @Suppress("unused") fun ruleCommands(databaseService: DatabaseService) = commands("Rule") { - guildCommand("addRule") { + command("addRule") { description = "Add a rule to this guild." requiredPermission = Permissions.ADMINISTRATOR execute { @@ -28,7 +28,7 @@ fun ruleCommands(databaseService: DatabaseService) = commands("Rule") { } } - guildCommand("editRule") { + command("editRule") { description = "Edit a rule in this guild." requiredPermission = Permissions.ADMINISTRATOR execute { @@ -38,7 +38,7 @@ fun ruleCommands(databaseService: DatabaseService) = commands("Rule") { } } - guildCommand("archiveRule") { + command("archiveRule") { description = "Archive a rule in this guild." requiredPermission = Permissions.ADMINISTRATOR execute { @@ -48,7 +48,7 @@ fun ruleCommands(databaseService: DatabaseService) = commands("Rule") { } } - guildCommand("rules") { + command("rules") { description = "List the rules of this guild. Pass a message ID to edit existing rules embed." requiredPermission = Permissions.NONE execute(MessageArg.optionalNullable(null)) { @@ -64,7 +64,7 @@ fun ruleCommands(databaseService: DatabaseService) = commands("Rule") { } } - guildCommand("longRules") { + command("longRules") { description = "List the rules (with descriptions) of this guild. Pass a message ID to edit existing rules embed." requiredPermission = Permissions.STAFF execute(MessageArg.optionalNullable(null)) { @@ -80,7 +80,7 @@ fun ruleCommands(databaseService: DatabaseService) = commands("Rule") { } } - guildCommand("rule") { + command("rule") { description = "List a rule from this guild." requiredPermission = Permissions.NONE execute(RuleArg) { diff --git a/src/main/kotlin/me/ddivad/judgebot/commands/UserCommands.kt b/src/main/kotlin/me/ddivad/judgebot/commands/UserCommands.kt index e8a13e8..248a054 100644 --- a/src/main/kotlin/me/ddivad/judgebot/commands/UserCommands.kt +++ b/src/main/kotlin/me/ddivad/judgebot/commands/UserCommands.kt @@ -14,10 +14,11 @@ import me.ddivad.judgebot.embeds.createSelfHistoryEmbed import me.ddivad.judgebot.services.DatabaseService import me.ddivad.judgebot.services.LoggingService import me.ddivad.judgebot.services.infractions.BanService -import me.jakejmattson.discordkt.api.arguments.* -import me.jakejmattson.discordkt.api.commands.commands -import me.jakejmattson.discordkt.api.extensions.mutualGuilds -import me.jakejmattson.discordkt.api.extensions.sendPrivateMessage +import me.jakejmattson.discordkt.arguments.* +import me.jakejmattson.discordkt.commands.commands +import me.jakejmattson.discordkt.extensions.mutualGuilds +import me.jakejmattson.discordkt.extensions.pfpUrl +import me.jakejmattson.discordkt.extensions.sendPrivateMessage import java.awt.Color @Suppress("unused") @@ -27,7 +28,7 @@ fun createUserCommands( loggingService: LoggingService, banService: BanService ) = commands("User") { - guildCommand("history", "h", "H") { + command("history", "h", "H") { description = "Use this to view a user's record." requiredPermission = Permissions.MODERATOR execute(UserArg) { @@ -39,7 +40,7 @@ fun createUserCommands( } } - guildCommand("alts") { + command("alts") { description = "Use this to view a user's alt accounts." requiredPermission = Permissions.MODERATOR execute(UserArg) { @@ -59,22 +60,22 @@ fun createUserCommands( } } - guildCommand("whatpfp") { + command("whatpfp") { description = "Perform a reverse image search of a User's profile picture" requiredPermission = Permissions.MODERATOR execute(UserArg) { val user = args.first - val reverseSearchUrl = "" + val reverseSearchUrl = "" respond { title = "${user.tag}'s pfp" color = Color.MAGENTA.kColor description = "[Reverse Search]($reverseSearchUrl)" - image = "${user.avatar.url}?size=512" + image = "${user.pfpUrl}?size=512" } } } - guildCommand("ban") { + command("ban") { description = "Ban a member from this guild." requiredPermission = Permissions.STAFF execute(LowerUserArg, IntegerArg("Delete message days").optional(0), EveryArg) { @@ -83,7 +84,7 @@ fun createUserCommands( respond("Delete days cannot be more than **7**. You tried with **${deleteDays}**") return@execute } - val ban = Punishment(target.id.asString, InfractionType.Ban, reason, author.id.asString) + val ban = Punishment(target.id.toString(), InfractionType.Ban, reason, author.id.toString()) banService.banUser(target, guild, ban, deleteDays).also { loggingService.userBanned(guild, target, ban) respond("User ${target.mention} banned") @@ -91,7 +92,7 @@ fun createUserCommands( } } - guildCommand("unban") { + command("unban") { description = "Unban a banned member from this guild." requiredPermission = Permissions.STAFF execute(UserArg) { @@ -105,17 +106,17 @@ fun createUserCommands( } } - guildCommand("setBanReason") { + command("setBanReason") { description = "Set a ban reason for a banned user" requiredPermission = Permissions.STAFF execute(UserArg, EveryArg("Reason")) { val (user, reason) = args - val ban = Ban(user.id.asString, author.id.asString, reason) + val ban = Ban(user.id.toString(), author.id.toString(), reason) if (guild.getBanOrNull(user.id) != null) { - if (!databaseService.guilds.checkBanExists(guild, user.id.asString)) { + if (!databaseService.guilds.checkBanExists(guild, user.id.toString())) { databaseService.guilds.addBan(guild, ban) } else { - databaseService.guilds.editBanReason(guild, user.id.asString, reason) + databaseService.guilds.editBanReason(guild, user.id.toString(), reason) } respond("Ban reason for ${user.username} set to: $reason") } else respond("User ${user.username} isn't banned") @@ -123,13 +124,13 @@ fun createUserCommands( } } - guildCommand("getBanReason") { + command("getBanReason") { description = "Get a ban reason for a banned user" requiredPermission = Permissions.STAFF execute(UserArg) { val user = args.first guild.getBanOrNull(user.id)?.let { - val reason = databaseService.guilds.getBanOrNull(guild, user.id.asString)?.reason ?: it.reason + val reason = databaseService.guilds.getBanOrNull(guild, user.id.toString())?.reason ?: it.reason respond(reason ?: "No reason logged") return@execute } @@ -158,33 +159,33 @@ fun createUserCommands( } } - guildCommand("link") { + command("link") { description = "Link a user's alt account with their main" requiredPermission = Permissions.STAFF execute(UserArg("Main Account"), UserArg("Alt Account")) { val (main, alt) = args val mainRecord = databaseService.users.getOrCreateUser(main, guild) val altRecord = databaseService.users.getOrCreateUser(alt, guild) - databaseService.users.addLinkedAccount(guild, mainRecord, alt.id.asString) - databaseService.users.addLinkedAccount(guild, altRecord, main.id.asString) + databaseService.users.addLinkedAccount(guild, mainRecord, alt.id.toString()) + databaseService.users.addLinkedAccount(guild, altRecord, main.id.toString()) respond("Linked accounts ${main.mention} and ${alt.mention}") } } - guildCommand("unlink") { + command("unlink") { description = "Link a user's alt account with their main" requiredPermission = Permissions.STAFF execute(UserArg("Main Account"), UserArg("Alt Account")) { val (main, alt) = args val mainRecord = databaseService.users.getOrCreateUser(main, guild) val altRecord = databaseService.users.getOrCreateUser(alt, guild) - databaseService.users.removeLinkedAccount(guild, mainRecord, alt.id.asString) - databaseService.users.removeLinkedAccount(guild, altRecord, main.id.asString) + databaseService.users.removeLinkedAccount(guild, mainRecord, alt.id.toString()) + databaseService.users.removeLinkedAccount(guild, altRecord, main.id.toString()) respond("Unlinked accounts ${main.mention} and ${alt.mention}") } } - guildCommand("reset") { + command("reset") { description = "Reset a user's record, and any linked accounts" requiredPermission = Permissions.STAFF execute(LowerUserArg) { diff --git a/src/main/kotlin/me/ddivad/judgebot/commands/UtilityCommands.kt b/src/main/kotlin/me/ddivad/judgebot/commands/UtilityCommands.kt index 748f151..23082b5 100644 --- a/src/main/kotlin/me/ddivad/judgebot/commands/UtilityCommands.kt +++ b/src/main/kotlin/me/ddivad/judgebot/commands/UtilityCommands.kt @@ -8,10 +8,10 @@ import me.ddivad.judgebot.dataclasses.Configuration import me.ddivad.judgebot.dataclasses.Permissions import me.ddivad.judgebot.services.HelpService import me.ddivad.judgebot.util.createFlagMessage -import me.jakejmattson.discordkt.api.arguments.AnyArg -import me.jakejmattson.discordkt.api.arguments.MessageArg -import me.jakejmattson.discordkt.api.commands.commands -import me.jakejmattson.discordkt.api.extensions.toSnowflake +import me.jakejmattson.discordkt.arguments.AnyArg +import me.jakejmattson.discordkt.arguments.MessageArg +import me.jakejmattson.discordkt.commands.commands +import me.jakejmattson.discordkt.extensions.toSnowflake @Suppress("unused") fun createInformationCommands(helpService: HelpService, configuration: Configuration) = commands("Utility") { diff --git a/src/main/kotlin/me/ddivad/judgebot/conversations/GuildChoiceConversation.kt b/src/main/kotlin/me/ddivad/judgebot/conversations/GuildChoiceConversation.kt index 47220ee..800decd 100644 --- a/src/main/kotlin/me/ddivad/judgebot/conversations/GuildChoiceConversation.kt +++ b/src/main/kotlin/me/ddivad/judgebot/conversations/GuildChoiceConversation.kt @@ -5,7 +5,8 @@ import dev.kord.core.entity.Guild import me.ddivad.judgebot.dataclasses.Configuration import me.ddivad.judgebot.embeds.createSelfHistoryEmbed import me.ddivad.judgebot.services.DatabaseService -import me.jakejmattson.discordkt.api.conversations.conversation +import me.jakejmattson.discordkt.conversations.conversation +import me.jakejmattson.discordkt.extensions.pfpUrl import java.awt.Color fun guildChoiceConversation( @@ -19,7 +20,7 @@ fun guildChoiceConversation( title = "Select Server" description = "Select the server you want to view the history for." thumbnail { - url = discord.kord.getSelf().avatar.url + url = discord.kord.getSelf().pfpUrl } } diff --git a/src/main/kotlin/me/ddivad/judgebot/conversations/InfractionConversation.kt b/src/main/kotlin/me/ddivad/judgebot/conversations/InfractionConversation.kt index 0afbf21..0f3b360 100644 --- a/src/main/kotlin/me/ddivad/judgebot/conversations/InfractionConversation.kt +++ b/src/main/kotlin/me/ddivad/judgebot/conversations/InfractionConversation.kt @@ -9,7 +9,7 @@ import me.ddivad.judgebot.embeds.createHistoryEmbed import me.ddivad.judgebot.embeds.createInfractionRuleEmbed import me.ddivad.judgebot.services.DatabaseService import me.ddivad.judgebot.services.infractions.InfractionService -import me.jakejmattson.discordkt.api.conversations.conversation +import me.jakejmattson.discordkt.conversations.conversation @KordPreview class InfractionConversation( @@ -50,7 +50,7 @@ class InfractionConversation( if (rule > 0) rule else null } else null - val infraction = Infraction(this.user.id.asString, infractionReason, type, points, ruleId) + val infraction = Infraction(this.user.id.toString(), infractionReason, type, points, ruleId) infractionService.infract(targetUser, guild, user, infraction) respondMenu { createHistoryEmbed(targetUser, user, guild, configuration, databaseService) } } diff --git a/src/main/kotlin/me/ddivad/judgebot/conversations/ResetUserConversation.kt b/src/main/kotlin/me/ddivad/judgebot/conversations/ResetUserConversation.kt index f6033ed..f7c9340 100644 --- a/src/main/kotlin/me/ddivad/judgebot/conversations/ResetUserConversation.kt +++ b/src/main/kotlin/me/ddivad/judgebot/conversations/ResetUserConversation.kt @@ -8,8 +8,9 @@ import dev.kord.x.emoji.Emojis import me.ddivad.judgebot.dataclasses.Configuration import me.ddivad.judgebot.embeds.createHistoryEmbed import me.ddivad.judgebot.services.DatabaseService -import me.jakejmattson.discordkt.api.conversations.conversation -import me.jakejmattson.discordkt.api.extensions.toSnowflake +import me.jakejmattson.discordkt.conversations.conversation +import me.jakejmattson.discordkt.extensions.pfpUrl +import me.jakejmattson.discordkt.extensions.toSnowflake import java.awt.Color class ResetUserConversation(private val databaseService: DatabaseService, private val configuration: Configuration) { @@ -25,7 +26,7 @@ class ResetUserConversation(private val databaseService: DatabaseService, privat title = "Reset linked accounts" color = Color.MAGENTA.kColor thumbnail { - url = target.asUser().avatar.url + url = target.asUser().pfpUrl } description = """ ${target.mention} has linked accounts ${linkedUsers.joinToString { "${it?.mention}" }} diff --git a/src/main/kotlin/me/ddivad/judgebot/conversations/guild/EditConfigConversation.kt b/src/main/kotlin/me/ddivad/judgebot/conversations/guild/EditConfigConversation.kt index 49940ce..d243d14 100644 --- a/src/main/kotlin/me/ddivad/judgebot/conversations/guild/EditConfigConversation.kt +++ b/src/main/kotlin/me/ddivad/judgebot/conversations/guild/EditConfigConversation.kt @@ -5,9 +5,9 @@ import dev.kord.core.entity.channel.TextChannel import me.ddivad.judgebot.dataclasses.Configuration import me.ddivad.judgebot.embeds.createConfigEmbed import me.ddivad.judgebot.embeds.createConfigOptionsEmbed -import me.jakejmattson.discordkt.api.arguments.* -import me.jakejmattson.discordkt.api.conversations.conversation -import me.jakejmattson.discordkt.api.extensions.toSnowflake +import me.jakejmattson.discordkt.arguments.* +import me.jakejmattson.discordkt.conversations.conversation +import me.jakejmattson.discordkt.extensions.toSnowflake class EditConfigConversation(private val configuration: Configuration) { fun createEditConfigurationConversation(guild: Guild, parameter: String) = conversation("cancel") { @@ -15,17 +15,17 @@ class EditConfigConversation(private val configuration: Configuration) { when (parameter) { "addadminrole" -> { val role = prompt(RoleArg, "Enter Admin role:") - guildConfiguration.adminRoles.add(role.id.asString) + guildConfiguration.adminRoles.add(role.id.toString()) respond("Added **${role.name}** to Admin roles.") } "addstaffrole" -> { val role = prompt(RoleArg, "Enter Staff role:") - guildConfiguration.staffRoles.add(role.id.asString) + guildConfiguration.staffRoles.add(role.id.toString()) respond("Added **${role.name}** to Staff roles.") } "addmoderatorrole" -> { val role = prompt(RoleArg, "Enter Moderator role:") - guildConfiguration.moderatorRoles.add(role.id.asString) + guildConfiguration.moderatorRoles.add(role.id.toString()) respond("Added **${role.name}** to moderator roles.") } "removeadminrole" -> { @@ -34,8 +34,8 @@ class EditConfigConversation(private val configuration: Configuration) { RoleArg, "Enter role to remove:", "Role not in Admin role list.", - isValid = {role -> guildConfiguration.adminRoles.contains(role.id.asString) }) - guildConfiguration.adminRoles.removeIf {it == role.id.asString} + isValid = {role -> guildConfiguration.adminRoles.contains(role.id.toString()) }) + guildConfiguration.adminRoles.removeIf {it == role.id.toString()} respond("Removed **${role.name}** from Admin roles.") } "removestaffrole" -> { @@ -44,8 +44,8 @@ class EditConfigConversation(private val configuration: Configuration) { RoleArg, "Enter role to remove:", "Role not in Staff role list.", - isValid = {role -> guildConfiguration.staffRoles.contains(role.id.asString) }) - guildConfiguration.staffRoles.removeIf {it == role.id.asString} + isValid = {role -> guildConfiguration.staffRoles.contains(role.id.toString()) }) + guildConfiguration.staffRoles.removeIf {it == role.id.toString()} respond("Removed **${role.name}** from Staff roles.") } "removemoderatorrole" -> { @@ -54,23 +54,23 @@ class EditConfigConversation(private val configuration: Configuration) { RoleArg, "Enter role to remove:", "Role not in Moderator role list.", - isValid = {role -> guildConfiguration.moderatorRoles.contains(role.id.asString) }) - guildConfiguration.moderatorRoles.removeIf {it == role.id.asString} + isValid = {role -> guildConfiguration.moderatorRoles.contains(role.id.toString()) }) + guildConfiguration.moderatorRoles.removeIf {it == role.id.toString()} respond("Removed **${role.name}** from Moderator roles.") } "setmutedrole" -> { val mutedRole = prompt(RoleArg, "Enter Mute role:") - guildConfiguration.mutedRole = mutedRole.id.asString + guildConfiguration.mutedRole = mutedRole.id.toString() respond("Muted role set to **${mutedRole.name}**.") } "setlogchannel" -> { val logChannel = prompt(ChannelArg(), "Enter Logging channel:") - guildConfiguration.loggingConfiguration.loggingChannel = logChannel.id.asString + guildConfiguration.loggingConfiguration.loggingChannel = logChannel.id.toString() respond("Log channel set to ${logChannel.mention}") } "setalertchannel" -> { val alertChannel = prompt(ChannelArg(), "Enter Logging channel:") - guildConfiguration.loggingConfiguration.alertChannel = alertChannel.id.asString + guildConfiguration.loggingConfiguration.alertChannel = alertChannel.id.toString() respond("Alert channel set to ${alertChannel.mention}") } "setprefix" -> { diff --git a/src/main/kotlin/me/ddivad/judgebot/conversations/guild/GuildConfigConversation.kt b/src/main/kotlin/me/ddivad/judgebot/conversations/guild/GuildConfigConversation.kt index 1e0a750..7a5b51d 100644 --- a/src/main/kotlin/me/ddivad/judgebot/conversations/guild/GuildConfigConversation.kt +++ b/src/main/kotlin/me/ddivad/judgebot/conversations/guild/GuildConfigConversation.kt @@ -4,10 +4,10 @@ import dev.kord.core.entity.Guild import me.ddivad.judgebot.dataclasses.Configuration import me.ddivad.judgebot.dataclasses.LoggingConfiguration import me.ddivad.judgebot.services.infractions.MuteService -import me.jakejmattson.discordkt.api.arguments.ChannelArg -import me.jakejmattson.discordkt.api.arguments.EveryArg -import me.jakejmattson.discordkt.api.arguments.RoleArg -import me.jakejmattson.discordkt.api.conversations.conversation +import me.jakejmattson.discordkt.arguments.ChannelArg +import me.jakejmattson.discordkt.arguments.EveryArg +import me.jakejmattson.discordkt.arguments.RoleArg +import me.jakejmattson.discordkt.conversations.conversation class GuildSetupConversation(private val configuration: Configuration, private val muteService: MuteService) { fun createSetupConversation(guild: Guild) = conversation("cancel") { @@ -26,7 +26,7 @@ class GuildSetupConversation(private val configuration: Configuration, private v staffRole, moderatorRole, mutedRole, - LoggingConfiguration(alertChannel.id.asString, logChannel.id.asString), + LoggingConfiguration(alertChannel.id.toString(), logChannel.id.toString()), ) muteService.initGuilds() } diff --git a/src/main/kotlin/me/ddivad/judgebot/conversations/rules/AddRuleConversation.kt b/src/main/kotlin/me/ddivad/judgebot/conversations/rules/AddRuleConversation.kt index 4b34779..2edf2a1 100644 --- a/src/main/kotlin/me/ddivad/judgebot/conversations/rules/AddRuleConversation.kt +++ b/src/main/kotlin/me/ddivad/judgebot/conversations/rules/AddRuleConversation.kt @@ -4,10 +4,10 @@ import dev.kord.core.entity.Guild import me.ddivad.judgebot.dataclasses.Rule import me.ddivad.judgebot.embeds.createRuleEmbed import me.ddivad.judgebot.services.DatabaseService -import me.jakejmattson.discordkt.api.arguments.BooleanArg -import me.jakejmattson.discordkt.api.arguments.EveryArg -import me.jakejmattson.discordkt.api.arguments.UrlArg -import me.jakejmattson.discordkt.api.conversations.conversation +import me.jakejmattson.discordkt.arguments.BooleanArg +import me.jakejmattson.discordkt.arguments.EveryArg +import me.jakejmattson.discordkt.arguments.UrlArg +import me.jakejmattson.discordkt.conversations.conversation class AddRuleConversation(private val databaseService: DatabaseService) { fun createAddRuleConversation(guild: Guild) = conversation("cancel") { diff --git a/src/main/kotlin/me/ddivad/judgebot/conversations/rules/ArchiveRuleConversation.kt b/src/main/kotlin/me/ddivad/judgebot/conversations/rules/ArchiveRuleConversation.kt index 72aa069..5edeb39 100644 --- a/src/main/kotlin/me/ddivad/judgebot/conversations/rules/ArchiveRuleConversation.kt +++ b/src/main/kotlin/me/ddivad/judgebot/conversations/rules/ArchiveRuleConversation.kt @@ -2,8 +2,8 @@ package me.ddivad.judgebot.conversations.rules import dev.kord.core.entity.Guild import me.ddivad.judgebot.services.DatabaseService -import me.jakejmattson.discordkt.api.arguments.IntegerArg -import me.jakejmattson.discordkt.api.conversations.conversation +import me.jakejmattson.discordkt.arguments.IntegerArg +import me.jakejmattson.discordkt.conversations.conversation class ArchiveRuleConversation(private val databaseService: DatabaseService) { fun createArchiveRuleConversation(guild: Guild) = conversation("cancel") { diff --git a/src/main/kotlin/me/ddivad/judgebot/conversations/rules/EditRuleConversation.kt b/src/main/kotlin/me/ddivad/judgebot/conversations/rules/EditRuleConversation.kt index b80e011..7ae46ac 100644 --- a/src/main/kotlin/me/ddivad/judgebot/conversations/rules/EditRuleConversation.kt +++ b/src/main/kotlin/me/ddivad/judgebot/conversations/rules/EditRuleConversation.kt @@ -4,11 +4,11 @@ import dev.kord.core.entity.Guild import me.ddivad.judgebot.dataclasses.Rule import me.ddivad.judgebot.embeds.createRuleEmbed import me.ddivad.judgebot.services.DatabaseService -import me.jakejmattson.discordkt.api.arguments.BooleanArg -import me.jakejmattson.discordkt.api.arguments.EveryArg -import me.jakejmattson.discordkt.api.arguments.IntegerArg -import me.jakejmattson.discordkt.api.arguments.UrlArg -import me.jakejmattson.discordkt.api.conversations.conversation +import me.jakejmattson.discordkt.arguments.BooleanArg +import me.jakejmattson.discordkt.arguments.EveryArg +import me.jakejmattson.discordkt.arguments.IntegerArg +import me.jakejmattson.discordkt.arguments.UrlArg +import me.jakejmattson.discordkt.conversations.conversation class EditRuleConversation(private val databaseService: DatabaseService) { fun createAddRuleConversation(guild: Guild) = conversation("cancel") { diff --git a/src/main/kotlin/me/ddivad/judgebot/dataclasses/Configuration.kt b/src/main/kotlin/me/ddivad/judgebot/dataclasses/Configuration.kt index 8713554..ca7e3d3 100644 --- a/src/main/kotlin/me/ddivad/judgebot/dataclasses/Configuration.kt +++ b/src/main/kotlin/me/ddivad/judgebot/dataclasses/Configuration.kt @@ -2,16 +2,18 @@ package me.ddivad.judgebot.dataclasses import dev.kord.core.entity.Guild import dev.kord.core.entity.Role -import me.jakejmattson.discordkt.api.dsl.Data +import kotlinx.serialization.Serializable +import me.jakejmattson.discordkt.dsl.Data +@Serializable data class Configuration( val ownerId: String = "insert-owner-id", var prefix: String = "judge!", - val guildConfigurations: MutableMap = mutableMapOf(), + val guildConfigurations: MutableMap = mutableMapOf(), val dbConfiguration: DatabaseConfiguration = DatabaseConfiguration() -) : Data("config/config.json") { - operator fun get(id: Long) = guildConfigurations[id] - fun hasGuildConfig(guildId: Long) = guildConfigurations.containsKey(guildId) +) : Data() { + operator fun get(id: ULong) = guildConfigurations[id] + fun hasGuildConfig(guildId: ULong) = guildConfigurations.containsKey(guildId) fun setup( guild: Guild, @@ -25,12 +27,12 @@ data class Configuration( if (guildConfigurations[guild.id.value] != null) return val newConfiguration = GuildConfiguration( - guild.id.asString, + guild.id.toString(), prefix, - mutableListOf(moderatorRole.id.asString), - mutableListOf(staffRole.id.asString), - mutableListOf(adminRole.id.asString), - mutedRole.id.asString, + mutableListOf(moderatorRole.id.toString()), + mutableListOf(staffRole.id.toString()), + mutableListOf(adminRole.id.toString()), + mutedRole.id.toString(), logging ) @@ -48,11 +50,13 @@ data class Configuration( } } +@Serializable data class DatabaseConfiguration( val address: String = "mongodb://localhost:27017", val databaseName: String = "judgebot" ) +@Serializable data class GuildConfiguration( val id: String = "", var prefix: String = "j!", @@ -66,6 +70,7 @@ data class GuildConfiguration( var reactions: ReactionConfiguration = ReactionConfiguration() ) +@Serializable data class LoggingConfiguration( var alertChannel: String = "", var loggingChannel: String = "insert_id", @@ -74,6 +79,7 @@ data class LoggingConfiguration( var logPunishments: Boolean = true ) +@Serializable data class InfractionConfiguration( var pointCeiling: Int = 50, var strikePoints: Int = 10, @@ -81,12 +87,14 @@ data class InfractionConfiguration( var pointDecayPerWeek: Int = 2, ) +@Serializable data class PunishmentLevel( var points: Int = 0, var punishment: PunishmentType, var duration: Long? = null ) +@Serializable data class ReactionConfiguration( var enabled: Boolean = true, var gagReaction: String = "", diff --git a/src/main/kotlin/me/ddivad/judgebot/dataclasses/GuildMember.kt b/src/main/kotlin/me/ddivad/judgebot/dataclasses/GuildMember.kt index 322f2f0..75c0412 100644 --- a/src/main/kotlin/me/ddivad/judgebot/dataclasses/GuildMember.kt +++ b/src/main/kotlin/me/ddivad/judgebot/dataclasses/GuildMember.kt @@ -1,6 +1,7 @@ package me.ddivad.judgebot.dataclasses import dev.kord.core.entity.Guild +import me.ddivad.judgebot.services.LoggingService import org.joda.time.DateTime import org.joda.time.Weeks @@ -26,33 +27,33 @@ data class GuildMember( val userId: String, val guilds: MutableList = mutableListOf() ) { - fun addNote(note: String, moderator: String, guild: Guild) = with(this.getGuildInfo(guild.id.asString)) { + fun addNote(note: String, moderator: String, guild: Guild) = with(this.getGuildInfo(guild.id.toString())) { val nextId: Int = if (this.notes.isEmpty()) 1 else this.notes.maxByOrNull { it.id }!!.id + 1 this.notes.add(Note(note, moderator, DateTime().millis, nextId)) } - fun editNote(guild: Guild, noteId: Int, newNote: String, moderator: String) = with(this.getGuildInfo(guild.id.asString)) { + fun editNote(guild: Guild, noteId: Int, newNote: String, moderator: String) = with(this.getGuildInfo(guild.id.toString())) { this.notes.find { it.id == noteId }?.let{ it.note = newNote it.moderator = moderator } } - fun deleteNote(noteId: Int, guild: Guild) = with(this.getGuildInfo(guild.id.asString)) { + fun deleteNote(noteId: Int, guild: Guild) = with(this.getGuildInfo(guild.id.toString())) { this.notes.removeIf { it.id == noteId } } - fun addInfo(information: Info, guild: Guild) = with(this.getGuildInfo(guild.id.asString)) { + fun addInfo(information: Info, guild: Guild) = with(this.getGuildInfo(guild.id.toString())) { val nextId: Int = if (this.info.isEmpty()) 1 else this.info.maxByOrNull { it.id!! }!!.id!! + 1 information.id = nextId this.info.add(information) } - fun removeInfo(id: Int, guild: Guild) = with(this.getGuildInfo(guild.id.asString)) { + fun removeInfo(id: Int, guild: Guild) = with(this.getGuildInfo(guild.id.toString())) { this.info.removeIf { it.id == id } } - fun addLinkedAccount(guild: Guild, userId: String) = with(this.getGuildInfo(guild.id.asString)) { + fun addLinkedAccount(guild: Guild, userId: String) = with(this.getGuildInfo(guild.id.toString())) { this.linkedAccounts.find { it == userId }.let { if (it == null) { this.linkedAccounts.add(userId) @@ -61,35 +62,35 @@ data class GuildMember( } } - fun getLinkedAccounts(guild: Guild) = with(this.getGuildInfo(guild.id.asString)) { + fun getLinkedAccounts(guild: Guild) = with(this.getGuildInfo(guild.id.toString())) { this.linkedAccounts } - fun removeLinkedAccount(guild: Guild, userId: String) = with(this.getGuildInfo(guild.id.asString)) { + fun removeLinkedAccount(guild: Guild, userId: String) = with(this.getGuildInfo(guild.id.toString())) { this.linkedAccounts.removeIf { it == userId } } - fun cleanseNotes(guild: Guild) = with(this.getGuildInfo(guild.id.asString)) { + fun cleanseNotes(guild: Guild) = with(this.getGuildInfo(guild.id.toString())) { this.notes.clear() } - private fun cleanseInfo(guild: Guild) = with(this.getGuildInfo(guild.id.asString)) { + private fun cleanseInfo(guild: Guild) = with(this.getGuildInfo(guild.id.toString())) { this.info.clear() } - fun cleanseInfractions(guild: Guild) = with(this.getGuildInfo(guild.id.asString)) { + fun cleanseInfractions(guild: Guild) = with(this.getGuildInfo(guild.id.toString())) { this.infractions.clear() this.points = 0 } - fun deleteInfraction(guild: Guild, infractionId: Int) = with(this.getGuildInfo(guild.id.asString)) { + fun deleteInfraction(guild: Guild, infractionId: Int) = with(this.getGuildInfo(guild.id.toString())) { this.infractions.find { it.id == infractionId }?.let { this.infractions.remove(it) this.points -= it.points } } - fun addInfraction(infraction: Infraction, guild: Guild) = with(this.getGuildInfo(guild.id.asString)) { + fun addInfraction(infraction: Infraction, guild: Guild) = with(this.getGuildInfo(guild.id.toString())) { val nextId: Int = if (this.infractions.isEmpty()) 1 else this.infractions.maxByOrNull { it.id!! }?.id!! + 1 infraction.id = nextId this.infractions.add(infraction) @@ -101,30 +102,31 @@ data class GuildMember( this.getGuildInfo(guildId).historyCount += 1 } - fun updatePointDecayDate(guild: Guild, punishmentDuration: Long) = with(this.getGuildInfo(guild.id.asString)) { + fun updatePointDecayDate(guild: Guild, punishmentDuration: Long) = with(this.getGuildInfo(guild.id.toString())) { this.pointDecayTimer = DateTime().millis.plus(punishmentDuration) } - fun addMessageDeleted(guild: Guild, deleteReaction: Boolean) = with(this.getGuildInfo(guild.id.asString)) { + fun addMessageDeleted(guild: Guild, deleteReaction: Boolean) = with(this.getGuildInfo(guild.id.toString())) { this.deletedMessageCount.total++ if (deleteReaction) this.deletedMessageCount.deleteReaction++ } - fun checkPointDecay(guild: Guild, configuration: GuildConfiguration) = with(this.getGuildInfo(guild.id.asString)) { + suspend fun checkPointDecay(guild: Guild, configuration: GuildConfiguration, loggingService: LoggingService) = with(this.getGuildInfo(guild.id.toString())) { val weeksSincePointsDecayed = Weeks.weeksBetween(DateTime(this.pointDecayTimer), DateTime()).weeks if (weeksSincePointsDecayed > 0) { val pointsToRemove = configuration.infractionConfiguration.pointDecayPerWeek * weeksSincePointsDecayed this.points -= pointsToRemove if (this.points < 0) this.points = 0 this.pointDecayTimer = DateTime().millis + loggingService.pointDecayApplied(guild, this@GuildMember, this.points, pointsToRemove, weeksSincePointsDecayed) } } - fun getPoints(guild: Guild) = with(this.getGuildInfo(guild.id.asString)) { + fun getPoints(guild: Guild) = with(this.getGuildInfo(guild.id.toString())) { return@with this.points } - fun reset(guild: Guild) = with(this.getGuildInfo(guild.id.asString)) { + fun reset(guild: Guild) = with(this.getGuildInfo(guild.id.toString())) { this.points = 0 this.historyCount = 0 this.deletedMessageCount.deleteReaction = 0 diff --git a/src/main/kotlin/me/ddivad/judgebot/dataclasses/Permissions.kt b/src/main/kotlin/me/ddivad/judgebot/dataclasses/Permissions.kt index 9d61206..5fe13d1 100644 --- a/src/main/kotlin/me/ddivad/judgebot/dataclasses/Permissions.kt +++ b/src/main/kotlin/me/ddivad/judgebot/dataclasses/Permissions.kt @@ -2,14 +2,14 @@ package me.ddivad.judgebot.dataclasses import dev.kord.common.entity.Permission import dev.kord.core.any -import me.jakejmattson.discordkt.api.dsl.PermissionContext -import me.jakejmattson.discordkt.api.dsl.PermissionSet +import me.jakejmattson.discordkt.dsl.PermissionContext +import me.jakejmattson.discordkt.dsl.PermissionSet @Suppress("unused") enum class Permissions : PermissionSet { BOT_OWNER { override suspend fun hasPermission(context: PermissionContext) = - context.discord.getInjectionObjects().ownerId == context.user.id.asString + context.discord.getInjectionObjects().ownerId == context.user.id.toString() }, GUILD_OWNER { override suspend fun hasPermission(context: PermissionContext) = @@ -21,7 +21,7 @@ enum class Permissions : PermissionSet { val guild = context.guild ?: return false val member = context.user.asMember(guild.id) val configuration = context.discord.getInjectionObjects() - return member.roles.any { configuration[guild.id.value]!!.adminRoles.contains(it.id.asString) } || member.getPermissions() + return member.roles.any { configuration[guild.id.value]!!.adminRoles.contains(it.id.toString()) } || member.getPermissions() .contains( Permission.Administrator ) @@ -32,7 +32,7 @@ enum class Permissions : PermissionSet { val guild = context.guild ?: return false val member = context.user.asMember(guild.id) val configuration = context.discord.getInjectionObjects() - return member.roles.any { configuration[guild.id.value]!!.staffRoles.contains(it.id.asString) } + return member.roles.any { configuration[guild.id.value]!!.staffRoles.contains(it.id.toString()) } } }, MODERATOR { @@ -40,7 +40,7 @@ enum class Permissions : PermissionSet { val guild = context.guild ?: return false val member = context.user.asMember(guild.id) val configuration = context.discord.getInjectionObjects() - return member.roles.any { configuration[guild.id.value]!!.moderatorRoles.contains(it.id.asString) } + return member.roles.any { configuration[guild.id.value]!!.moderatorRoles.contains(it.id.toString()) } } }, NONE { diff --git a/src/main/kotlin/me/ddivad/judgebot/embeds/GuildEmbeds.kt b/src/main/kotlin/me/ddivad/judgebot/embeds/GuildEmbeds.kt index 1af5b8c..e7bc963 100644 --- a/src/main/kotlin/me/ddivad/judgebot/embeds/GuildEmbeds.kt +++ b/src/main/kotlin/me/ddivad/judgebot/embeds/GuildEmbeds.kt @@ -10,8 +10,8 @@ import me.ddivad.judgebot.dataclasses.GuildConfiguration import me.ddivad.judgebot.dataclasses.Punishment import me.ddivad.judgebot.util.timeBetween import me.ddivad.judgebot.util.timeToString -import me.jakejmattson.discordkt.api.extensions.addField -import me.jakejmattson.discordkt.api.extensions.toSnowflake +import me.jakejmattson.discordkt.extensions.addField +import me.jakejmattson.discordkt.extensions.toSnowflake import org.joda.time.DateTime import java.awt.Color diff --git a/src/main/kotlin/me/ddivad/judgebot/embeds/InfoEmbeds.kt b/src/main/kotlin/me/ddivad/judgebot/embeds/InfoEmbeds.kt index d7dbeb6..651a8f5 100644 --- a/src/main/kotlin/me/ddivad/judgebot/embeds/InfoEmbeds.kt +++ b/src/main/kotlin/me/ddivad/judgebot/embeds/InfoEmbeds.kt @@ -6,7 +6,7 @@ import dev.kord.core.entity.Member import dev.kord.rest.Image import dev.kord.rest.builder.message.EmbedBuilder import me.ddivad.judgebot.dataclasses.* -import me.jakejmattson.discordkt.api.extensions.addField +import me.jakejmattson.discordkt.extensions.addField import java.awt.Color fun EmbedBuilder.createInformationEmbed(guild: Guild, user: Member, information: Info) { diff --git a/src/main/kotlin/me/ddivad/judgebot/embeds/InfractionEmbeds.kt b/src/main/kotlin/me/ddivad/judgebot/embeds/InfractionEmbeds.kt index 2a00d04..6df5fa6 100644 --- a/src/main/kotlin/me/ddivad/judgebot/embeds/InfractionEmbeds.kt +++ b/src/main/kotlin/me/ddivad/judgebot/embeds/InfractionEmbeds.kt @@ -9,7 +9,7 @@ import dev.kord.rest.Image import dev.kord.rest.builder.message.EmbedBuilder import me.ddivad.judgebot.dataclasses.* import me.ddivad.judgebot.util.timeToString -import me.jakejmattson.discordkt.api.extensions.addField +import me.jakejmattson.discordkt.extensions.addField import java.awt.Color fun EmbedBuilder.createInfractionEmbed(guild: Guild, configuration: GuildConfiguration, user: User, guildMember: GuildMember, infraction: Infraction, rule: Rule?) { diff --git a/src/main/kotlin/me/ddivad/judgebot/embeds/RuleEmbeds.kt b/src/main/kotlin/me/ddivad/judgebot/embeds/RuleEmbeds.kt index 0ad4fc0..da3f91c 100644 --- a/src/main/kotlin/me/ddivad/judgebot/embeds/RuleEmbeds.kt +++ b/src/main/kotlin/me/ddivad/judgebot/embeds/RuleEmbeds.kt @@ -4,7 +4,7 @@ import dev.kord.common.kColor import dev.kord.core.entity.Guild import dev.kord.rest.builder.message.EmbedBuilder import me.ddivad.judgebot.dataclasses.Rule -import me.jakejmattson.discordkt.api.extensions.addField +import me.jakejmattson.discordkt.extensions.addField import java.awt.Color import dev.kord.rest.Image diff --git a/src/main/kotlin/me/ddivad/judgebot/embeds/UserEmbeds.kt b/src/main/kotlin/me/ddivad/judgebot/embeds/UserEmbeds.kt index a7184cc..d700b51 100644 --- a/src/main/kotlin/me/ddivad/judgebot/embeds/UserEmbeds.kt +++ b/src/main/kotlin/me/ddivad/judgebot/embeds/UserEmbeds.kt @@ -11,10 +11,11 @@ import kotlinx.datetime.toJavaInstant import me.ddivad.judgebot.dataclasses.* import me.ddivad.judgebot.services.DatabaseService import me.ddivad.judgebot.util.* -import me.jakejmattson.discordkt.api.dsl.MenuBuilder -import me.jakejmattson.discordkt.api.extensions.addField -import me.jakejmattson.discordkt.api.extensions.addInlineField -import me.jakejmattson.discordkt.api.extensions.toSnowflake +import me.jakejmattson.discordkt.dsl.MenuBuilder +import me.jakejmattson.discordkt.extensions.addField +import me.jakejmattson.discordkt.extensions.addInlineField +import me.jakejmattson.discordkt.extensions.pfpUrl +import me.jakejmattson.discordkt.extensions.toSnowflake import org.joda.time.DateTime import java.awt.Color import java.text.SimpleDateFormat @@ -27,13 +28,13 @@ suspend fun MenuBuilder.createHistoryEmbed( config: Configuration, databaseService: DatabaseService ) { - val userRecord = member.getGuildInfo(guild.id.asString) + val userRecord = member.getGuildInfo(guild.id.toString()) val paginatedNotes = userRecord.notes.chunked(4) val totalMenuPages = 1 + 1 + 1 + 1 + if (paginatedNotes.isNotEmpty()) paginatedNotes.size else 1 val guildConfiguration = config[guild.id.value]!! val embedColor = getEmbedColour(guild, target, databaseService) - val leaveData = databaseService.joinLeaves.getMemberJoinLeaveDataForGuild(guild.id.asString, member.userId) + val leaveData = databaseService.joinLeaves.getMemberJoinLeaveDataForGuild(guild.id.toString(), member.userId) this.apply { buildOverviewPage(guild, guildConfiguration, target, userRecord, embedColor, totalMenuPages, databaseService) buildInfractionPage(guild, guildConfiguration, target, userRecord, embedColor, totalMenuPages) @@ -85,7 +86,7 @@ private suspend fun MenuBuilder.buildOverviewPage( color = embedColor.kColor title = "${target.asUser().tag}: Overview" thumbnail { - url = target.asUser().avatar.url + url = target.asUser().pfpUrl } val memberInGuild = target.asMemberOrNull(guild.id) @@ -101,7 +102,7 @@ private suspend fun MenuBuilder.buildOverviewPage( addInlineField("Points", "**${userRecord.points} / ${config.infractionConfiguration.pointCeiling}**") addInlineField("History Invokes", "${userRecord.historyCount}") - addInlineField("Created", formatOffsetTime(target.id.timeStamp.toJavaInstant())) + addInlineField("Created", formatOffsetTime(target.id.timestamp.toJavaInstant())) if (memberInGuild != null) { addInlineField("Joined", formatOffsetTime(memberInGuild.joinedAt.toJavaInstant())) } else addInlineField("", "") @@ -146,7 +147,7 @@ private suspend fun MenuBuilder.buildInfractionPage( color = embedColor.kColor title = "${target.asUser().tag}: Infractions" thumbnail { - url = target.asUser().avatar.url + url = target.asUser().pfpUrl } val warnings = userRecord.infractions.filter { it.type == InfractionType.Warn }.sortedBy { it.dateTime } val strikes = userRecord.infractions.filter { it.type == InfractionType.Strike }.sortedBy { it.dateTime } @@ -203,7 +204,7 @@ private suspend fun MenuBuilder.buildNotesPages( color = embedColor.kColor title = "${target.asUser().tag}: Notes" thumbnail { - url = target.asUser().avatar.url + url = target.asUser().pfpUrl } addInlineField("Points", "**${userRecord.points} / ${config.infractionConfiguration.pointCeiling}**") @@ -223,7 +224,7 @@ private suspend fun MenuBuilder.buildNotesPages( color = embedColor.kColor title = "${target.asUser().tag}: Notes" + if (paginatedNotes.size > 1) "(${index + 1})" else "" thumbnail { - url = target.asUser().avatar.url + url = target.asUser().pfpUrl } addInlineField("Notes", "${userRecord.notes.size}") addInlineField("Information", "${userRecord.info.size}") @@ -259,7 +260,7 @@ private suspend fun MenuBuilder.buildInformationPage( color = embedColor.kColor title = "${target.asUser().tag}: Information" thumbnail { - url = target.asUser().avatar.url + url = target.asUser().pfpUrl } addInlineField("Notes", "${userRecord.notes.size}") addInlineField("Information", "${userRecord.info.size}") @@ -296,7 +297,7 @@ private suspend fun MenuBuilder.buildJoinLeavePage( color = embedColor.kColor title = "${target.asUser().tag}: Join / Leave" thumbnail { - url = target.asUser().avatar.url + url = target.asUser().pfpUrl } addInlineField("Joins:", joinLeaves.size.toString()) @@ -346,7 +347,7 @@ private suspend fun getEmbedColour(guild: Guild, target: User, databaseService: private suspend fun getStatus(guild: Guild, target: User, databaseService: DatabaseService): String? { guild.getBanOrNull(target.id)?.let { - val reason = databaseService.guilds.getBanOrNull(guild, target.id.asString)?.reason ?: it.reason + val reason = databaseService.guilds.getBanOrNull(guild, target.id.toString())?.reason ?: it.reason return "```css\nUser is banned with reason:\n${reason}```" } if (target.asMemberOrNull(guild.id) == null) return "```css\nUser not currently in this guild```" @@ -387,7 +388,7 @@ suspend fun EmbedBuilder.createCondensedHistoryEmbed( config: Configuration ) { - val userGuildDetails = member.getGuildInfo(guild.id.asString) + val userGuildDetails = member.getGuildInfo(guild.id.toString()) val infractions = userGuildDetails.infractions val warnings = userGuildDetails.infractions.filter { it.type == InfractionType.Warn } val strikes = userGuildDetails.infractions.filter { it.type == InfractionType.Strike } @@ -397,7 +398,7 @@ suspend fun EmbedBuilder.createCondensedHistoryEmbed( color = Color.MAGENTA.kColor title = "${target.asUser().tag}'s Record" thumbnail { - url = target.asUser().avatar.url + url = target.asUser().pfpUrl } addInlineField("Infractions", "${infractions.size}") addInlineField("Notes", "${notes.size}") @@ -467,7 +468,7 @@ suspend fun EmbedBuilder.createSelfHistoryEmbed( config: Configuration ) { - val userGuildDetails = member.getGuildInfo(guild.id.asString) + val userGuildDetails = member.getGuildInfo(guild.id.toString()) val infractions = userGuildDetails.infractions val warnings = userGuildDetails.infractions.filter { it.type == InfractionType.Warn } val strikes = userGuildDetails.infractions.filter { it.type == InfractionType.Strike } @@ -476,7 +477,7 @@ suspend fun EmbedBuilder.createSelfHistoryEmbed( color = Color.MAGENTA.kColor title = "${target.asUser().tag}'s Record" thumbnail { - url = target.asUser().avatar.url + url = target.asUser().pfpUrl } addInlineField("Infractions", "${infractions.size}") addInlineField("Points", "**${member.getPoints(guild)} / $maxPoints**") diff --git a/src/main/kotlin/me/ddivad/judgebot/listeners/JoinLeaveListener.kt b/src/main/kotlin/me/ddivad/judgebot/listeners/JoinLeaveListener.kt index 345baee..c2e32b7 100644 --- a/src/main/kotlin/me/ddivad/judgebot/listeners/JoinLeaveListener.kt +++ b/src/main/kotlin/me/ddivad/judgebot/listeners/JoinLeaveListener.kt @@ -6,12 +6,12 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import me.ddivad.judgebot.services.DatabaseService -import me.jakejmattson.discordkt.api.dsl.listeners +import me.jakejmattson.discordkt.dsl.listeners @Suppress("unused") fun onGuildMemberLeave(databaseService: DatabaseService) = listeners { on { - databaseService.joinLeaves.addLeaveData(guildId.asString, user.id.asString) + databaseService.joinLeaves.addLeaveData(guildId.toString(), user.id.toString()) } on { @@ -19,7 +19,7 @@ fun onGuildMemberLeave(databaseService: DatabaseService) = listeners { GlobalScope.launch { delay(1000 * 10 * 1) guild.getMemberOrNull(member.id)?.let { - databaseService.joinLeaves.createJoinLeaveRecord(guildId.asString, member) + databaseService.joinLeaves.createJoinLeaveRecord(guildId.toString(), member) } } } diff --git a/src/main/kotlin/me/ddivad/judgebot/listeners/MemberReactionListeners.kt b/src/main/kotlin/me/ddivad/judgebot/listeners/MemberReactionListeners.kt index ac14eca..08ab6ca 100644 --- a/src/main/kotlin/me/ddivad/judgebot/listeners/MemberReactionListeners.kt +++ b/src/main/kotlin/me/ddivad/judgebot/listeners/MemberReactionListeners.kt @@ -7,8 +7,8 @@ import dev.kord.x.emoji.Emojis import dev.kord.x.emoji.addReaction import me.ddivad.judgebot.dataclasses.Configuration import me.ddivad.judgebot.util.createFlagMessage -import me.jakejmattson.discordkt.api.dsl.listeners -import me.jakejmattson.discordkt.api.extensions.toSnowflake +import me.jakejmattson.discordkt.dsl.listeners +import me.jakejmattson.discordkt.extensions.toSnowflake @Suppress("unused") fun onMemberReactionAdd(configuration: Configuration) = listeners { diff --git a/src/main/kotlin/me/ddivad/judgebot/listeners/NewChannelOverrideListener.kt b/src/main/kotlin/me/ddivad/judgebot/listeners/NewChannelOverrideListener.kt index fb759e3..5305d14 100644 --- a/src/main/kotlin/me/ddivad/judgebot/listeners/NewChannelOverrideListener.kt +++ b/src/main/kotlin/me/ddivad/judgebot/listeners/NewChannelOverrideListener.kt @@ -7,8 +7,8 @@ import dev.kord.core.event.channel.TextChannelCreateEvent import dev.kord.core.event.channel.thread.ThreadChannelCreateEvent import me.ddivad.judgebot.dataclasses.Configuration import me.ddivad.judgebot.services.LoggingService -import me.jakejmattson.discordkt.api.dsl.listeners -import me.jakejmattson.discordkt.api.extensions.toSnowflake +import me.jakejmattson.discordkt.dsl.listeners +import me.jakejmattson.discordkt.extensions.toSnowflake @Suppress("unused") fun onChannelCreated(configuration: Configuration, loggingService: LoggingService) = listeners { diff --git a/src/main/kotlin/me/ddivad/judgebot/listeners/RejoinMuteListener.kt b/src/main/kotlin/me/ddivad/judgebot/listeners/RejoinMuteListener.kt index 49996d2..af6bf60 100644 --- a/src/main/kotlin/me/ddivad/judgebot/listeners/RejoinMuteListener.kt +++ b/src/main/kotlin/me/ddivad/judgebot/listeners/RejoinMuteListener.kt @@ -4,7 +4,7 @@ import dev.kord.core.event.guild.MemberJoinEvent import me.ddivad.judgebot.services.LoggingService import me.ddivad.judgebot.services.infractions.MuteService import me.ddivad.judgebot.services.infractions.RoleState -import me.jakejmattson.discordkt.api.dsl.listeners +import me.jakejmattson.discordkt.dsl.listeners @Suppress("unused") fun onMemberRejoinWithMute(muteService: MuteService, loggingService: LoggingService) = listeners { diff --git a/src/main/kotlin/me/ddivad/judgebot/listeners/StaffReactionListeners.kt b/src/main/kotlin/me/ddivad/judgebot/listeners/StaffReactionListeners.kt index 5dbb74f..cad7c26 100644 --- a/src/main/kotlin/me/ddivad/judgebot/listeners/StaffReactionListeners.kt +++ b/src/main/kotlin/me/ddivad/judgebot/listeners/StaffReactionListeners.kt @@ -12,9 +12,9 @@ import me.ddivad.judgebot.services.DatabaseService import me.ddivad.judgebot.services.LoggingService import me.ddivad.judgebot.services.infractions.MuteService import me.ddivad.judgebot.services.infractions.RoleState -import me.jakejmattson.discordkt.api.dsl.listeners -import me.jakejmattson.discordkt.api.extensions.isSelf -import me.jakejmattson.discordkt.api.extensions.sendPrivateMessage +import me.jakejmattson.discordkt.dsl.listeners +import me.jakejmattson.discordkt.extensions.isSelf +import me.jakejmattson.discordkt.extensions.sendPrivateMessage @Suppress("unused") fun onStaffReactionAdd( diff --git a/src/main/kotlin/me/ddivad/judgebot/services/BotStatsService.kt b/src/main/kotlin/me/ddivad/judgebot/services/BotStatsService.kt index 758877e..60c0456 100644 --- a/src/main/kotlin/me/ddivad/judgebot/services/BotStatsService.kt +++ b/src/main/kotlin/me/ddivad/judgebot/services/BotStatsService.kt @@ -1,8 +1,8 @@ package me.ddivad.judgebot.services import me.ddivad.judgebot.util.timeToString -import me.jakejmattson.discordkt.api.Discord -import me.jakejmattson.discordkt.api.annotations.Service +import me.jakejmattson.discordkt.Discord +import me.jakejmattson.discordkt.annotations.Service import java.util.* @Service diff --git a/src/main/kotlin/me/ddivad/judgebot/services/CacheService.kt b/src/main/kotlin/me/ddivad/judgebot/services/CacheService.kt index 801d099..f2b6e36 100644 --- a/src/main/kotlin/me/ddivad/judgebot/services/CacheService.kt +++ b/src/main/kotlin/me/ddivad/judgebot/services/CacheService.kt @@ -3,9 +3,9 @@ package me.ddivad.judgebot.services import dev.kord.core.supplier.EntitySupplyStrategy import kotlinx.coroutines.flow.toList import me.ddivad.judgebot.dataclasses.Configuration -import me.jakejmattson.discordkt.api.Discord -import me.jakejmattson.discordkt.api.annotations.Service -import me.jakejmattson.discordkt.api.extensions.toSnowflake +import me.jakejmattson.discordkt.Discord +import me.jakejmattson.discordkt.annotations.Service +import me.jakejmattson.discordkt.extensions.toSnowflake @Service class CacheService(private val discord: Discord, private val configuration: Configuration) { diff --git a/src/main/kotlin/me/ddivad/judgebot/services/DatabaseService.kt b/src/main/kotlin/me/ddivad/judgebot/services/DatabaseService.kt index cec4e72..c5da639 100644 --- a/src/main/kotlin/me/ddivad/judgebot/services/DatabaseService.kt +++ b/src/main/kotlin/me/ddivad/judgebot/services/DatabaseService.kt @@ -3,7 +3,7 @@ package me.ddivad.judgebot.services import me.ddivad.judgebot.services.database.GuildOperations import me.ddivad.judgebot.services.database.JoinLeaveOperations import me.ddivad.judgebot.services.database.UserOperations -import me.jakejmattson.discordkt.api.annotations.Service +import me.jakejmattson.discordkt.annotations.Service @Service open class DatabaseService( diff --git a/src/main/kotlin/me/ddivad/judgebot/services/HelpService.kt b/src/main/kotlin/me/ddivad/judgebot/services/HelpService.kt index 7ee8cc2..34be58d 100644 --- a/src/main/kotlin/me/ddivad/judgebot/services/HelpService.kt +++ b/src/main/kotlin/me/ddivad/judgebot/services/HelpService.kt @@ -6,12 +6,12 @@ import dev.kord.common.kColor import dev.kord.x.emoji.DiscordEmoji import dev.kord.x.emoji.Emojis import kotlinx.coroutines.runBlocking -import me.jakejmattson.discordkt.api.annotations.Service -import me.jakejmattson.discordkt.api.arguments.Argument -import me.jakejmattson.discordkt.api.arguments.OptionalArg -import me.jakejmattson.discordkt.api.commands.Command -import me.jakejmattson.discordkt.api.commands.CommandEvent -import me.jakejmattson.discordkt.api.commands.Execution +import me.jakejmattson.discordkt.annotations.Service +import me.jakejmattson.discordkt.arguments.Argument +import me.jakejmattson.discordkt.arguments.OptionalArg +import me.jakejmattson.discordkt.commands.Command +import me.jakejmattson.discordkt.commands.CommandEvent +import me.jakejmattson.discordkt.commands.Execution @KordPreview @Service @@ -46,7 +46,7 @@ class HelpService { Use `${event.prefix()}help ` for more information """.trimIndent() - color = event.discord.configuration.theme?.kColor + color = event.discord.configuration.theme field { name = "**Commands**" @@ -88,7 +88,7 @@ class HelpService { } suspend fun sendHelpEmbed(event: CommandEvent<*>, command: Command) = event.respond { - color = event.discord.configuration.theme?.kColor + color = event.discord.configuration.theme title = command.names.joinToString(", ") description = command.description diff --git a/src/main/kotlin/me/ddivad/judgebot/services/LoggingService.kt b/src/main/kotlin/me/ddivad/judgebot/services/LoggingService.kt index e2dd2af..5c1941c 100644 --- a/src/main/kotlin/me/ddivad/judgebot/services/LoggingService.kt +++ b/src/main/kotlin/me/ddivad/judgebot/services/LoggingService.kt @@ -5,11 +5,14 @@ import dev.kord.core.behavior.getChannelOf import dev.kord.core.entity.* import dev.kord.core.entity.channel.TextChannel import me.ddivad.judgebot.dataclasses.Configuration +import me.ddivad.judgebot.dataclasses.GuildMember import me.ddivad.judgebot.dataclasses.Infraction import me.ddivad.judgebot.dataclasses.Punishment import me.ddivad.judgebot.services.infractions.RoleState import me.ddivad.judgebot.util.timeBetween -import me.jakejmattson.discordkt.api.annotations.Service +import me.jakejmattson.discordkt.annotations.Service +import me.jakejmattson.discordkt.extensions.descriptor +import me.jakejmattson.discordkt.extensions.pfpUrl import org.joda.time.DateTime import java.text.SimpleDateFormat import java.util.* @@ -53,7 +56,7 @@ class LoggingService(private val configuration: Configuration) { } suspend fun badBfpApplied(guild: Guild, user: Member) = - log(guild, "**Info ::** User ${user.mention} badPfp triggered for avatar <${user.avatar.url}>") + log(guild, "**Info ::** User ${user.mention} badPfp triggered for avatar <${user.pfpUrl}>") suspend fun badPfpCancelled(guild: Guild, user: Member) = log(guild, "**Info ::** BadPfp cancelled for user ${user.mention}") @@ -76,6 +79,17 @@ class LoggingService(private val configuration: Configuration) { suspend fun staffReactionUsed(guild: Guild, moderator: User, target: Member, reaction: ReactionEmoji) = log(guild, "**Info ::** ${reaction.name} used by ${moderator.username} on ${target.mention}") + suspend fun pointDecayApplied(guild: Guild, target: GuildMember, newPoints: Int, pointsDeducted: Int, weeksSinceLastInfraction: Int) { + val user = guild.kord.getUser(Snowflake(target.userId)) + + log( + guild, + "**Info ::** Infraction Points for ${user?.descriptor()} " + + "reduced by **$pointsDeducted** to **$newPoints** " + + "for **$weeksSinceLastInfraction** infraction free weeks." + ) + } + private suspend fun log(guild: Guild, message: String) { getLoggingChannel(guild)?.createMessage(message) println("${SimpleDateFormat("dd/M/yyyy HH:mm:ss").format(Date())} > ${guild.name} > $message") diff --git a/src/main/kotlin/me/ddivad/judgebot/services/database/ConnectionService.kt b/src/main/kotlin/me/ddivad/judgebot/services/database/ConnectionService.kt index dd18dc1..b3f782c 100644 --- a/src/main/kotlin/me/ddivad/judgebot/services/database/ConnectionService.kt +++ b/src/main/kotlin/me/ddivad/judgebot/services/database/ConnectionService.kt @@ -1,7 +1,7 @@ package me.ddivad.judgebot.services.database import me.ddivad.judgebot.dataclasses.Configuration -import me.jakejmattson.discordkt.api.annotations.Service +import me.jakejmattson.discordkt.annotations.Service import org.litote.kmongo.coroutine.CoroutineClient import org.litote.kmongo.coroutine.CoroutineDatabase import org.litote.kmongo.coroutine.coroutine diff --git a/src/main/kotlin/me/ddivad/judgebot/services/database/GuildOperations.kt b/src/main/kotlin/me/ddivad/judgebot/services/database/GuildOperations.kt index e8f3fda..6457ec9 100644 --- a/src/main/kotlin/me/ddivad/judgebot/services/database/GuildOperations.kt +++ b/src/main/kotlin/me/ddivad/judgebot/services/database/GuildOperations.kt @@ -5,7 +5,7 @@ import dev.kord.core.entity.Member import dev.kord.core.entity.User import kotlinx.coroutines.runBlocking import me.ddivad.judgebot.dataclasses.* -import me.jakejmattson.discordkt.api.annotations.Service +import me.jakejmattson.discordkt.annotations.Service import org.litote.kmongo.eq // Note: RunBlocking is needed for DB operations in this service, as they are used in a conversation (which does not support "suspend" functions) @@ -15,7 +15,7 @@ class GuildOperations(connection: ConnectionService) { private val guildCollection = connection.db.getCollection("Guilds") suspend fun setupGuild(guild: Guild): GuildInformation { - val guildConfig = GuildInformation(guild.id.asString, guild.name) + val guildConfig = GuildInformation(guild.id.toString(), guild.name) this.guildCollection.insertOne(guildConfig) return guildConfig } @@ -83,7 +83,7 @@ class GuildOperations(connection: ConnectionService) { } suspend fun checkPunishmentExists(guild: Guild, member: Member, type: InfractionType): List { - return this.getGuild(guild).getPunishmentByType(type, member.asUser().id.asString) + return this.getGuild(guild).getPunishmentByType(type, member.asUser().id.toString()) } suspend fun getPunishmentByType(guild: Guild, userId: String, type: InfractionType): List { @@ -91,7 +91,7 @@ class GuildOperations(connection: ConnectionService) { } suspend fun getPunishmentsForUser(guild: Guild, user: User): List { - return this.getGuild(guild).getPunishmentsByUser(user.id.asString) + return this.getGuild(guild).getPunishmentsByUser(user.id.toString()) } suspend fun getBanOrNull(guild: Guild, userId: String): Ban? { @@ -107,8 +107,8 @@ class GuildOperations(connection: ConnectionService) { } private suspend fun getGuild(guild: Guild): GuildInformation { - return guildCollection.findOne(GuildInformation::guildId eq guild.id.asString) - ?: GuildInformation(guild.id.asString, guild.name) + return guildCollection.findOne(GuildInformation::guildId eq guild.id.toString()) + ?: GuildInformation(guild.id.toString(), guild.name) } private suspend fun updateGuild(guildInformation: GuildInformation): GuildInformation { diff --git a/src/main/kotlin/me/ddivad/judgebot/services/database/JoinLeaveOperations.kt b/src/main/kotlin/me/ddivad/judgebot/services/database/JoinLeaveOperations.kt index 39250d2..5e69e80 100644 --- a/src/main/kotlin/me/ddivad/judgebot/services/database/JoinLeaveOperations.kt +++ b/src/main/kotlin/me/ddivad/judgebot/services/database/JoinLeaveOperations.kt @@ -2,7 +2,7 @@ package me.ddivad.judgebot.services.database import dev.kord.core.entity.Member import me.ddivad.judgebot.dataclasses.JoinLeave -import me.jakejmattson.discordkt.api.annotations.Service +import me.jakejmattson.discordkt.annotations.Service import org.joda.time.DateTime import org.litote.kmongo.and import org.litote.kmongo.eq @@ -13,7 +13,7 @@ class JoinLeaveOperations(connection: ConnectionService) { private val joinLeaveCollection = connection.db.getCollection("JoinLeaves") suspend fun createJoinLeaveRecord(guildId: String, target: Member) { - val joinLeave = JoinLeave(guildId, target.id.asString, target.joinedAt.toEpochMilliseconds()) + val joinLeave = JoinLeave(guildId, target.id.toString(), target.joinedAt.toEpochMilliseconds()) joinLeaveCollection.insertOne(joinLeave) } @@ -38,7 +38,7 @@ class JoinLeaveOperations(connection: ConnectionService) { } suspend fun createJoinLeaveRecordIfNotRecorded(guildId: String, target: Member) { - if (this.getMemberJoinLeaveDataForGuild(guildId, target.id.asString).isNotEmpty()) { + if (this.getMemberJoinLeaveDataForGuild(guildId, target.id.toString()).isNotEmpty()) { return } this.createJoinLeaveRecord(guildId, target) diff --git a/src/main/kotlin/me/ddivad/judgebot/services/database/UserOperations.kt b/src/main/kotlin/me/ddivad/judgebot/services/database/UserOperations.kt index b382e76..01a6355 100644 --- a/src/main/kotlin/me/ddivad/judgebot/services/database/UserOperations.kt +++ b/src/main/kotlin/me/ddivad/judgebot/services/database/UserOperations.kt @@ -7,29 +7,32 @@ import me.ddivad.judgebot.dataclasses.GuildMember import me.ddivad.judgebot.dataclasses.Infraction import dev.kord.core.entity.User import me.ddivad.judgebot.dataclasses.* -import me.jakejmattson.discordkt.api.annotations.Service +import me.ddivad.judgebot.services.LoggingService +import me.jakejmattson.discordkt.annotations.Service import org.litote.kmongo.eq @Service class UserOperations( connection: ConnectionService, private val configuration: Configuration, - private val joinLeaveService: JoinLeaveOperations + private val joinLeaveService: JoinLeaveOperations, + private val loggingService: LoggingService ) { private val userCollection = connection.db.getCollection("Users") suspend fun getOrCreateUser(target: User, guild: Guild): GuildMember { - val userRecord = userCollection.findOne(GuildMember::userId eq target.id.asString) + val userRecord = userCollection.findOne(GuildMember::userId eq target.id.toString()) return if (userRecord != null) { - userRecord.ensureGuildDetailsPresent(guild.id.asString) - userRecord.checkPointDecay(guild, configuration[guild.id.value]!!) + userRecord.ensureGuildDetailsPresent(guild.id.toString()) + userRecord.checkPointDecay(guild, configuration[guild.id.value]!!, loggingService) + this.updateUser(userRecord) target.asMemberOrNull(guild.id)?.let { - joinLeaveService.createJoinLeaveRecordIfNotRecorded(guild.id.asString, it) + joinLeaveService.createJoinLeaveRecordIfNotRecorded(guild.id.toString(), it) } userRecord } else { - val guildMember = GuildMember(target.id.asString) - guildMember.guilds.add(GuildMemberDetails(guild.id.asString)) + val guildMember = GuildMember(target.id.toString()) + guildMember.guilds.add(GuildMemberDetails(guild.id.toString())) userCollection.insertOne(guildMember) guildMember } @@ -105,7 +108,7 @@ class UserOperations( } suspend fun incrementUserHistory(user: GuildMember, guild: Guild): GuildMember { - user.incrementHistoryCount(guild.id.asString) + user.incrementHistoryCount(guild.id.toString()) return this.updateUser(user) } @@ -122,7 +125,7 @@ class UserOperations( private fun getPunishmentForPoints(guild: Guild, guildMember: GuildMember): PunishmentLevel { val punishmentLevels = configuration[guild.id.value]?.punishments return punishmentLevels!!.filter { - it.points <= guildMember.getGuildInfo(guild.id.asString).points + it.points <= guildMember.getGuildInfo(guild.id.toString()).points }.maxByOrNull { it.points }!! } } \ No newline at end of file diff --git a/src/main/kotlin/me/ddivad/judgebot/services/infractions/BadPfpService.kt b/src/main/kotlin/me/ddivad/judgebot/services/infractions/BadPfpService.kt index ecf1bd6..fa2affe 100644 --- a/src/main/kotlin/me/ddivad/judgebot/services/infractions/BadPfpService.kt +++ b/src/main/kotlin/me/ddivad/judgebot/services/infractions/BadPfpService.kt @@ -10,16 +10,16 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import me.ddivad.judgebot.embeds.createBadPfpEmbed import me.ddivad.judgebot.services.LoggingService -import me.jakejmattson.discordkt.api.Discord -import me.jakejmattson.discordkt.api.annotations.Service -import me.jakejmattson.discordkt.api.extensions.sendPrivateMessage +import me.jakejmattson.discordkt.Discord +import me.jakejmattson.discordkt.annotations.Service +import me.jakejmattson.discordkt.extensions.sendPrivateMessage @Service class BadPfpService(private val muteService: MuteService, private val discord: Discord, private val loggingService: LoggingService) { private val badPfpTracker = hashMapOf, Job>() - private suspend fun toKey(member: Member): Pair = member.guild.id.asString to member.asUser().id.asString + private suspend fun toKey(member: Member): Pair = member.guild.id.toString() to member.asUser().id.toString() suspend fun applyBadPfp(target: Member, guild: Guild, timeLimit: Long) { try { diff --git a/src/main/kotlin/me/ddivad/judgebot/services/infractions/BadnameService.kt b/src/main/kotlin/me/ddivad/judgebot/services/infractions/BadnameService.kt index 4a7d60c..83f16fc 100644 --- a/src/main/kotlin/me/ddivad/judgebot/services/infractions/BadnameService.kt +++ b/src/main/kotlin/me/ddivad/judgebot/services/infractions/BadnameService.kt @@ -2,7 +2,7 @@ package me.ddivad.judgebot.services.infractions import dev.kord.core.behavior.edit import dev.kord.core.entity.Member -import me.jakejmattson.discordkt.api.annotations.Service +import me.jakejmattson.discordkt.annotations.Service val names = mutableListOf( "Stephen","Bob","Joe","Timmy","Arnold","Jeff","Tim","Doug" diff --git a/src/main/kotlin/me/ddivad/judgebot/services/infractions/BanService.kt b/src/main/kotlin/me/ddivad/judgebot/services/infractions/BanService.kt index c544430..0405b13 100644 --- a/src/main/kotlin/me/ddivad/judgebot/services/infractions/BanService.kt +++ b/src/main/kotlin/me/ddivad/judgebot/services/infractions/BanService.kt @@ -10,9 +10,9 @@ import kotlinx.coroutines.launch import me.ddivad.judgebot.dataclasses.* import me.ddivad.judgebot.services.DatabaseService import me.ddivad.judgebot.services.LoggingService -import me.jakejmattson.discordkt.api.Discord -import me.jakejmattson.discordkt.api.annotations.Service -import me.jakejmattson.discordkt.api.extensions.toSnowflake +import me.jakejmattson.discordkt.Discord +import me.jakejmattson.discordkt.annotations.Service +import me.jakejmattson.discordkt.extensions.toSnowflake import org.joda.time.DateTime @Service @@ -23,14 +23,14 @@ class BanService( private val discord: Discord ) { private val banTracker = hashMapOf, Job>() - private fun toKey(user: User, guild: Guild): Pair = user.id.asString to guild.id.asString + private fun toKey(user: User, guild: Guild): Pair = user.id.toString() to guild.id.toString() suspend fun banUser(target: User, guild: Guild, punishment: Punishment, deleteDays: Int = 0) { guild.ban(target.id) { deleteMessagesDays = deleteDays reason = punishment.reason } - databaseService.guilds.addBan(guild, Ban(target.id.asString, punishment.moderator, punishment.reason)) + databaseService.guilds.addBan(guild, Ban(target.id.toString(), punishment.moderator, punishment.reason)) if (punishment.clearTime != null) { databaseService.guilds.addPunishment(guild.asGuild(), punishment) val key = toKey(target, guild) @@ -45,11 +45,11 @@ class BanService( suspend fun unbanUser(guild: Guild, user: User) { val key = toKey(user, guild) if (databaseService.guilds.getPunishmentsForUser(guild, user).any { it.type == InfractionType.Ban }) { - databaseService.guilds.removePunishment(guild, user.id.asString, InfractionType.Ban) + databaseService.guilds.removePunishment(guild, user.id.toString(), InfractionType.Ban) banTracker[key]?.cancel() } guild.unban(user.id) - databaseService.guilds.removeBan(guild, user.id.asString) + databaseService.guilds.removeBan(guild, user.id.toString()) loggingService.userUnbanned(guild, user) } diff --git a/src/main/kotlin/me/ddivad/judgebot/services/infractions/InfractionService.kt b/src/main/kotlin/me/ddivad/judgebot/services/infractions/InfractionService.kt index 7e9f205..288d4c5 100644 --- a/src/main/kotlin/me/ddivad/judgebot/services/infractions/InfractionService.kt +++ b/src/main/kotlin/me/ddivad/judgebot/services/infractions/InfractionService.kt @@ -8,8 +8,8 @@ import me.ddivad.judgebot.dataclasses.* import me.ddivad.judgebot.embeds.createInfractionEmbed import me.ddivad.judgebot.services.DatabaseService import me.ddivad.judgebot.services.LoggingService -import me.jakejmattson.discordkt.api.annotations.Service -import me.jakejmattson.discordkt.api.extensions.sendPrivateMessage +import me.jakejmattson.discordkt.annotations.Service +import me.jakejmattson.discordkt.extensions.sendPrivateMessage import org.joda.time.DateTime @Service @@ -46,7 +46,7 @@ class InfractionService(private val configuration: Configuration, PunishmentType.MUTE -> muteService.applyInfractionMute(target, infraction.punishment?.duration!!, "Infraction mute. Please check corresponding infraction embed above.") PunishmentType.BAN -> { val clearTime = infraction.punishment!!.duration?.let { DateTime().millis.plus(it) } - val punishment = Punishment(target.id.asString, InfractionType.Ban, infraction.reason, infraction.moderator, clearTime) + val punishment = Punishment(target.id.toString(), InfractionType.Ban, infraction.reason, infraction.moderator, clearTime) banService.banUser(target, guild, punishment) } } diff --git a/src/main/kotlin/me/ddivad/judgebot/services/infractions/MuteService.kt b/src/main/kotlin/me/ddivad/judgebot/services/infractions/MuteService.kt index 6648749..a29c27c 100644 --- a/src/main/kotlin/me/ddivad/judgebot/services/infractions/MuteService.kt +++ b/src/main/kotlin/me/ddivad/judgebot/services/infractions/MuteService.kt @@ -19,10 +19,10 @@ import me.ddivad.judgebot.embeds.createUnmuteEmbed import me.ddivad.judgebot.services.DatabaseService import me.ddivad.judgebot.services.LoggingService import me.ddivad.judgebot.util.applyRoleWithTimer -import me.jakejmattson.discordkt.api.Discord -import me.jakejmattson.discordkt.api.annotations.Service -import me.jakejmattson.discordkt.api.extensions.sendPrivateMessage -import me.jakejmattson.discordkt.api.extensions.toSnowflake +import me.jakejmattson.discordkt.Discord +import me.jakejmattson.discordkt.annotations.Service +import me.jakejmattson.discordkt.extensions.sendPrivateMessage +import me.jakejmattson.discordkt.extensions.toSnowflake import org.joda.time.DateTime typealias GuildID = String @@ -41,7 +41,7 @@ class MuteService(val configuration: Configuration, private val loggingService: LoggingService) { private val muteTimerMap = hashMapOf, Job>() private suspend fun getMutedRole(guild: Guild) = guild.getRole(configuration[guild.id.value]?.mutedRole?.toSnowflake()!!) - private fun toKey(user: User, guild: Guild) = user.id.asString to guild.id.asString + private fun toKey(user: User, guild: Guild) = user.id.toString() to guild.id.toString() suspend fun initGuilds() { configuration.guildConfigurations.forEach { config -> runBlocking { @@ -77,13 +77,13 @@ class MuteService(val configuration: Configuration, val guild = member.guild.asGuild() val user = member.asUser() val clearTime = DateTime.now().plus(time).millis - val punishment = Punishment(user.id.asString, InfractionType.Mute, reason, "", clearTime) + val punishment = Punishment(user.id.toString(), InfractionType.Mute, reason, "", clearTime) val muteRole = getMutedRole(guild) val key = toKey(user, guild) if (key in muteTimerMap) { muteTimerMap[key]?.cancel() muteTimerMap.remove(key) - databaseService.guilds.removePunishment(guild, member.asUser().id.asString, InfractionType.Mute) + databaseService.guilds.removePunishment(guild, member.asUser().id.toString(), InfractionType.Mute) loggingService.muteOverwritten(guild, member) } databaseService.guilds.addPunishment(guild.asGuild(), punishment) @@ -115,7 +115,7 @@ class MuteService(val configuration: Configuration, loggingService.roleRemoved(guild, user, muteRole) if (checkRoleState(guild, it) == RoleState.Untracked) return@runBlocking } - databaseService.guilds.removePunishment(guild, user.id.asString, InfractionType.Mute) + databaseService.guilds.removePunishment(guild, user.id.toString(), InfractionType.Mute) muteTimerMap[key]?.cancel() muteTimerMap.remove(key) } diff --git a/src/main/kotlin/me/ddivad/judgebot/util/MessageUtils.kt b/src/main/kotlin/me/ddivad/judgebot/util/MessageUtils.kt index f3fe6c7..e6416e5 100644 --- a/src/main/kotlin/me/ddivad/judgebot/util/MessageUtils.kt +++ b/src/main/kotlin/me/ddivad/judgebot/util/MessageUtils.kt @@ -5,7 +5,7 @@ import dev.kord.core.entity.Message import dev.kord.core.entity.User import dev.kord.core.entity.channel.MessageChannel import dev.kord.core.entity.channel.thread.ThreadChannel -import me.jakejmattson.discordkt.api.extensions.jumpLink +import me.jakejmattson.discordkt.extensions.jumpLink suspend fun createFlagMessage(user: User, message: Message, channel: MessageChannel): String { val isThread = channel.type in setOf(ChannelType.PublicGuildThread, ChannelType.PrivateThread)