From d79fc0c85b49d8726bfef814d72d49fec9cb7916 Mon Sep 17 00:00:00 2001 From: NoComment Date: Mon, 27 Mar 2023 16:44:56 +0100 Subject: [PATCH 01/12] Convert to GuildButtonInteraction for Role menu to hopefully fix some errors --- .../lilybot/extensions/util/RoleMenu.kt | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/RoleMenu.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/RoleMenu.kt index 63555f67..c5412ccb 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/RoleMenu.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/RoleMenu.kt @@ -34,7 +34,7 @@ import dev.kord.core.behavior.edit import dev.kord.core.behavior.interaction.respondEphemeral import dev.kord.core.entity.Message import dev.kord.core.entity.Role -import dev.kord.core.event.interaction.ButtonInteractionCreateEvent +import dev.kord.core.event.interaction.GuildButtonInteractionCreateEvent import dev.kord.rest.builder.message.create.embed import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.firstOrNull @@ -419,7 +419,7 @@ class RoleMenu : Extension() { /** * The button event that allows the user to select roles. */ - event { + event { check { anyGuild() failIfNot { @@ -481,7 +481,7 @@ class RoleMenu : Extension() { .toList() .associateBy { it.id } val member = event.interaction.user.asMemberOrNull(guild.id) - val userRoles = member?.roleIds?.filter { it in guildRoles.keys } + val userRoles = member.roleIds.filter { it in guildRoles.keys } event.interaction.respondEphemeral { content = "Use the menu below to select roles." @@ -496,9 +496,7 @@ class RoleMenu : Extension() { label = "@${it.name}", value = it.id.toString() ) { - if (userRoles != null) { - default = it.id in userRoles - } + default = it.id in userRoles } } @@ -507,7 +505,7 @@ class RoleMenu : Extension() { .filter { it in guildRoles.keys } if (event.interaction.values.isEmpty()) { - member?.edit { + member.edit { roles.forEach { member.removeRole(it.id) } @@ -516,26 +514,22 @@ class RoleMenu : Extension() { return@SelectMenu } - val rolesToAdd = if (userRoles != null) { - selectedRoles.filterNot { it in userRoles } - } else { - emptyList() - } - val rolesToRemove = userRoles?.filterNot { it in selectedRoles } + val rolesToAdd = selectedRoles.filterNot { it in userRoles } + val rolesToRemove = userRoles.filterNot { it in selectedRoles } - if (rolesToAdd.isEmpty() && rolesToRemove?.isEmpty() == true) { + if (rolesToAdd.isEmpty() && rolesToRemove.isEmpty()) { respond { content = "You didn't select any different roles, so no changes were made." } return@SelectMenu } - member?.edit { + member.edit { this@edit.roles = member.roleIds.toMutableSet() // toSet() to increase performance. Idea advised this. this@edit.roles!!.addAll(rolesToAdd.toSet()) - rolesToRemove?.toSet()?.let { it1 -> this@edit.roles!!.removeAll(it1) } + this@edit.roles!!.removeAll(rolesToRemove.toSet()) } respond { content = "Your roles have been adjusted." } } From e7d0fc854808ae0fe093cd6e74a86396f473cae6 Mon Sep 17 00:00:00 2001 From: NoComment Date: Mon, 27 Mar 2023 16:54:18 +0100 Subject: [PATCH 02/12] Avoid Illegal argument exceptions in log uploading --- .../lilybot/extensions/events/LogUploading.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/LogUploading.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/LogUploading.kt index 4dd2801d..c2367570 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/LogUploading.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/LogUploading.kt @@ -121,9 +121,13 @@ class LogUploading : Extension() { val thread = event.getGuildOrNull()?.getChannelOfOrNull(it.threadId) ?: return@forEach if (thread.parentId == autoThreadingConfig?.channelId) { - uploadChannel = - event.getGuildOrNull()?.getChannelOfOrNull(it.threadId) - ?: return@forEach + try { + uploadChannel = + event.getGuildOrNull()?.getChannelOfOrNull(it.threadId) + ?: return@forEach + } catch (_: IllegalArgumentException) { + return@forEach + } return@forEach } } From 1884b063a562d2a9c3fc6e42feeb365d13ba1024 Mon Sep 17 00:00:00 2001 From: NoComment Date: Fri, 7 Apr 2023 11:48:33 +0100 Subject: [PATCH 03/12] Fix tags being deleted too early in the edit process, and commit crimes --- libs.versions.toml | 2 +- .../extensions/util/NewsChannelPublishing.kt | 1 + .../lilybot/extensions/util/Reminders.kt | 4 +- .../lilybot/extensions/util/Tags.kt | 206 ++++++++++++------ .../org/hyacinthbots/lilybot/utils/_Utils.kt | 10 +- 5 files changed, 143 insertions(+), 80 deletions(-) diff --git a/libs.versions.toml b/libs.versions.toml index 6bde7aad..dde608d7 100644 --- a/libs.versions.toml +++ b/libs.versions.toml @@ -8,7 +8,7 @@ grgit = "5.0.0" blossom = "1.3.1" # Libraries -kord-extensions = "1.5.7-20230325.173116-4" +kord-extensions = "1.5.7-20230405.201607-5" logging = "3.0.5" logback = "1.4.6" github-api = "1.314" diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/NewsChannelPublishing.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/NewsChannelPublishing.kt index e75ab70c..0f3eaec9 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/NewsChannelPublishing.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/NewsChannelPublishing.kt @@ -16,6 +16,7 @@ import com.kotlindiscord.kord.extensions.pagination.pages.Page import com.kotlindiscord.kord.extensions.pagination.pages.Pages import com.kotlindiscord.kord.extensions.types.respond import dev.kord.common.Locale +import dev.kord.common.asJavaLocale import dev.kord.common.entity.ChannelType import dev.kord.common.entity.Permission import dev.kord.common.entity.Permissions diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/Reminders.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/Reminders.kt index 82eb6390..b78a5538 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/Reminders.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/Reminders.kt @@ -45,7 +45,7 @@ import kotlinx.datetime.TimeZone import org.hyacinthbots.lilybot.database.collections.ReminderCollection import org.hyacinthbots.lilybot.database.entities.ReminderData import org.hyacinthbots.lilybot.utils.botHasChannelPerms -import org.hyacinthbots.lilybot.utils.fitsEmbed +import org.hyacinthbots.lilybot.utils.fitsEmbedField import org.hyacinthbots.lilybot.utils.interval class Reminders : Extension() { @@ -86,7 +86,7 @@ class Reminders : Extension() { val setTime = Clock.System.now() val remindTime = Clock.System.now().plus(arguments.time.toDuration(TimeZone.UTC)) - if (arguments.customMessage != null && arguments.customMessage.fitsEmbed() == false) { + if (arguments.customMessage != null && arguments.customMessage.fitsEmbedField() == false) { respond { content = "Custom Message is too long. Message must be 1024 characters or fewer." } return@action } diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/Tags.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/Tags.kt index e318375f..8f3eea16 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/Tags.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/Tags.kt @@ -21,6 +21,7 @@ import com.kotlindiscord.kord.extensions.pagination.pages.Pages import com.kotlindiscord.kord.extensions.types.respond import com.kotlindiscord.kord.extensions.utils.suggestStringMap import dev.kord.common.Locale +import dev.kord.common.asJavaLocale import dev.kord.common.entity.Permission import dev.kord.common.entity.Permissions import dev.kord.core.behavior.channel.createEmbed @@ -34,6 +35,7 @@ import org.hyacinthbots.lilybot.database.collections.UtilityConfigCollection import org.hyacinthbots.lilybot.extensions.config.ConfigOptions import org.hyacinthbots.lilybot.utils.botHasChannelPerms import org.hyacinthbots.lilybot.utils.getLoggingChannelWithPerms +import org.hyacinthbots.lilybot.utils.trimmedContents /** * The class that holds the commands to create tags commands. @@ -63,16 +65,16 @@ class Tags : Extension() { val tagFromDatabase = TagsCollection().getTag(guild!!.id, arguments.tagName) ?: run { respond { content = "Unable to find tag `${arguments.tagName}` for preview. " + - "Be sure it exists and you've typed it correctly." + "Be sure it exists and you've typed it correctly." } return@action } - if (tagFromDatabase.tagValue.length > 1024) { + if (tagFromDatabase.tagValue.length > 4096) { respond { content = "The body of this tag is too long! Somehow this tag has a body of 1024 characters or" + - "more, which is above the Discord limit. Please re-create this tag!" + "more, which is above the Discord limit. Please re-create this tag!" } return@action } @@ -114,16 +116,16 @@ class Tags : Extension() { val tagFromDatabase = TagsCollection().getTag(guild!!.id, arguments.tagName) ?: run { respond { content = "Unable to find tag `${arguments.tagName}`. " + - "Be sure it exists and you've typed it correctly." + "Be sure it exists and you've typed it correctly." } return@action } - if (tagFromDatabase.tagValue.length > 1024) { + if (tagFromDatabase.tagValue.length > 4096) { respond { content = - "The body of this tag is too long! Somehow this tag has a body of 1024 characters or" + - "more, which is above the Discord limit. Please re-create this tag!" + "The body of this tag is too long! Somehow this tag has a body of 4096 characters or" + + "more, which is above the Discord limit. Please re-create this tag!" } return@action } @@ -200,24 +202,24 @@ class Tags : Extension() { title = "How does the tag system work?" description = "The tag command allows users to add guild specific 'tag' commands at runtime to their " + - "guild. **Tags are like custom commands**, they can do say what ever you want " + - "them to say.\n\n**To create a tag**, if you have the Moderate Members " + - "permission, run the following command:\n`/tag-create <value>`\n " + - "You will be prompted to enter a name for the tag, a title for the tag, and the " + - "value for the tag. This is what will appear in the embed of your tag. You can " + - "enter any character you like into all of these inputs.\n\n**To use a tag**, " + - "run the following command:\n`/tag <name>`\nYou will be prompted to enter a " + - "tag name, but will have an autocomplete window to aid you. The window will " + - "list all the tags that the guild has.\n\n**To delete a tag**, if you have " + - "the Moderate Members permission, run the following command:\n" + - "`/tag-delete <name>`\nYou will be prompted to enter the name of the tag, " + - "again aided by autocomplete.\n`/tag-edit`\nYou will be prompted to enter a " + - "tag name, but will have an autocomplete window to aid you. The window will " + - "list all the tags that the guild has. From there you can enter a new name, title " + - "or value. None of these are mandatory.\n`/tag-list`\nDisplays a paginated list " + - "of all tags for this guild. There are 10 tags on each page.\n\n**Guilds can " + - "have any number of tags they like.** The limit on `tagValue` for tags is 1024 " + - "characters, which is the embed description limit enforced by Discord." + "guild. **Tags are like custom commands**, they can do say what ever you want " + + "them to say.\n\n**To create a tag**, if you have the Moderate Members " + + "permission, run the following command:\n`/tag-create <name> <title> <value>`\n " + + "You will be prompted to enter a name for the tag, a title for the tag, and the " + + "value for the tag. This is what will appear in the embed of your tag. You can " + + "enter any character you like into all of these inputs.\n\n**To use a tag**, " + + "run the following command:\n`/tag <name>`\nYou will be prompted to enter a " + + "tag name, but will have an autocomplete window to aid you. The window will " + + "list all the tags that the guild has.\n\n**To delete a tag**, if you have " + + "the Moderate Members permission, run the following command:\n" + + "`/tag-delete <name>`\nYou will be prompted to enter the name of the tag, " + + "again aided by autocomplete.\n`/tag-edit`\nYou will be prompted to enter a " + + "tag name, but will have an autocomplete window to aid you. The window will " + + "list all the tags that the guild has. From there you can enter a new name, title " + + "or value. None of these are mandatory.\n`/tag-list`\nDisplays a paginated list " + + "of all tags for this guild. There are 10 tags on each page.\n\n**Guilds can " + + "have any number of tags they like.** The limit on `tagValue` for tags is 1024 " + + "characters, which is the embed description limit enforced by Discord." color = DISCORD_BLURPLE timestamp = Clock.System.now() } @@ -250,12 +252,18 @@ class Tags : Extension() { return@action } - if (arguments.tagValue.length > 1024) { + if (arguments.tagValue.length > 4096) { respond { - content = "That tag is body is too long! Due to Discord limitations tag bodies can only be " + - "1024 characters or less!" + content = + "That tag's body is too long! Due to Discord limitations tag bodies can only be " + + "4096 characters or less!" } return@action + } else if (arguments.tagTitle.length > 256) { + respond { + content = "That tag's title is too long! Due to Discord limitations tag titles can only be " + + "256 characters or less" + } } TagsCollection().setTag( @@ -268,29 +276,62 @@ class Tags : Extension() { val utilityLog = getLoggingChannelWithPerms(ConfigOptions.UTILITY_LOG, this.getGuild()!!) ?: return@action - utilityLog.createEmbed { - title = "Tag created!" - description = "The tag `${arguments.tagName}` has been created" - field { - name = "Tag title:" - value = "`${arguments.tagTitle}`" - inline = false - } - field { - name = "Tag value:" - value = "```${arguments.tagValue}```" - inline = false - } - field { - name = "Tag appearance" - value = arguments.tagAppearance + if (arguments.tagValue.length <= 1024) { + utilityLog.createEmbed { + title = "Tag created!" + description = "The tag `${arguments.tagName}` has been created" + field { + name = "Tag title:" + value = "`${arguments.tagTitle}`" + inline = false + } + field { + name = "Tag value:" + value = "```${arguments.tagValue}```" + inline = false + } + field { + name = "Tag appearance" + value = arguments.tagAppearance + } + footer { + icon = user.asUserOrNull()?.avatar?.url + text = "Requested by ${user.asUserOrNull()?.tag}" + } + timestamp = Clock.System.now() + color = DISCORD_GREEN } - footer { - icon = user.asUserOrNull()?.avatar?.url - text = "Requested by ${user.asUserOrNull()?.tag}" + } else { + utilityLog.createMessage { + embed { + title = "Tag created!" + description = "The tag `${arguments.tagName}` has been created" + field { + name = "Tag title:" + value = "`${arguments.tagTitle}`" + inline = false + } + field { + name = "Tag value:" + value = "${arguments.tagValue.trimmedContents(1024)}" + inline = false + } + color = DISCORD_GREEN + } + embed { + description = arguments.tagValue.substring(1018) + field { + name = "Tag appearance" + value = arguments.tagAppearance + } + footer { + icon = user.asUserOrNull()?.avatar?.url + text = "Requested by ${user.asUserOrNull()?.tag}" + } + timestamp = Clock.System.now() + color = DISCORD_GREEN + } } - timestamp = Clock.System.now() - color = DISCORD_GREEN } respond { @@ -360,27 +401,33 @@ class Tags : Extension() { } action { - if (TagsCollection().getTag(guild!!.id, arguments.tagName) == null) { + val originalTag = TagsCollection().getTag(guild!!.id, arguments.tagName) + if (originalTag == null) { respond { content = "Unable to find tag `${arguments.tagName}`! Does this tag exist?" } return@action } - val originalName = TagsCollection().getTag(guild!!.id, arguments.tagName)!!.name - val originalTitle = TagsCollection().getTag(guild!!.id, arguments.tagName)!!.tagTitle - val originalValue = TagsCollection().getTag(guild!!.id, arguments.tagName)!!.tagValue - val originalAppearance = TagsCollection().getTag(guild!!.id, arguments.tagName)!!.tagAppearance - - TagsCollection().removeTag(guild!!.id, arguments.tagName) + val originalName = originalTag.name + val originalTitle = originalTag.tagTitle + val originalValue = originalTag.tagValue + val originalAppearance = originalTag.tagAppearance - if (arguments.newValue != null && arguments.newValue!!.length > 1024) { + if (arguments.newValue != null && arguments.newValue!!.length > 4096) { respond { content = - "That tag is body is too long! Due to Discord limitations tag bodies can only be " + - "1024 characters or less!" + "That tag's body is too long! Due to Discord limitations tag bodies can only be " + + "4096 characters or less!" } return@action + } else if (arguments.newTitle != null && arguments.newTitle!!.length > 256) { + respond { + content = "That tag's title is too long! Due to Discord limitations tag titles can only be " + + "256 characters or less" + } } + TagsCollection().removeTag(guild!!.id, arguments.tagName) + TagsCollection().setTag( guild!!.id, arguments.newName ?: originalName, @@ -414,14 +461,6 @@ class Tags : Extension() { "${arguments.newTitle} -> ${arguments.newTitle!!}" } } - field { - name = "Value" - value = if (arguments.newValue.isNullOrEmpty()) { - originalValue - } else { - "$originalValue -> ${arguments.newValue!!}" - } - } field { name = "Tag appearance" value = if (arguments.newAppearance.isNullOrEmpty()) { @@ -430,13 +469,36 @@ class Tags : Extension() { "$originalAppearance -> ${arguments.newAppearance}" } } - footer { - text = "Edited by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url - } - timestamp = Clock.System.now() color = DISCORD_YELLOW } + if (arguments.newValue.isNullOrEmpty()) { + utilityLog.createEmbed { + title = "Value" + description = originalValue + footer { + text = "Edited by ${user.asUserOrNull()?.tag}" + icon = user.asUserOrNull()?.avatar?.url + } + timestamp = Clock.System.now() + color = DISCORD_YELLOW + } + } else { + utilityLog.createEmbed { + title = "Old value" + description = originalValue + color = DISCORD_YELLOW + } + utilityLog.createEmbed { + title = "New value" + description = arguments.newValue + footer { + text = "Edited by ${user.asUserOrNull()?.tag}" + icon = user.asUserOrNull()?.avatar?.url + } + timestamp = Clock.System.now() + color = DISCORD_YELLOW + } + } } } diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/utils/_Utils.kt b/src/main/kotlin/org/hyacinthbots/lilybot/utils/_Utils.kt index 7b4ec581..7b5f7405 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/utils/_Utils.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/utils/_Utils.kt @@ -92,7 +92,7 @@ fun getDmResult(shouldDm: Boolean, dm: Message?): DmResult = * @author NoComment1105 * @since 4.2.0 */ -fun String?.fitsEmbed(): Boolean? { +fun String?.fitsEmbedField(): Boolean? { this ?: return null return this.length <= 1024 } @@ -122,7 +122,7 @@ fun String?.ifNullOrEmpty(defaultValue: () -> String): String = fun Message?.trimmedContents(): String? { this ?: return null return if (this.content.length > 1024) { - this.content.substring(0, 1020) + " ..." + this.content.substring(0, 1021) + "..." } else { this.content } @@ -136,7 +136,7 @@ fun Message?.trimmedContents(): String? { fun String?.trimmedContents(): String? { this ?: return null return if (this.length > 1024) { - this.substring(0, 1020) + " ..." + this.substring(0, 1021) + "..." } else { this } @@ -167,7 +167,7 @@ fun Message?.trimmedContents(desiredLength: Int): String? { this ?: return null val useRegularLength = this.content.length < desiredLength.coerceIn(1, 1020) return if (this.content.length > desiredLength.coerceIn(1, 1020)) { - this.content.substring(0, if (useRegularLength) this.content.length else desiredLength) + "..." + this.content.substring(0, if (useRegularLength) this.content.length else desiredLength.minus(3)) + "..." } else { this.content } @@ -182,7 +182,7 @@ fun String?.trimmedContents(desiredLength: Int): String? { this ?: return null val useRegularLength = this.length < desiredLength.coerceIn(1, 1020) return if (this.length > desiredLength.coerceIn(1, 1020)) { - this.substring(0, if (useRegularLength) this.length else desiredLength) + "..." + this.substring(0, if (useRegularLength) this.length else desiredLength.minus(3)) + "..." } else { this } From 980dbc926d0fd5f99a15fed9158b3aae0acfc8c3 Mon Sep 17 00:00:00 2001 From: NoComment <nocomment1105@outlook.com> Date: Fri, 14 Apr 2023 16:42:37 +0100 Subject: [PATCH 04/12] Update Kord and remove duplicated code --- libs.versions.toml | 2 +- .../lilybot/extensions/config/Config.kt | 14 +++--- .../extensions/events/AutoThreading.kt | 4 +- .../lilybot/extensions/events/LogUploading.kt | 20 ++++---- .../extensions/events/MemberLogging.kt | 8 ++-- .../extensions/events/MessageDelete.kt | 3 +- .../lilybot/extensions/events/MessageEdit.kt | 2 +- .../extensions/moderation/LockingCommands.kt | 8 ++-- .../moderation/ModerationCommands.kt | 8 ++-- .../lilybot/extensions/moderation/Report.kt | 2 +- .../lilybot/extensions/util/GalleryChannel.kt | 4 +- .../lilybot/extensions/util/InfoCommands.kt | 4 +- .../lilybot/extensions/util/ModUtilities.kt | 10 ++-- .../extensions/util/NewsChannelPublishing.kt | 4 +- .../extensions/util/PublicUtilities.kt | 4 +- .../lilybot/extensions/util/RoleMenu.kt | 12 ++--- .../lilybot/extensions/util/Tags.kt | 47 +++++++++---------- .../lilybot/extensions/util/ThreadControl.kt | 2 +- .../lilybot/utils/ResponseHelper.kt | 2 +- 19 files changed, 78 insertions(+), 82 deletions(-) diff --git a/libs.versions.toml b/libs.versions.toml index dde608d7..3c3b162c 100644 --- a/libs.versions.toml +++ b/libs.versions.toml @@ -8,7 +8,7 @@ grgit = "5.0.0" blossom = "1.3.1" # Libraries -kord-extensions = "1.5.7-20230405.201607-5" +kord-extensions = "1.5.7-20230412.093301-8" logging = "3.0.5" logback = "1.4.6" github-api = "1.314" diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/config/Config.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/config/Config.kt index c74d4a08..f6476cc0 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/config/Config.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/config/Config.kt @@ -332,7 +332,7 @@ class Config : Extension() { footer { text = "Configured by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } } @@ -453,7 +453,7 @@ class Config : Extension() { footer { text = "Configured by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } } @@ -508,7 +508,7 @@ class Config : Extension() { }" footer { text = "Config cleared by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } } } @@ -531,7 +531,7 @@ class Config : Extension() { title = "Config cleared: Moderation" footer { text = "Config cleared by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } } } @@ -553,7 +553,7 @@ class Config : Extension() { title = "Config cleared: Logging" footer { text = "Config cleared by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } } } @@ -575,7 +575,7 @@ class Config : Extension() { title = "Config cleared: Utility" footer { text = "Config cleared by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } } } @@ -590,7 +590,7 @@ class Config : Extension() { title = "All configs cleared" footer { text = "Configs cleared by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } } } diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/AutoThreading.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/AutoThreading.kt index aff5a664..4b240277 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/AutoThreading.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/AutoThreading.kt @@ -183,7 +183,7 @@ class AutoThreading : Extension() { } footer { text = user.asUser().tag - icon = user.asUser().avatar?.url + icon = user.asUser().avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() color = DISCORD_BLACK @@ -235,7 +235,7 @@ class AutoThreading : Extension() { } footer { text = user.asUser().tag - icon = user.asUser().avatar?.url + icon = user.asUser().avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() color = DISCORD_BLACK diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/LogUploading.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/LogUploading.kt index c2367570..429f9bbe 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/LogUploading.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/LogUploading.kt @@ -166,7 +166,7 @@ class LogUploading : Extension() { "(i.e. log or crash report) if the issue persists.\n\n$DEPRECATION_MESSAGE" footer { text = eventMessage.author?.tag ?: "" - icon = eventMessage.author?.avatar?.url + icon = eventMessage.author?.avatar?.cdnUrl?.toUrl() } color = DISCORD_PINK } @@ -185,7 +185,7 @@ class LogUploading : Extension() { text = "Uploaded by ${eventMessage.author?.tag ?: eventMember?.asUserOrNull()?.tag}" icon = - eventMessage.author?.avatar?.url ?: eventMember?.asUserOrNull()?.avatar?.url + eventMessage.author?.avatar?.cdnUrl?.toUrl() ?: eventMember?.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } color = DISCORD_PINK } @@ -206,8 +206,8 @@ class LogUploading : Extension() { footer { text = "Uploaded by ${eventMessage.author?.tag ?: eventMember.asUserOrNull()?.tag}" - icon = eventMessage.author?.avatar?.url - ?: eventMember.asUserOrNull()?.avatar?.url + icon = eventMessage.author?.avatar?.cdnUrl?.toUrl() + ?: eventMember.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() color = DISCORD_PINK @@ -223,8 +223,8 @@ class LogUploading : Extension() { footer { text = "Uploaded by ${eventMessage.author?.tag ?: eventMember.asUserOrNull()?.tag}" - icon = eventMessage.author?.avatar?.url - ?: eventMember.asUserOrNull()?.avatar?.url + icon = eventMessage.author?.avatar?.cdnUrl?.toUrl() + ?: eventMember.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() color = DISCORD_PINK @@ -246,8 +246,8 @@ class LogUploading : Extension() { footer { text = "Uploaded by ${eventMessage.author?.tag ?: eventMember.asUserOrNull()?.tag}" - icon = eventMessage.author?.avatar?.url - ?: eventMember.asUserOrNull()?.avatar?.url + icon = eventMessage.author?.avatar?.cdnUrl?.toUrl() + ?: eventMember.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() color = DISCORD_RED @@ -327,7 +327,7 @@ class LogUploading : Extension() { color = DISCORD_RED footer { text = "Disabled by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } } } @@ -368,7 +368,7 @@ class LogUploading : Extension() { color = DISCORD_GREEN footer { text = "Enabled by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } } } diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/MemberLogging.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/MemberLogging.kt index a73f8780..f2f031b8 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/MemberLogging.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/MemberLogging.kt @@ -46,7 +46,7 @@ class MemberLogging : Extension() { memberLog?.createEmbed { author { name = "User joined the server!" - icon = event.member.avatar?.url + icon = event.member.avatar?.cdnUrl?.toUrl() } field { name = "Welcome:" @@ -77,7 +77,7 @@ class MemberLogging : Extension() { embed { author { name = "Welcome ${event.member.username}" - icon = event.member.avatar?.url + icon = event.member.avatar?.cdnUrl?.toUrl() } description = if (config.publicMemberLogData?.joinMessage != null) { config.publicMemberLogData.joinMessage @@ -110,7 +110,7 @@ class MemberLogging : Extension() { memberLog?.createEmbed { author { name = "User left the server!" - icon = event.user.avatar?.url + icon = event.user.avatar?.cdnUrl?.toUrl() } field { name = "Goodbye:" @@ -138,7 +138,7 @@ class MemberLogging : Extension() { publicLog?.createEmbed { author { name = "Goodbye ${event.user.username}" - icon = event.user.avatar?.url + icon = event.user.avatar?.cdnUrl?.toUrl() } description = if (config.publicMemberLogData?.leaveMessage != null) { config.publicMemberLogData.leaveMessage diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/MessageDelete.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/MessageDelete.kt index e85b4c0c..45a6873e 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/MessageDelete.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/MessageDelete.kt @@ -75,7 +75,6 @@ class MessageDelete : Extension() { } } - @Suppress("RemoveExplicitTypeArguments") // It is used you absolute buffoon event<MessageBulkDeleteEvent> { check { anyGuild() @@ -169,7 +168,7 @@ class MessageDelete : Extension() { messageLog.createEmbed { author { name = "Message deleted" - icon = proxiedMessage?.member?.avatarUrl ?: message.author?.avatar?.url + icon = proxiedMessage?.member?.avatarUrl ?: message.author?.avatar?.cdnUrl?.toUrl() } description = "Location: ${message.channel.mention} " + diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/MessageEdit.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/MessageEdit.kt index 9e4505e3..acae881b 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/MessageEdit.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/MessageEdit.kt @@ -88,7 +88,7 @@ class MessageEdit : Extension() { color = DISCORD_YELLOW author { name = "Message Edited" - icon = proxiedMessage?.member?.avatarUrl ?: message.author?.avatar?.url + icon = proxiedMessage?.member?.avatarUrl ?: message.author?.avatar?.cdnUrl?.toUrl() } description = "Location: ${message.channel.mention} " + diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/moderation/LockingCommands.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/moderation/LockingCommands.kt index 60445d34..705fb135 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/moderation/LockingCommands.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/moderation/LockingCommands.kt @@ -104,7 +104,7 @@ class LockingCommands : Extension() { description = "${targetChannel.mention} has been locked.\n\n**Reason:** ${arguments.reason}" footer { text = user.asUserOrNull()?.tag ?: "Unable to get tag" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() color = DISCORD_RED @@ -159,7 +159,7 @@ class LockingCommands : Extension() { description = "**Reason:** ${arguments.reason}" footer { text = user.asUserOrNull()?.tag ?: "Unable to get user tag" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() color = DISCORD_RED @@ -243,7 +243,7 @@ class LockingCommands : Extension() { description = "${targetChannel.mention} has been unlocked." footer { text = user.asUserOrNull()?.tag ?: "Unable to get user tag" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() color = DISCORD_GREEN @@ -296,7 +296,7 @@ class LockingCommands : Extension() { title = "Server unlocked" footer { text = user.asUserOrNull()?.tag ?: "Unable to get user tag" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() color = DISCORD_GREEN diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/moderation/ModerationCommands.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/moderation/ModerationCommands.kt index 25a8909e..fcad7f10 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/moderation/ModerationCommands.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/moderation/ModerationCommands.kt @@ -640,7 +640,7 @@ class ModerationCommands : Extension() { } footer { text = user.asUserOrNull()?.tag ?: "Unable to get user tag" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() color = DISCORD_GREEN @@ -767,7 +767,7 @@ class ModerationCommands : Extension() { description = "Action occurred in ${textChannel.mention}" footer { text = user.asUserOrNull()?.tag ?: "Unable to get user tag" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } color = DISCORD_BLACK } @@ -869,7 +869,7 @@ class ModerationCommands : Extension() { } footer { text = "Requested by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() color = DISCORD_BLACK @@ -1312,7 +1312,7 @@ private fun EmbedBuilder.warnTimeoutLog(timeoutNumber: Int, moderator: User, tar } footer { text = moderator.tag - icon = moderator.avatar?.url + icon = moderator.avatar?.cdnUrl?.toUrl() } color = DISCORD_BLACK timestamp = Clock.System.now() diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/moderation/Report.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/moderation/Report.kt index 3fe392e0..daa78d2f 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/moderation/Report.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/moderation/Report.kt @@ -199,7 +199,7 @@ class Report : Extension() { } footer { text = "Reported by: ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() color = DISCORD_RED diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/GalleryChannel.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/GalleryChannel.kt index c50de7d0..e3dbd795 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/GalleryChannel.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/GalleryChannel.kt @@ -83,7 +83,7 @@ class GalleryChannel : Extension() { description = "${channel.mention} was added as a Gallery channel" footer { text = "Requested by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } color = DISCORD_GREEN } @@ -128,7 +128,7 @@ class GalleryChannel : Extension() { description = "${channel.mention} was removed as a Gallery channel" footer { text = "Requested by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } color = DISCORD_RED } diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/InfoCommands.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/InfoCommands.kt index d7b59510..6f47de43 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/InfoCommands.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/InfoCommands.kt @@ -41,7 +41,7 @@ class InfoCommands : Extension() { respond { embed { thumbnail { - url = event.kord.getSelf().avatar!!.url + url = event.kord.getSelf().avatar?.cdnUrl!!.toUrl() } title = "What is LilyBot?" description = "Lily is a FOSS multi-purpose bot for Discord created by " + @@ -103,7 +103,7 @@ class InfoCommands : Extension() { respond { embed { thumbnail { - url = event.kord.getSelf().avatar!!.url + url = event.kord.getSelf().avatar?.cdnUrl!!.toUrl() } title = "Info about LilyBot" description = "Lily is a FOSS multi-purpose bot for Discord created by " + diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/ModUtilities.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/ModUtilities.kt index 0e85ff99..8d92eaea 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/ModUtilities.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/ModUtilities.kt @@ -143,7 +143,7 @@ class ModUtilities : Extension() { } footer { text = user.asUserOrNull()?.tag ?: "Unable to get user tag" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() if (arguments.embed) { @@ -239,7 +239,7 @@ class ModUtilities : Extension() { } footer { text = "Edited by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } color = DISCORD_WHITE timestamp = Clock.System.now() @@ -310,7 +310,7 @@ class ModUtilities : Extension() { } footer { text = "Edited by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() color = DISCORD_WHITE @@ -369,7 +369,7 @@ class ModUtilities : Extension() { description = "Lily's presence has been set to `${arguments.presenceArgument}`" footer { text = user.asUserOrNull()?.tag ?: "Unable to get user tag" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } color = DISCORD_BLACK } @@ -407,7 +407,7 @@ class ModUtilities : Extension() { } footer { text = user.asUserOrNull()?.tag ?: "Unable to get user tag" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } color = DISCORD_BLACK } diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/NewsChannelPublishing.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/NewsChannelPublishing.kt index 0f3eaec9..946b1713 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/NewsChannelPublishing.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/NewsChannelPublishing.kt @@ -112,7 +112,7 @@ class NewsChannelPublishing : Extension() { } footer { text = "Set by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() color = DISCORD_YELLOW @@ -157,7 +157,7 @@ class NewsChannelPublishing : Extension() { } footer { text = "Removed by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() color = DISCORD_YELLOW diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/PublicUtilities.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/PublicUtilities.kt index 35f34efe..80560eac 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/PublicUtilities.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/PublicUtilities.kt @@ -223,7 +223,7 @@ class PublicUtilities : Extension() { footer { text = "Nickname accepted by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() @@ -272,7 +272,7 @@ class PublicUtilities : Extension() { footer { text = "Nickname denied by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/RoleMenu.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/RoleMenu.kt index c5412ccb..fe176a22 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/RoleMenu.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/RoleMenu.kt @@ -149,7 +149,7 @@ class RoleMenu : Extension() { } footer { text = "Created by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } } components { @@ -225,7 +225,7 @@ class RoleMenu : Extension() { "${channel.mention}." footer { text = "Added by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } } components { @@ -291,7 +291,7 @@ class RoleMenu : Extension() { "${channel.mention}." footer { text = "Removed by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } } components { @@ -402,7 +402,7 @@ class RoleMenu : Extension() { description = "A pronoun role menu was created in ${channel.mention}." footer { text = "Created by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } } components { @@ -678,7 +678,7 @@ class RoleMenu : Extension() { description = "${arguments.role.mention} was added as a subscribable role" footer { text = "Added by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } } } @@ -734,7 +734,7 @@ class RoleMenu : Extension() { description = "${arguments.role.mention} was removed as a subscribable role" footer { text = "Removed by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } } } diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/Tags.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/Tags.kt index 8f3eea16..272498f6 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/Tags.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/Tags.kt @@ -24,10 +24,12 @@ import dev.kord.common.Locale import dev.kord.common.asJavaLocale import dev.kord.common.entity.Permission import dev.kord.common.entity.Permissions +import dev.kord.core.behavior.UserBehavior import dev.kord.core.behavior.channel.createEmbed import dev.kord.core.behavior.channel.createMessage import dev.kord.core.behavior.getChannelOfOrNull import dev.kord.core.entity.channel.GuildMessageChannel +import dev.kord.rest.builder.message.EmbedBuilder import dev.kord.rest.builder.message.create.embed import kotlinx.datetime.Clock import org.hyacinthbots.lilybot.database.collections.TagsCollection @@ -142,7 +144,7 @@ class Tags : Extension() { description = tagFromDatabase.tagValue footer { text = "Tag requested by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } color = DISCORD_BLURPLE } @@ -172,7 +174,7 @@ class Tags : Extension() { } footer { text = "User ID: ${user.asUserOrNull()?.id}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() } @@ -290,16 +292,7 @@ class Tags : Extension() { value = "```${arguments.tagValue}```" inline = false } - field { - name = "Tag appearance" - value = arguments.tagAppearance - } - footer { - icon = user.asUserOrNull()?.avatar?.url - text = "Requested by ${user.asUserOrNull()?.tag}" - } - timestamp = Clock.System.now() - color = DISCORD_GREEN + appearanceFooter(arguments.tagAppearance, user) } } else { utilityLog.createMessage { @@ -320,16 +313,7 @@ class Tags : Extension() { } embed { description = arguments.tagValue.substring(1018) - field { - name = "Tag appearance" - value = arguments.tagAppearance - } - footer { - icon = user.asUserOrNull()?.avatar?.url - text = "Requested by ${user.asUserOrNull()?.tag}" - } - timestamp = Clock.System.now() - color = DISCORD_GREEN + appearanceFooter(arguments.tagAppearance, user) } } } @@ -377,7 +361,7 @@ class Tags : Extension() { description = "The tag ${arguments.tagName} was deleted" footer { text = user.asUserOrNull()?.tag ?: "Unable to get user tag" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } color = DISCORD_RED } @@ -477,7 +461,7 @@ class Tags : Extension() { description = originalValue footer { text = "Edited by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() color = DISCORD_YELLOW @@ -493,7 +477,7 @@ class Tags : Extension() { description = arguments.newValue footer { text = "Edited by ${user.asUserOrNull()?.tag}" - icon = user.asUserOrNull()?.avatar?.url + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } timestamp = Clock.System.now() color = DISCORD_YELLOW @@ -563,6 +547,19 @@ class Tags : Extension() { } } + private suspend fun EmbedBuilder.appearanceFooter(tagAppearance: String, user: UserBehavior) { + field { + name = "Tag appearance" + value = tagAppearance + } + footer { + icon = user.asUserOrNull()?.avatar?.cdnUrl?.toUrl() + text = "Requested by ${user.asUserOrNull()?.tag}" + } + timestamp = Clock.System.now() + color = DISCORD_GREEN + } + inner class CallTagArgs : Arguments() { /** The named identifier of the tag the user would like. */ val tagName by string { diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/ThreadControl.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/ThreadControl.kt index 9557255c..ee38a39b 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/ThreadControl.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/ThreadControl.kt @@ -202,7 +202,7 @@ class ThreadControl : Extension() { if (member != oldOwner) { footer { text = "Transferred by ${member.mention}" - icon = member.avatar?.url + icon = member.avatar?.cdnUrl?.toUrl() } } timestamp = Clock.System.now() diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/utils/ResponseHelper.kt b/src/main/kotlin/org/hyacinthbots/lilybot/utils/ResponseHelper.kt index fbf03b84..8a3d3386 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/utils/ResponseHelper.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/utils/ResponseHelper.kt @@ -31,7 +31,7 @@ suspend inline fun EmbedBuilder.baseModerationEmbed(reason: String?, targetUser: } footer { text = "Requested by ${commandUser.asUserOrNull()?.tag}" - icon = commandUser.asUserOrNull()?.avatar?.url + icon = commandUser.asUserOrNull()?.avatar?.cdnUrl?.toUrl() } } From 58a443872109c85dd153283c5e3eaa89f6356ddb Mon Sep 17 00:00:00 2001 From: NoComment <nocomment1105@outlook.com> Date: Fri, 14 Apr 2023 17:02:59 +0100 Subject: [PATCH 05/12] Upgradle 8.1 --- gradle/wrapper/gradle-wrapper.jar | Bin 61608 -> 62076 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 7 ++++--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index ccebba7710deaf9f98673a68957ea02138b60d0a..c1962a79e29d3e0ab67b14947c167a862655af9b 100644 GIT binary patch delta 8979 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 F{TFmrHLU;u delta 8469 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bdc9a83b..0c85a1f7 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 79a61d42..aeb74cbb 100755 --- a/gradlew +++ b/gradlew @@ -85,9 +85,6 @@ done APP_BASE_NAME=${0##*/} APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -197,6 +194,10 @@ if "$cygwin" || "$msys" ; then done fi + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in From 3d58de0072cfaa817e37c30c2cac8324e4648497 Mon Sep 17 00:00:00 2001 From: NoComment <nocomment1105@outlook.com> Date: Thu, 27 Apr 2023 08:49:10 +0100 Subject: [PATCH 06/12] Update deps --- gradle.properties | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- libs.versions.toml | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gradle.properties b/gradle.properties index cefb4964..0d3bb75f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ # suppress inspection "UnusedProperty" for whole file # Gradle props -org.gradle.jvmargs=-Xmx1536m -XX:MaxMetaspaceSize=1536m +org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=2048m org.gradle.parallel=true kotlin.incremental=true kotlin.code.style=official diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0c85a1f7..37aef8d3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/libs.versions.toml b/libs.versions.toml index 3c3b162c..b6918d6b 100644 --- a/libs.versions.toml +++ b/libs.versions.toml @@ -1,18 +1,18 @@ [versions] # Plugins -kotlin = "1.8.10" +kotlin = "1.8.21" shadow = "8.1.1" detekt = "1.22.0" git-hooks = "0.0.2" -grgit = "5.0.0" +grgit = "5.2.0" blossom = "1.3.1" # Libraries kord-extensions = "1.5.7-20230412.093301-8" logging = "3.0.5" -logback = "1.4.6" +logback = "1.4.7" github-api = "1.314" -kmongo = "4.8.0" +kmongo = "4.9.0" cozy-welcome = "1.0.1-SNAPSHOT" dma = "0.2.0-SNAPSHOT" docgenerator = "0.1.2-SNAPSHOT" From 3d785afb07b52c8da47ae84f2184d5820fd9285c Mon Sep 17 00:00:00 2001 From: NoComment <nocomment1105@outlook.com> Date: Thu, 27 Apr 2023 10:06:23 +0100 Subject: [PATCH 07/12] Make people aware when lily can't delete gallery messages --- .../lilybot/extensions/util/GalleryChannel.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/GalleryChannel.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/GalleryChannel.kt index e3dbd795..22a360a6 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/GalleryChannel.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/GalleryChannel.kt @@ -11,11 +11,15 @@ import com.kotlindiscord.kord.extensions.extensions.ephemeralSlashCommand import com.kotlindiscord.kord.extensions.extensions.event import com.kotlindiscord.kord.extensions.types.respond import com.kotlindiscord.kord.extensions.utils.delete +import com.kotlindiscord.kord.extensions.utils.permissionsForMember import com.kotlindiscord.kord.extensions.utils.respond import dev.kord.common.entity.MessageType import dev.kord.common.entity.Permission import dev.kord.common.entity.Permissions +import dev.kord.core.behavior.channel.asChannelOf import dev.kord.core.behavior.channel.createEmbed +import dev.kord.core.behavior.channel.createMessage +import dev.kord.core.entity.channel.GuildMessageChannel import dev.kord.core.event.message.MessageCreateEvent import dev.kord.core.exception.EntityNotFoundException import dev.kord.rest.builder.message.create.embed @@ -190,6 +194,16 @@ class GalleryChannel : Extension() { GalleryChannelCollection().getChannels(event.guildId!!).forEach { // If there are no attachments to the message and the channel we're in is an image channel if (event.message.channelId == it.channelId && event.message.attachments.isEmpty()) { + if (!event.message.channel.asChannelOf<GuildMessageChannel>().permissionsForMember(kord.selfId) + .contains(Permission.ManageMessages) + ) { + event.message.channel.createMessage { + "Hi! This is a gallery channel, but I don't have Manage Messages for this " + + "channel, therefore I cannot delete messages that don't contain images! Could " + + "someone ask staff fix it please? Thanks!" + } + return@forEach + } // We delay to give the message a chance to populate with an embed, if it is a link to imgur etc. delay(0.25.seconds.inWholeMilliseconds) if (event.message.embeds.isEmpty()) { // If there is still no embed, we delete the message From 4c8b1c2f038dbb18692b5c7ae1e44809e8f2067d Mon Sep 17 00:00:00 2001 From: NoComment <nocomment1105@outlook.com> Date: Thu, 27 Apr 2023 10:18:20 +0100 Subject: [PATCH 08/12] Check mentioning roles properly and take into account master permission --- .../lilybot/extensions/config/Config.kt | 2 +- .../extensions/events/AutoThreading.kt | 3 ++- .../extensions/events/ModThreadInviting.kt | 3 ++- .../org/hyacinthbots/lilybot/utils/_Utils.kt | 22 +++++++++++++------ 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/config/Config.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/config/Config.kt index f6476cc0..5781e346 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/config/Config.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/config/Config.kt @@ -99,7 +99,7 @@ class Config : Extension() { return@action } - if (!canPingRole(arguments.moderatorRole) && arguments.moderatorRole != null) { + if (!canPingRole(arguments.moderatorRole, guild!!.id, this@ephemeralSubCommand.kord)) { respond { content = "I cannot use the role: ${arguments.moderatorRole!!.mention}, because it is not mentionable by " + diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/AutoThreading.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/AutoThreading.kt index 4b240277..5b5c136d 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/AutoThreading.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/AutoThreading.kt @@ -53,6 +53,7 @@ import org.hyacinthbots.lilybot.database.collections.ThreadsCollection import org.hyacinthbots.lilybot.database.entities.AutoThreadingData import org.hyacinthbots.lilybot.extensions.config.ConfigOptions import org.hyacinthbots.lilybot.utils.botHasChannelPerms +import org.hyacinthbots.lilybot.utils.canPingRole import org.hyacinthbots.lilybot.utils.getLoggingChannelWithPerms class AutoThreading : Extension() { @@ -90,7 +91,7 @@ class AutoThreading : Extension() { } // Check if the role can be pinged - if (arguments.role?.mentionable == false) { + if (canPingRole(arguments.role, guild!!.id, this@unsafeSubCommand.kord)) { ackEphemeral() respondEphemeral { content = "Lily cannot mention this role. Please fix the role's permissions and try again." diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/ModThreadInviting.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/ModThreadInviting.kt index 2458ddcc..0bb51484 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/ModThreadInviting.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/events/ModThreadInviting.kt @@ -10,6 +10,7 @@ import dev.kord.core.supplier.EntitySupplyStrategy import kotlinx.coroutines.delay import org.hyacinthbots.lilybot.database.collections.AutoThreadingCollection import org.hyacinthbots.lilybot.database.collections.ModerationConfigCollection +import org.hyacinthbots.lilybot.utils.canPingRole class ModThreadInviting : Extension() { override val name: String = "mod-thread-inviting" @@ -41,7 +42,7 @@ class ModThreadInviting : Extension() { val moderatorRole = channel.guild.getRoleOrNull(config.role) ?: return@action - if (!moderatorRole.mentionable) return@action + if (!canPingRole(moderatorRole, event.channel.guildId, kord)) return@action val message = channel.createMessage { content = "Placeholder message" diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/utils/_Utils.kt b/src/main/kotlin/org/hyacinthbots/lilybot/utils/_Utils.kt index 7b5f7405..4ef3df16 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/utils/_Utils.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/utils/_Utils.kt @@ -2,7 +2,11 @@ package org.hyacinthbots.lilybot.utils import com.kotlindiscord.kord.extensions.builders.ExtensibleBotBuilder import com.kotlindiscord.kord.extensions.extensions.Extension +import com.kotlindiscord.kord.extensions.utils.hasPermission import com.kotlindiscord.kord.extensions.utils.loadModule +import dev.kord.common.entity.Permission +import dev.kord.common.entity.Snowflake +import dev.kord.core.Kord import dev.kord.core.behavior.GuildBehavior import dev.kord.core.behavior.RoleBehavior import dev.kord.core.entity.Message @@ -47,8 +51,12 @@ internal val utilsLogger = KotlinLogging.logger("Checks Logger") * @author NoComment1105 * @since 4.1.0 */ -suspend inline fun canPingRole(role: RoleBehavior?) = - role != null && role.guild.getRoleOrNull(role.id)?.mentionable == true +suspend inline fun canPingRole(role: RoleBehavior?, guildId: Snowflake, kord: Kord) = + if (kord.getSelf().asMemberOrNull(guildId)?.hasPermission(Permission.MentionEveryone) == true) { + true + } else { + role != null && role.guild.getRoleOrNull(role.id)?.mentionable == true + } /** * Get the number of guilds the bot is in. @@ -215,11 +223,11 @@ suspend inline fun Extension.updateDefaultPresence() { fun generateBulkDeleteFile(messages: Set<Message>): String? = if (messages.isNotEmpty()) { "# Messages\n\n**Total:** ${messages.size}\n\n" + - messages.reversed().joinToString("\n") { // Reversed for chronology - "* [${ - it.timestamp.toLocalDateTime(TimeZone.UTC).toString().replace("T", " @ ") - } UTC] **${it.author?.username}** (${it.author?.id}) » ${it.content}" - } + messages.reversed().joinToString("\n") { // Reversed for chronology + "* [${ + it.timestamp.toLocalDateTime(TimeZone.UTC).toString().replace("T", " @ ") + } UTC] **${it.author?.username}** (${it.author?.id}) » ${it.content}" + } } else { null } From b1daa3fb1159aef109ca11d20eff115ca8bd9cad Mon Sep 17 00:00:00 2001 From: NoComment <nocomment1105@outlook.com> Date: Mon, 1 May 2023 08:29:40 +0100 Subject: [PATCH 09/12] Fix reminders hopefully --- .../collections/ReminderCollection.kt | 9 ++++--- .../lilybot/extensions/util/Reminders.kt | 24 +++++++++---------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/database/collections/ReminderCollection.kt b/src/main/kotlin/org/hyacinthbots/lilybot/database/collections/ReminderCollection.kt index ba23a1d5..90e719d2 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/database/collections/ReminderCollection.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/database/collections/ReminderCollection.kt @@ -74,11 +74,13 @@ class ReminderCollection : KordExKoinComponent { /** * Removes a reminder from the database. * + * @param userId The ID of the user the reminder belongs too * @param number The reminder to remove * @author NoComment1105 * @since 4.2.0 */ - suspend fun removeReminder(number: Long) = collection.deleteOne(ReminderData::id eq number) + suspend fun removeReminder(userId: Snowflake, number: Long) = + collection.deleteOne(ReminderData::userId eq userId, ReminderData::id eq number) /** * Removes all the reminders for a given guild. @@ -98,10 +100,7 @@ class ReminderCollection : KordExKoinComponent { * @since 4.5.0 */ suspend fun repeatReminder(originalData: ReminderData, repeatingInterval: DateTimePeriod) { - collection.deleteOne( - ReminderData::id eq originalData.id, - ReminderData::userId eq originalData.userId - ) + removeReminder(originalData.userId, originalData.id) collection.insertOne( ReminderData( diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/Reminders.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/Reminders.kt index b78a5538..d4b0ca55 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/Reminders.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/Reminders.kt @@ -245,7 +245,7 @@ class Reminders : Extension() { } } - ReminderCollection().removeReminder(arguments.reminder) + ReminderCollection().removeReminder(user.id, arguments.reminder) markReminderCompleteOrCancelled(reminder.guildId, reminder.channelId, reminder.messageId, true) } } @@ -280,7 +280,7 @@ class Reminders : Extension() { when (arguments.type) { "all" -> { reminders.forEach { - ReminderCollection().removeReminder(it.id) + ReminderCollection().removeReminder(it.userId, it.id) markReminderCompleteOrCancelled(it.guildId, it.channelId, it.messageId, true) } @@ -292,7 +292,7 @@ class Reminders : Extension() { "repeating" -> { reminders.forEach { if (it.repeating) { - ReminderCollection().removeReminder(it.id) + ReminderCollection().removeReminder(it.userId, it.id) markReminderCompleteOrCancelled(it.guildId, it.channelId, it.messageId, true) } } @@ -305,7 +305,7 @@ class Reminders : Extension() { "non-repeating" -> { reminders.forEach { if (!it.repeating) { - ReminderCollection().removeReminder(it.id) + ReminderCollection().removeReminder(it.userId, it.id) markReminderCompleteOrCancelled(it.guildId, it.channelId, it.messageId, true) } } @@ -385,7 +385,7 @@ class Reminders : Extension() { } } - ReminderCollection().removeReminder(arguments.reminder) + ReminderCollection().removeReminder(user.id, arguments.reminder) markReminderCompleteOrCancelled( reminder.guildId, reminder.channelId, reminder.messageId, wasCancelled = true, @@ -428,7 +428,7 @@ class Reminders : Extension() { when (arguments.type) { "all" -> { reminders.forEach { - ReminderCollection().removeReminder(it.id) + ReminderCollection().removeReminder(it.userId, it.id) markReminderCompleteOrCancelled( it.guildId, it.channelId, it.messageId, wasCancelled = true, @@ -446,7 +446,7 @@ class Reminders : Extension() { "repeating" -> { reminders.forEach { if (it.repeating) { - ReminderCollection().removeReminder(it.id) + ReminderCollection().removeReminder(it.userId, it.id) markReminderCompleteOrCancelled( it.guildId, it.channelId, it.messageId, wasCancelled = true, @@ -465,7 +465,7 @@ class Reminders : Extension() { "non-repeating" -> { reminders.forEach { if (!it.repeating) { - ReminderCollection().removeReminder(it.id) + ReminderCollection().removeReminder(it.userId, it.id) markReminderCompleteOrCancelled( it.guildId, it.channelId, it.messageId, wasCancelled = true, @@ -502,18 +502,18 @@ class Reminders : Extension() { try { guild = kord.getGuildOrNull(it.guildId) } catch (_: KtorRequestException) { - ReminderCollection().removeReminder(it.id) + ReminderCollection().removeReminder(it.userId, it.id) continue } if (guild == null) { - ReminderCollection().removeReminder(it.id) + ReminderCollection().removeReminder(it.userId, it.id) continue } val channel = guild.getChannelOfOrNull<GuildMessageChannel>(it.channelId) if (channel == null) { - ReminderCollection().removeReminder(it.id) + ReminderCollection().removeReminder(it.userId, it.id) continue } @@ -540,7 +540,7 @@ class Reminders : Extension() { if (it.repeating) { ReminderCollection().repeatReminder(it, it.repeatingInterval!!) } else { - ReminderCollection().removeReminder(it.id) + ReminderCollection().removeReminder(it.userId, it.id) } } } From 94c4668f90f412125f0720c7cd40b78b9cf3121d Mon Sep 17 00:00:00 2001 From: NoComment <nocomment1105@outlook.com> Date: Mon, 1 May 2023 08:33:34 +0100 Subject: [PATCH 10/12] Alter status ping code slightly --- .../lilybot/extensions/util/StatusPing.kt | 12 ++++++------ .../org/hyacinthbots/lilybot/utils/_Constants.kt | 2 ++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/StatusPing.kt b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/StatusPing.kt index 3dd34f84..2422aacd 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/StatusPing.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/extensions/util/StatusPing.kt @@ -1,12 +1,12 @@ package org.hyacinthbots.lilybot.extensions.util import com.kotlindiscord.kord.extensions.extensions.Extension -import com.kotlindiscord.kord.extensions.utils.envOrNull import com.kotlindiscord.kord.extensions.utils.scheduling.Scheduler import com.kotlindiscord.kord.extensions.utils.scheduling.Task import io.ktor.client.HttpClient -import io.ktor.client.request.post +import io.ktor.client.request.get import mu.KotlinLogging +import org.hyacinthbots.lilybot.utils.ENV import kotlin.time.Duration.Companion.seconds class StatusPing : Extension() { @@ -18,18 +18,18 @@ class StatusPing : Extension() { private val client = HttpClient {} - private val env = envOrNull("STATUS_URL") - private val logger = KotlinLogging.logger("Status ping") override suspend fun setup() { - if (env != null) { + if (ENV != null) { task = scheduler.schedule(30.seconds, repeat = true, callback = ::post) } } private suspend fun post() { logger.debug { "Pinging!" } - client.post(env!!) + if (ENV != null) { + client.get(ENV) + } } } diff --git a/src/main/kotlin/org/hyacinthbots/lilybot/utils/_Constants.kt b/src/main/kotlin/org/hyacinthbots/lilybot/utils/_Constants.kt index ac439015..4bebc87d 100644 --- a/src/main/kotlin/org/hyacinthbots/lilybot/utils/_Constants.kt +++ b/src/main/kotlin/org/hyacinthbots/lilybot/utils/_Constants.kt @@ -22,6 +22,8 @@ val SENTRY_DSN = envOrNull("SENTRY_DSN") /** The environment the bot is being run in. production or development. */ val ENVIRONMENT = env("ENVIRONMENT") +val ENV = envOrNull("STATUS_URL") + const val BUILD_ID: String = "@build_id@" const val LILY_VERSION: String = "@version@" From 60fe02900d128590199092cbe5dca7708f3ff1ab Mon Sep 17 00:00:00 2001 From: NoComment <nocomment1105@outlook.com> Date: Mon, 1 May 2023 08:33:52 +0100 Subject: [PATCH 11/12] Update KordEx --- libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs.versions.toml b/libs.versions.toml index b6918d6b..9823bcb7 100644 --- a/libs.versions.toml +++ b/libs.versions.toml @@ -8,7 +8,7 @@ grgit = "5.2.0" blossom = "1.3.1" # Libraries -kord-extensions = "1.5.7-20230412.093301-8" +kord-extensions = "1.5.7-20230430.120015-9" logging = "3.0.5" logback = "1.4.7" github-api = "1.314" From 00e32314b6417a23ded9eac039c999192db86a7c Mon Sep 17 00:00:00 2001 From: NoComment <nocomment1105@outlook.com> Date: Mon, 1 May 2023 08:42:42 +0100 Subject: [PATCH 12/12] Bump to 4.8.5 --- build.gradle.kts | 2 +- docs/changelogs/4.x.x/4.8.5.md | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 docs/changelogs/4.x.x/4.8.5.md diff --git a/build.gradle.kts b/build.gradle.kts index 16f02e2e..fa430ee0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -16,7 +16,7 @@ plugins { } group = "org.hyacinthbots.lilybot" -version = "4.8.4" +version = "4.8.5" repositories { mavenCentral() diff --git a/docs/changelogs/4.x.x/4.8.5.md b/docs/changelogs/4.x.x/4.8.5.md new file mode 100644 index 00000000..df051109 --- /dev/null +++ b/docs/changelogs/4.x.x/4.8.5.md @@ -0,0 +1,19 @@ +# LilyBot 4.8.5 + +This update fixes a bug and deprecate log uploading. +You can find the full changelog below + +New: +* Tags can now be 4096 characters long, quite why you'd want a tag that's 4kB long I don't know, but you can do that now +* Lily will send a message in a gallery channel when permissions are broken for her + +Change: +* Role menu buttons are now GuildButtons +* Upgradle to 8.1.1 +* The role mention check now takes into account the `Mention @everyone, @here and All Roles` permission + +Fix: +* Old tags are no longer deleted before the new tag is validated fixing wierd issues in editing +* Hopefully stop reminder randomly disappearing and subsequently multi-pinging as we're properly checking reminders before deleting them now + +You can find a list of all the commits in this update [here](https://github.com/hyacinthbots/LilyBot/compare/v4.8.4...v4.8.5)