From bddca280c90f20da84fa8b16e313d6cc0edf22e7 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Tue, 4 Jun 2024 08:31:01 +0200 Subject: [PATCH 01/22] Update build scripts --- build.gradle.kts | 1 - neoforge/build.gradle.kts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index da4248a..067580e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,6 @@ import java.text.SimpleDateFormat import java.util.* plugins { - // The shadow plugin is used by the fabric subproject to include dependencies // I'm temporarily using a fork of the original plugin to resolve "Unsupported java classfile major version 65" // see: https://github.com/johnrengelman/shadow/issues/911 id("io.github.goooler.shadow") version "8.1.7" apply false diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index dd6b599..1ef6939 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -7,7 +7,7 @@ plugins { idea `maven-publish` java - id("net.neoforged.gradle.userdev") version "7.0.137" + id("net.neoforged.gradle.userdev") version "7.0.138" id("io.github.goooler.shadow") } From 2fbf5c2f42ebecbfab318b9746630fd7b2e86656 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Tue, 4 Jun 2024 08:33:17 +0200 Subject: [PATCH 02/22] Prioritize token config option over environment variable in README --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7f40665..4c035a6 100644 --- a/README.md +++ b/README.md @@ -55,8 +55,11 @@ on the [Discord Developer Portal](https://discord.com/developers/applications) a to have the three privileged gateway intents: `PRESENCE`, `SERVER MEMBERS` and `MESSAGE CONTENT`. Copy the bot token and store it somewhere safe (like a Password Manager) and never show it to -anybody else. To make sure the token gets read by the bot, it has to be in either an [Environment Variable](https://en.wikipedia.org/wiki/Environment_variable) -`DISCORD_TOKEN` where the running Minecraft server can access it or in the config file under the key `token`. +anybody else. + +The bot can read the token from multiple sources, the easiest to configure being the `token` field in the +main server config file (`astralbot-server.toml`). Alternatively, you can also provide it via an [Environment Variable](https://en.wikipedia.org/wiki/Environment_variable) +`DISCORD_TOKEN` where the running Minecraft server can access it. You could for example modify a `start.sh` script on a Unix-like system to `export` it or start the shell script with it set directly: `startmc.sh`: From bf448e13e4a1d2ee883f2bd0f61c92bd44abf28d Mon Sep 17 00:00:00 2001 From: Erdragh Date: Tue, 4 Jun 2024 08:46:46 +0200 Subject: [PATCH 03/22] Unlink user on leave --- common/src/main/kotlin/dev/erdragh/astralbot/Bot.kt | 7 ++++++- .../astralbot/commands/discord/UserEventListener.kt | 11 +++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/UserEventListener.kt diff --git a/common/src/main/kotlin/dev/erdragh/astralbot/Bot.kt b/common/src/main/kotlin/dev/erdragh/astralbot/Bot.kt index 211ed54..8c393e1 100644 --- a/common/src/main/kotlin/dev/erdragh/astralbot/Bot.kt +++ b/common/src/main/kotlin/dev/erdragh/astralbot/Bot.kt @@ -1,6 +1,7 @@ package dev.erdragh.astralbot import dev.erdragh.astralbot.commands.discord.CommandHandlingListener +import dev.erdragh.astralbot.commands.discord.UserEventListener import dev.erdragh.astralbot.config.AstralBotConfig import dev.erdragh.astralbot.handlers.FAQHandler import dev.erdragh.astralbot.handlers.MinecraftHandler @@ -127,7 +128,11 @@ fun startAstralbot(server: MinecraftServer) { GatewayIntent.MESSAGE_CONTENT, GatewayIntent.GUILD_MESSAGES, GatewayIntent.GUILD_MEMBERS - ).addEventListeners(CommandHandlingListener, minecraftHandler).build() + ).addEventListeners( + CommandHandlingListener, + UserEventListener, + minecraftHandler + ).build() setupJob = GlobalScope.async { launch { diff --git a/common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/UserEventListener.kt b/common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/UserEventListener.kt new file mode 100644 index 0000000..abba232 --- /dev/null +++ b/common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/UserEventListener.kt @@ -0,0 +1,11 @@ +package dev.erdragh.astralbot.commands.discord + +import dev.erdragh.astralbot.handlers.WhitelistHandler +import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent +import net.dv8tion.jda.api.hooks.ListenerAdapter + +object UserEventListener : ListenerAdapter() { + override fun onGuildMemberRemove(event: GuildMemberRemoveEvent) { + WhitelistHandler.unWhitelist(event.user) + } +} \ No newline at end of file From 9b957951ce586ada17fd4970b4590213acefa2c7 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Tue, 4 Jun 2024 08:53:14 +0200 Subject: [PATCH 04/22] Update CHANGELOG --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03f3705..946fc5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +# indev +- Unlink users on leave + # 1.5.2 Fix tps command using wrong numbers for calculation From 200a721c4212dd67c2ace17b6fdcdc45c320fe86 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Sun, 16 Jun 2024 09:54:44 +0200 Subject: [PATCH 05/22] Port to 1.21 --- build.gradle.kts | 17 +++++++++++------ .../main/kotlin/dev/erdragh/astralbot/Bot.kt | 4 +++- .../astralbot/util/MessageFormatting.kt | 9 ++++++--- fabric/build.gradle.kts | 2 +- .../dev/erdragh/astralbot/fabric/BotMod.kt | 1 + gradle.properties | 18 +++++++++--------- neoforge/build.gradle.kts | 2 +- .../dev/erdragh/astralbot/neoforge/BotMod.kt | 4 ++-- .../META-INF/{mods.toml => neoforge.mods.toml} | 0 9 files changed, 34 insertions(+), 23 deletions(-) rename neoforge/src/main/resources/META-INF/{mods.toml => neoforge.mods.toml} (100%) diff --git a/build.gradle.kts b/build.gradle.kts index 067580e..250910e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -46,7 +46,7 @@ subprojects { } extensions.configure { - toolchain.languageVersion.set(JavaLanguageVersion.of(17)) + toolchain.languageVersion.set(JavaLanguageVersion.of(21)) withSourcesJar() } @@ -136,6 +136,11 @@ subprojects { } } + tasks.test { + // There are no tests and the Neo build fails + exclude("**/*") + } + java { withSourcesJar() modularity.inferModulePath = true @@ -195,7 +200,7 @@ subprojects { "credits" to credits ) - filesMatching(listOf("pack.mcmeta", "*.mixins.json", "META-INF/mods.toml", "fabric.mod.json")) { + filesMatching(listOf("pack.mcmeta", "*.mixins.json", "META-INF/*.mods.toml", "fabric.mod.json")) { expand(expandProps) } inputs.properties(expandProps) @@ -255,8 +260,8 @@ subprojects { tasks.withType { options.encoding = "UTF-8" - targetCompatibility = JavaVersion.VERSION_17.majorVersion - sourceCompatibility = JavaVersion.VERSION_17.majorVersion + targetCompatibility = JavaVersion.VERSION_21.majorVersion + sourceCompatibility = JavaVersion.VERSION_21.majorVersion } // Publishing settings @@ -292,7 +297,7 @@ subprojects { // file. This allows me to keep all previous changes in the file // without having to worry about them being included on new file // uploads. - File("CHANGELOG.md") + File(rootDir, "CHANGELOG.md") .readText(StandardCharsets.UTF_8) .replace(Regex("[^^](#(#|\\n|.)+)|(^#.+)"), "") .trim() @@ -305,7 +310,7 @@ subprojects { } kotlin { - jvmToolchain(17) + jvmToolchain(21) } diff --git a/common/src/main/kotlin/dev/erdragh/astralbot/Bot.kt b/common/src/main/kotlin/dev/erdragh/astralbot/Bot.kt index 8c393e1..1939f42 100644 --- a/common/src/main/kotlin/dev/erdragh/astralbot/Bot.kt +++ b/common/src/main/kotlin/dev/erdragh/astralbot/Bot.kt @@ -16,9 +16,11 @@ import net.minecraft.server.MinecraftServer import org.slf4j.Logger import org.slf4j.LoggerFactory import java.io.File +import java.nio.file.Path import java.time.Duration import java.time.LocalDateTime import java.util.concurrent.atomic.AtomicBoolean +import kotlin.io.path.absolute import kotlin.properties.Delegates const val MODID = "astralbot" @@ -109,7 +111,7 @@ fun startAstralbot(server: MinecraftServer) { startTimestamp = LocalDateTime.now() val env = System.getenv() - baseDirectory = File(server.serverDirectory, MODID) + baseDirectory = File(server.serverDirectory.absolute().toFile(), MODID) if (baseDirectory!!.mkdir()) { LOGGER.debug("Created $MODID directory") } diff --git a/common/src/main/kotlin/dev/erdragh/astralbot/util/MessageFormatting.kt b/common/src/main/kotlin/dev/erdragh/astralbot/util/MessageFormatting.kt index 7f8d755..546249e 100644 --- a/common/src/main/kotlin/dev/erdragh/astralbot/util/MessageFormatting.kt +++ b/common/src/main/kotlin/dev/erdragh/astralbot/util/MessageFormatting.kt @@ -4,12 +4,14 @@ import dev.erdragh.astralbot.config.AstralBotConfig import dev.erdragh.astralbot.config.AstralBotTextConfig import net.dv8tion.jda.api.EmbedBuilder import net.dv8tion.jda.api.entities.MessageEmbed +import net.minecraft.core.component.DataComponents import net.minecraft.network.chat.ClickEvent import net.minecraft.network.chat.Component import net.minecraft.network.chat.HoverEvent import net.minecraft.network.chat.MutableComponent import net.minecraft.world.entity.EntityType import net.minecraft.world.entity.player.Player +import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack import net.minecraft.world.item.TooltipFlag import org.commonmark.parser.Parser @@ -82,16 +84,17 @@ fun formatHoverText(text: Component): MessageEmbed { fun formatHoverItems(stack: ItemStack, knownItems: MutableList, player: Player?): MessageEmbed? { if (knownItems.contains(stack)) return null knownItems.add(stack) - val tooltip = stack.getTooltipLines(player, TooltipFlag.NORMAL).map(::formatComponentToMarkdown) + // TODO check if context needs fixing + val tooltip = stack.getTooltipLines(Item.TooltipContext.EMPTY, player, TooltipFlag.NORMAL).map(::formatComponentToMarkdown) return EmbedBuilder() .setTitle("${tooltip[0]} ${if (stack.count > 1) "(${stack.count})" else ""}") .setDescription(tooltip.drop(1).let { - if (stack.hasCustomHoverName()) { + if (stack.has(DataComponents.CUSTOM_NAME)) { listOf(stack.item.description.string).plus(it) } else it }.joinToString("\n")) .let { builder: EmbedBuilder -> - stack.rarity.color.color?.let { color -> builder.setColor(color) } + stack.rarity.color().color?.let { color -> builder.setColor(color) } builder } .build() diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index d13bdd5..f8e573b 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -110,7 +110,7 @@ publishMods { val curseforgePublish: Provider by extra val modrinthPublish: Provider by extra - changelog = extra.get("changelog") as String + changelog = extra.get("changelog").toString() type = extra.get("type") as ReleaseType curseforge("curseFabric") { diff --git a/fabric/src/main/kotlin/dev/erdragh/astralbot/fabric/BotMod.kt b/fabric/src/main/kotlin/dev/erdragh/astralbot/fabric/BotMod.kt index 2f58238..1cad7fe 100644 --- a/fabric/src/main/kotlin/dev/erdragh/astralbot/fabric/BotMod.kt +++ b/fabric/src/main/kotlin/dev/erdragh/astralbot/fabric/BotMod.kt @@ -14,6 +14,7 @@ import net.fabricmc.fabric.api.message.v1.ServerMessageEvents import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents import net.minecraft.client.resources.SkinManager import net.minecraft.server.level.ServerPlayer +import net.minecraft.world.item.Item import net.neoforged.fml.config.ModConfig object BotMod : ModInitializer { diff --git a/gradle.properties b/gradle.properties index 4e0ef14..9cdb85a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,14 +6,14 @@ enabledPlatforms=fabric,neoforge # Fabric fabricLoaderVersion=0.15.11 -fabricApiVersion=0.97.1 +fabricApiVersion=0.100.1 fabricKotlinVersion=1.11.0+kotlin.2.0.0 # Neo -neoVersion=20.4.235 -neoVersionRange=[20.4,20.5) -kotlinForgeVersion=4.10.0 -kffLoaderRange=[4,) +neoVersion=21.0.10-beta +neoVersionRange=[21.0,21.1) +kotlinForgeVersion=5.3.0 +kffLoaderRange=[5,) version=1.5.2 group=dev.erdragh.astralbot @@ -25,11 +25,11 @@ title=AstralBot description=Discord Bot and Minecraft Mod in one bundle. credits=Erdragh -minecraftVersion=1.20.4 -minecraftVersionRange=[1.20.4,) -parchmentVersion=2024.04.14 +minecraftVersion=1.21 +minecraftVersionRange=[1.21,) +parchmentVersion=2024.06.02 -forgeConfigAPIVersion=20.4.3 +forgeConfigAPIVersion=21.0.0 # Discord Interactions jdaVersion=5.0.0-beta.24 diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index 1ef6939..d3058de 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -7,7 +7,7 @@ plugins { idea `maven-publish` java - id("net.neoforged.gradle.userdev") version "7.0.138" + id("net.neoforged.gradle.userdev") version "7.0.143" id("io.github.goooler.shadow") } diff --git a/neoforge/src/main/kotlin/dev/erdragh/astralbot/neoforge/BotMod.kt b/neoforge/src/main/kotlin/dev/erdragh/astralbot/neoforge/BotMod.kt index 1bbd833..98fcc39 100644 --- a/neoforge/src/main/kotlin/dev/erdragh/astralbot/neoforge/BotMod.kt +++ b/neoforge/src/main/kotlin/dev/erdragh/astralbot/neoforge/BotMod.kt @@ -26,8 +26,8 @@ import thedarkcolour.kotlinforforge.neoforge.forge.MOD_BUS @Mod("astralbot") object BotMod { init { - ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, AstralBotConfig.SPEC) - ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, AstralBotTextConfig.SPEC, "astralbot-text.toml") + ModLoadingContext.get().activeContainer.registerConfig(ModConfig.Type.SERVER, AstralBotConfig.SPEC) + ModLoadingContext.get().activeContainer.registerConfig(ModConfig.Type.SERVER, AstralBotTextConfig.SPEC, "astralbot-text.toml") MOD_BUS.addListener(::onConfigReloaded) FORGE_BUS.addListener(::onServerStart) diff --git a/neoforge/src/main/resources/META-INF/mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml similarity index 100% rename from neoforge/src/main/resources/META-INF/mods.toml rename to neoforge/src/main/resources/META-INF/neoforge.mods.toml From 90502b5244552b018d3be7b3b569c6965d5871b6 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Sun, 16 Jun 2024 09:56:08 +0200 Subject: [PATCH 06/22] Fix toString usage in fabric buildscript --- fabric/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index f8e573b..d13bdd5 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -110,7 +110,7 @@ publishMods { val curseforgePublish: Provider by extra val modrinthPublish: Provider by extra - changelog = extra.get("changelog").toString() + changelog = extra.get("changelog") as String type = extra.get("type") as ReleaseType curseforge("curseFabric") { From de59eb6159554c5ddb8b28003a3e13a76dfeb61f Mon Sep 17 00:00:00 2001 From: Erdragh Date: Sun, 16 Jun 2024 10:02:19 +0200 Subject: [PATCH 07/22] Abuse loom's split sources for server side only --- fabric/build.gradle.kts | 14 ++++++++------ fabric/gradle.properties | 1 + .../kotlin/dev/erdragh/astralbot/fabric/BotMod.kt | 2 -- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index d13bdd5..ff1a58f 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -44,13 +44,15 @@ loom { @Suppress("UnstableApiUsage") mixin { defaultRefmapName.set("${modId}.refmap.json") } - runs { - named("client") { - client() - configName = "Fabric Client" - ideConfigGenerated(true) - runDir("run") + splitEnvironmentSourceSets() + + mods { + create("astralbot") { + sourceSet(sourceSets.main.get()) } + } + + runs { named("server") { server() configName = "Fabric Server" diff --git a/fabric/gradle.properties b/fabric/gradle.properties index e69de29..c52e9c1 100644 --- a/fabric/gradle.properties +++ b/fabric/gradle.properties @@ -0,0 +1 @@ +fabric.loom.multiProjectOptimisation=true \ No newline at end of file diff --git a/fabric/src/main/kotlin/dev/erdragh/astralbot/fabric/BotMod.kt b/fabric/src/main/kotlin/dev/erdragh/astralbot/fabric/BotMod.kt index 1cad7fe..ac327fd 100644 --- a/fabric/src/main/kotlin/dev/erdragh/astralbot/fabric/BotMod.kt +++ b/fabric/src/main/kotlin/dev/erdragh/astralbot/fabric/BotMod.kt @@ -12,9 +12,7 @@ import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents import net.fabricmc.fabric.api.message.v1.ServerMessageEvents import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents -import net.minecraft.client.resources.SkinManager import net.minecraft.server.level.ServerPlayer -import net.minecraft.world.item.Item import net.neoforged.fml.config.ModConfig object BotMod : ModInitializer { From ce855da7bb92e329aed9f63b761335571a9c1b27 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Sun, 16 Jun 2024 10:49:51 +0200 Subject: [PATCH 08/22] Temporarily disable loom's split sourcesets to fix build... --- fabric/build.gradle.kts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index ff1a58f..8c2dab5 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -38,14 +38,17 @@ dependencies { } loom { +// serverOnlyMinecraftJar() +// splitEnvironmentSourceSets() +// configurations.testCompileClasspath.extendsFrom(configurations.minecraftServerLibraries) +// configurations.testRuntimeClasspath.extendsFrom(configurations.minecraftServerRuntimeLibraries) + if (project(":common").file("src/main/resources/${modId}.accesswidener").exists()) accessWidenerPath.set(project(":common").file("src/main/resources/${modId}.accesswidener")) @Suppress("UnstableApiUsage") mixin { defaultRefmapName.set("${modId}.refmap.json") } - splitEnvironmentSourceSets() - mods { create("astralbot") { sourceSet(sourceSets.main.get()) From a50cebaa63ff44daacfd35251b0d4393d5051664 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Tue, 18 Jun 2024 08:38:49 +0200 Subject: [PATCH 09/22] Move gradle plugin versions to root build script --- build.gradle.kts | 7 +++++++ common/build.gradle.kts | 2 +- fabric/build.gradle.kts | 2 +- neoforge/build.gradle.kts | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 250910e..637041b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -18,6 +18,13 @@ plugins { id("org.jetbrains.gradle.plugin.idea-ext") version "1.1.7" // For publishing the mod id("me.modmuss50.mod-publish-plugin") version "0.5.1" + + // NeoForge development + id("net.neoforged.gradle.userdev") version "7.0.145" apply false + // Fabric development + id("fabric-loom") version "1.6-SNAPSHOT" apply false + // Common development + id ("org.spongepowered.gradle.vanilla") version "0.2.1-SNAPSHOT" apply false } val minecraftVersion: String by project diff --git a/common/build.gradle.kts b/common/build.gradle.kts index e256258..9aa5654 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -4,7 +4,7 @@ plugins { idea java `maven-publish` - id ("org.spongepowered.gradle.vanilla") version "0.2.1-SNAPSHOT" + id ("org.spongepowered.gradle.vanilla") } val minecraftVersion: String by project diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 8c2dab5..005080c 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -8,7 +8,7 @@ plugins { java idea `maven-publish` - id("fabric-loom") version "1.6-SNAPSHOT" + id("fabric-loom") id("io.github.goooler.shadow") id("me.modmuss50.mod-publish-plugin") } diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index d3058de..a7a83eb 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -7,7 +7,7 @@ plugins { idea `maven-publish` java - id("net.neoforged.gradle.userdev") version "7.0.143" + id("net.neoforged.gradle.userdev") id("io.github.goooler.shadow") } From 5f4981bf04e9f41539b716615e38d4cf85445629 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Tue, 18 Jun 2024 08:49:23 +0200 Subject: [PATCH 10/22] server only jar for loom --- fabric/build.gradle.kts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index 005080c..c0e42bc 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -38,10 +38,7 @@ dependencies { } loom { -// serverOnlyMinecraftJar() -// splitEnvironmentSourceSets() -// configurations.testCompileClasspath.extendsFrom(configurations.minecraftServerLibraries) -// configurations.testRuntimeClasspath.extendsFrom(configurations.minecraftServerRuntimeLibraries) + serverOnlyMinecraftJar() if (project(":common").file("src/main/resources/${modId}.accesswidener").exists()) accessWidenerPath.set(project(":common").file("src/main/resources/${modId}.accesswidener")) From 398060255c96c43219dca4943d4695eefddbdb24 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Tue, 18 Jun 2024 09:30:09 +0200 Subject: [PATCH 11/22] Fix inclusion of common project in loader projects --- build.gradle.kts | 15 +++++++++++---- fabric/build.gradle.kts | 13 ------------- neoforge/build.gradle.kts | 20 +++++++------------- 3 files changed, 18 insertions(+), 30 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 637041b..ee240f1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -217,18 +217,25 @@ subprojects { apply(plugin = "io.github.goooler.shadow") dependencies { - implementation(project(":common")) + // This is runtimeLib, because NG doesn't add the common classes to the runtime classpath correctly + runtimeLib(project(":common")) { + isTransitive = false + } + } + + // Include common classes in jar and shadowJar output + listOf(tasks.jar, tasks.named("shadowJar")).forEach { + it { from(project(":common").sourceSets.main.get().output) } } tasks.named("shadowJar") { // The shadowBotDep configuration was explicitly made to be shaded in, this is where that happens - configurations.clear() configurations = listOf(shadowBotDep) // This transforms the service files to make relocated Exposed work (see: https://github.com/JetBrains/Exposed/issues/1353) mergeServiceFiles() - // Forge restricts loading certain classes for security reasons. + // (Neo-)Forge restricts loading certain classes for security reasons. // Luckily, shadow can relocate them to a different package. relocate("org.apache.commons.collections4", "dev.erdragh.shadowed.org.apache.commons.collections4") @@ -249,7 +256,7 @@ subprojects { relocate("com.iwebpp.crypto", "dev.erdragh.shadowed.com.iwebpp.crypto") relocate("com.neovisionaries.ws", "dev.erdragh.shadowed.com.neovisionaries.ws") relocate("org.json", "dev.erdragh.shadowed.org.json") - relocate("net.bytebuddy", "dev.erdragh.net.bytebuddy") + relocate("net.bytebuddy", "dev.erdragh.shadowed.net.bytebuddy") exclude("**/org/slf4j/**") diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index c0e42bc..8362dcd 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -63,15 +63,6 @@ loom { } tasks { - withType { - source(project(":common").sourceSets.main.get().allSource) - } - withType { - source(project(":common").sourceSets.main.get().allSource) - } - - javadoc { source(project(":common").sourceSets.main.get().allJava) } - jar { archiveClassifier.set("dev") } @@ -84,10 +75,6 @@ tasks { inputFile.set(named("shadowJar").get().archiveFile) dependsOn("shadowJar") } - - named("sourcesJar", Jar::class) { from(project(":common").sourceSets.main.get().allSource) } - - processResources { from(project(":common").sourceSets.main.get().resources) } } publishing { diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index a7a83eb..837f7fb 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -79,17 +79,7 @@ dependencies { includeBotDep.dependencies.forEach { jarJar(it) } } -// NeoGradle compiles the game, but we don't want to add our common code to the game's code -val notNeoTask: Spec = Spec { !it.name.startsWith("neo") } - tasks { - withType().matching(notNeoTask).configureEach { source(project(":common").sourceSets.main.get().allSource) } - withType().matching(notNeoTask).configureEach { - source(project(":common").sourceSets.main.get().allSource) - } - - withType().matching(notNeoTask).configureEach { source(project(":common").sourceSets.main.get().allJava) } - shadowJar { archiveClassifier = null } @@ -98,9 +88,13 @@ tasks { dependsOn(shadowJar) } - named("sourcesJar", Jar::class) { from(project(":common").sourceSets.main.get().allSource) } - - processResources { from(project(":common").sourceSets.main.get().resources) } + // Fixes IDE runs not processing common resources + processResources { + from(project(":common").sourceSets.main.get().resources) + } + jar { + duplicatesStrategy = DuplicatesStrategy.INCLUDE + } } publishing { From 2a659207fb9b1992a80d42b98fb67551e4e8ab0d Mon Sep 17 00:00:00 2001 From: Erdragh Date: Tue, 18 Jun 2024 09:30:36 +0200 Subject: [PATCH 12/22] Try to fix Neo dev env run error --- .../kotlin/dev/erdragh/astralbot/config/AstralBotConfig.kt | 3 --- gradle.properties | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/common/src/main/kotlin/dev/erdragh/astralbot/config/AstralBotConfig.kt b/common/src/main/kotlin/dev/erdragh/astralbot/config/AstralBotConfig.kt index 0fe9467..83c58e3 100644 --- a/common/src/main/kotlin/dev/erdragh/astralbot/config/AstralBotConfig.kt +++ b/common/src/main/kotlin/dev/erdragh/astralbot/config/AstralBotConfig.kt @@ -4,9 +4,6 @@ import dev.erdragh.astralbot.LOGGER import dev.erdragh.astralbot.commands.discord.allCommands import net.neoforged.neoforge.common.ModConfigSpec import java.net.URI -import java.net.URL -import java.net.URLDecoder -import java.nio.charset.StandardCharsets /** * Config for the AstralBot mod. This uses Forge's config system diff --git a/gradle.properties b/gradle.properties index 9cdb85a..f13100f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ fabricApiVersion=0.100.1 fabricKotlinVersion=1.11.0+kotlin.2.0.0 # Neo -neoVersion=21.0.10-beta +neoVersion=21.0.16-beta neoVersionRange=[21.0,21.1) kotlinForgeVersion=5.3.0 kffLoaderRange=[5,) From 363b9138ecb14e401b63ca2fe6b59d8dc1515139 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Fri, 5 Jul 2024 18:04:26 +0200 Subject: [PATCH 13/22] Bump versions --- build.gradle.kts | 10 +++++----- gradle.properties | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index ee240f1..0fdc8a8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,7 +7,7 @@ import java.util.* plugins { // I'm temporarily using a fork of the original plugin to resolve "Unsupported java classfile major version 65" // see: https://github.com/johnrengelman/shadow/issues/911 - id("io.github.goooler.shadow") version "8.1.7" apply false + id("io.github.goooler.shadow") version "8.1.8" apply false // Since this mod/bot is written in Kotlin and expected to run on Minecraft and as such // the JVM, the Kotlin plugin is needed kotlin("jvm") version "2.0.0" @@ -15,14 +15,14 @@ plugins { id("org.jetbrains.dokka") version "1.9.10" java // Required for NeoGradle - id("org.jetbrains.gradle.plugin.idea-ext") version "1.1.7" + idea // For publishing the mod - id("me.modmuss50.mod-publish-plugin") version "0.5.1" + id("me.modmuss50.mod-publish-plugin") version "0.5.2" // NeoForge development - id("net.neoforged.gradle.userdev") version "7.0.145" apply false + id("net.neoforged.gradle.userdev") version "7.0.153" apply false // Fabric development - id("fabric-loom") version "1.6-SNAPSHOT" apply false + id("fabric-loom") version "1.7-SNAPSHOT" apply false // Common development id ("org.spongepowered.gradle.vanilla") version "0.2.1-SNAPSHOT" apply false } diff --git a/gradle.properties b/gradle.properties index f13100f..2e1d761 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,11 +6,11 @@ enabledPlatforms=fabric,neoforge # Fabric fabricLoaderVersion=0.15.11 -fabricApiVersion=0.100.1 +fabricApiVersion=0.100.4 fabricKotlinVersion=1.11.0+kotlin.2.0.0 # Neo -neoVersion=21.0.16-beta +neoVersion=21.0.58-beta neoVersionRange=[21.0,21.1) kotlinForgeVersion=5.3.0 kffLoaderRange=[5,) @@ -27,16 +27,16 @@ credits=Erdragh minecraftVersion=1.21 minecraftVersionRange=[1.21,) -parchmentVersion=2024.06.02 +parchmentVersion=2024.06.23 -forgeConfigAPIVersion=21.0.0 +forgeConfigAPIVersion=21.0.1 # Discord Interactions jdaVersion=5.0.0-beta.24 dcWebhooksVersion=0.8.4 # Database Interactions -exposedVersion=0.51.0 +exposedVersion=0.52.0 sqliteJDBCVersion=3.46.0.0 # Message parsing From d8c9cf164dd58a7365cdb6b36d1b054fe57d3670 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Sat, 27 Jul 2024 09:06:23 +0200 Subject: [PATCH 14/22] Bump dependency versions --- CHANGELOG.md | 3 ++- gradle.properties | 16 ++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 946fc5e..94794dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ -# indev +# 1.5.3 - Unlink users on leave +- Update Dependencies # 1.5.2 Fix tps command using wrong numbers for calculation diff --git a/gradle.properties b/gradle.properties index 2e1d761..b62484e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,17 +5,17 @@ org.gradle.jvmargs=-Xmx3G -XX:ThreadStackSize=4096 -XX:CompilerThreadStackSize=4 enabledPlatforms=fabric,neoforge # Fabric -fabricLoaderVersion=0.15.11 -fabricApiVersion=0.100.4 +fabricLoaderVersion=0.16.0 +fabricApiVersion=0.100.7 fabricKotlinVersion=1.11.0+kotlin.2.0.0 # Neo -neoVersion=21.0.58-beta +neoVersion=21.0.139-beta neoVersionRange=[21.0,21.1) -kotlinForgeVersion=5.3.0 +kotlinForgeVersion=5.4.0 kffLoaderRange=[5,) -version=1.5.2 +version=1.5.3 group=dev.erdragh.astralbot modId=astralbot modAuthor=Erdragh @@ -27,12 +27,12 @@ credits=Erdragh minecraftVersion=1.21 minecraftVersionRange=[1.21,) -parchmentVersion=2024.06.23 +parchmentVersion=2024.07.07 -forgeConfigAPIVersion=21.0.1 +forgeConfigAPIVersion=21.0.6 # Discord Interactions -jdaVersion=5.0.0-beta.24 +jdaVersion=5.0.1 dcWebhooksVersion=0.8.4 # Database Interactions From ace7cde19557d226a6c2ae8358637d3cb8480ac7 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Sat, 27 Jul 2024 10:43:12 +0200 Subject: [PATCH 15/22] Move from vanillagradle and neogradle to MDG for Common and Neo --- build.gradle.kts | 8 ++- common/build.gradle.kts | 36 +++++-------- gradle.properties | 2 + neoforge/build.gradle.kts | 110 +++++++++++++++----------------------- 4 files changed, 61 insertions(+), 95 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 0fdc8a8..004c0a3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,14 +17,12 @@ plugins { // Required for NeoGradle idea // For publishing the mod - id("me.modmuss50.mod-publish-plugin") version "0.5.2" + id("me.modmuss50.mod-publish-plugin") version "0.6.2" - // NeoForge development - id("net.neoforged.gradle.userdev") version "7.0.153" apply false + // NeoForge and Common development + id("net.neoforged.moddev") version "1.0.15" apply false // Fabric development id("fabric-loom") version "1.7-SNAPSHOT" apply false - // Common development - id ("org.spongepowered.gradle.vanilla") version "0.2.1-SNAPSHOT" apply false } val minecraftVersion: String by project diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 9aa5654..0c5e5ba 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -1,39 +1,27 @@ -import org.spongepowered.gradle.vanilla.repository.MinecraftPlatform - plugins { idea java - `maven-publish` - id ("org.spongepowered.gradle.vanilla") + id("net.neoforged.moddev") } +val neoformVersion: String by project val minecraftVersion: String by project +val mcVersion = minecraftVersion +val parchmentVersion: String by project val modId: String by project -minecraft { - version(minecraftVersion) - platform(MinecraftPlatform.SERVER) - if (file("src/main/resources/${modId}.accesswidener").exists()) - accessWideners(file("src/main/resources/${modId}.accesswidener")) +neoForge { + neoFormVersion = neoformVersion + + parchment { + minecraftVersion = mcVersion + mappingsVersion = parchmentVersion + } } dependencies { - val fabricLoaderVersion: String by project val forgeConfigAPIVersion: String by project api("fuzs.forgeconfigapiport:forgeconfigapiport-common-neoforgeapi:$forgeConfigAPIVersion") - compileOnly("org.spongepowered:mixin:0.8.5") -} - -publishing { - publications { - register("mavenJava", MavenPublication::class) { - artifactId = base.archivesName.get() - from(components["java"]) - } - } - - repositories { - maven("file://${System.getenv("local_maven")}") - } + compileOnly("org.spongepowered:mixin:0.8.7") } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index b62484e..77bee75 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,6 +26,8 @@ description=Discord Bot and Minecraft Mod in one bundle. credits=Erdragh minecraftVersion=1.21 +# https://projects.neoforged.net/neoforged/neoform +neoformVersion=1.21-20240613.152323 minecraftVersionRange=[1.21,) parchmentVersion=2024.07.07 diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index 837f7fb..1059711 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -1,66 +1,59 @@ import me.modmuss50.mpp.ReleaseType import me.modmuss50.mpp.platforms.curseforge.CurseforgeOptions import me.modmuss50.mpp.platforms.modrinth.ModrinthOptions -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.gradle.utils.extendsFrom plugins { idea - `maven-publish` java - id("net.neoforged.gradle.userdev") + id("net.neoforged.moddev") id("io.github.goooler.shadow") } val modId: String by project - -jarJar.enable() - val includeBotDep: Configuration by configurations.getting val shadowBotDep: Configuration by configurations.getting val runtimeLib: Configuration by configurations.getting -// Automatically enable neoforge AccessTransformers if the file exists -// This location is hardcoded in FML and can not be changed. -// https://github.com/neoforged/FancyModLoader/blob/a952595eaaddd571fbc53f43847680b00894e0c1/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFile.java#L118 -val transformerFile = file("src/main/resources/META-INF/accesstransformer.cfg") -if (transformerFile.exists()) - minecraft.accessTransformers.file(transformerFile) - -runs { - configureEach { modSource(project.sourceSets.main.get()) } +val minecraftVersion: String by project +val mcVersion = minecraftVersion +val parchmentVersion: String by project +val neoVersion: String by project +val kotlinForgeVersion: String by project - create("client") { - systemProperty("neoforge.enabledGameTestNamespaces", modId) +neoForge { + version = neoVersion - dependencies { - runtime(runtimeLib) - } + parchment { + minecraftVersion = mcVersion + mappingsVersion = parchmentVersion } - create("server") { - systemProperty("neoforge.enabledGameTestNamespaces", modId) - programArgument("--nogui") - dependencies { - runtime(runtimeLib) + validateAccessTransformers = true + + // Automatically enable neoforge AccessTransformers if the file exists + // This location is hardcoded in FML and can not be changed. + // https://github.com/neoforged/FancyModLoader/blob/a952595eaaddd571fbc53f43847680b00894e0c1/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFile.java#L118 + val transformerFile = project.file("src/main/resources/META-INF/accesstransformer.cfg") + if (transformerFile.exists()) + accessTransformers.from(transformerFile) + + mods { + create(modId) { + sourceSet(project.sourceSets.main.get()) } } - create("gameTestServer") { - systemProperty("neoforge.enabledGameTestNamespaces", modId) - dependencies { - runtime(runtimeLib) + runs { + create("server") { + server() + systemProperty("neoforge.enabledGameTestNamespaces", modId) + programArgument("--nogui") } - } - create("data") { - programArguments.addAll( - "--mod", modId, - "--all", - "--output", file("src/generated/resources").absolutePath, - "--existing", file("src/main/resources/").absolutePath - ) - dependencies { - runtime(runtimeLib) + create("gameTestServer") { + type = "gameTestServer" + systemProperty("neoforge.enabledGameTestNamespaces", modId) } } } @@ -68,45 +61,30 @@ runs { sourceSets.main.get().resources.srcDir("src/generated/resources") dependencies { - val minecraftVersion: String by project - val neoVersion: String by project - val kotlinForgeVersion: String by project - - implementation(group = "net.neoforged", name = "neoforge", version = neoVersion) // Adds KFF as dependency and Kotlin libs implementation("thedarkcolour:kotlinforforge-neoforge:$kotlinForgeVersion") - includeBotDep.dependencies.forEach { jarJar(it) } + configurations.named("additionalRuntimeClasspath").extendsFrom(configurations.named("runtimeLib")) + configurations.named("jarJar").extendsFrom(configurations.named("includeBotDep")) } tasks { - shadowJar { - archiveClassifier = null - } - - jarJar.configure { - dependsOn(shadowJar) - } - // Fixes IDE runs not processing common resources processResources { from(project(":common").sourceSets.main.get().resources) } jar { duplicatesStrategy = DuplicatesStrategy.INCLUDE + archiveClassifier = "slim" + finalizedBy(shadowJar) } -} - -publishing { - publications { - register("mavenJava", MavenPublication::class) { - artifactId = base.archivesName.get() - artifact(tasks.jar) - } + shadowJar { + dependsOn(jar) + from(jar) + archiveClassifier = null } - - repositories { - maven("file://${System.getenv("local_maven")}") + withType { + println("archive task: ${this.name}") } } @@ -125,7 +103,7 @@ publishMods { curseforge("curseNeo") { from(curseforgePublish) modLoaders.add(project.name) - file.set(tasks.jarJar.get().archiveFile) + file.set(tasks.shadowJar.get().archiveFile) additionalFiles.plus(tasks.sourcesJar.get().archiveFile) displayName = "$title $version ${titles[project.name]} $minecraftVersion" this.version = "$version-mc$minecraftVersion-${project.name}" @@ -135,7 +113,7 @@ publishMods { modrinth("modrinthNeo") { from(modrinthPublish) modLoaders.add(project.name) - file.set(tasks.jarJar.get().archiveFile) + file.set(tasks.shadowJar.get().archiveFile) additionalFiles.plus(tasks.sourcesJar.get().archiveFile) displayName = "$title $version ${titles[project.name]} $minecraftVersion" this.version = "$version-mc$minecraftVersion-${project.name}" From ebc1835a4719a2460000135e4c6d5e5edbad5a5a Mon Sep 17 00:00:00 2001 From: Erdragh Date: Sat, 27 Jul 2024 10:45:00 +0200 Subject: [PATCH 16/22] Reorganize listeners into separate packages --- common/src/main/kotlin/dev/erdragh/astralbot/Bot.kt | 5 ++--- .../dev/erdragh/astralbot/commands/discord/SetupCommands.kt | 1 + .../discord => listeners}/CommandHandlingListener.kt | 4 +++- .../{commands/discord => listeners}/UserEventListener.kt | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) rename common/src/main/kotlin/dev/erdragh/astralbot/{commands/discord => listeners}/CommandHandlingListener.kt (96%) rename common/src/main/kotlin/dev/erdragh/astralbot/{commands/discord => listeners}/UserEventListener.kt (88%) diff --git a/common/src/main/kotlin/dev/erdragh/astralbot/Bot.kt b/common/src/main/kotlin/dev/erdragh/astralbot/Bot.kt index 1939f42..21af669 100644 --- a/common/src/main/kotlin/dev/erdragh/astralbot/Bot.kt +++ b/common/src/main/kotlin/dev/erdragh/astralbot/Bot.kt @@ -1,7 +1,7 @@ package dev.erdragh.astralbot -import dev.erdragh.astralbot.commands.discord.CommandHandlingListener -import dev.erdragh.astralbot.commands.discord.UserEventListener +import dev.erdragh.astralbot.listeners.CommandHandlingListener +import dev.erdragh.astralbot.listeners.UserEventListener import dev.erdragh.astralbot.config.AstralBotConfig import dev.erdragh.astralbot.handlers.FAQHandler import dev.erdragh.astralbot.handlers.MinecraftHandler @@ -16,7 +16,6 @@ import net.minecraft.server.MinecraftServer import org.slf4j.Logger import org.slf4j.LoggerFactory import java.io.File -import java.nio.file.Path import java.time.Duration import java.time.LocalDateTime import java.util.concurrent.atomic.AtomicBoolean diff --git a/common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/SetupCommands.kt b/common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/SetupCommands.kt index c1b82b1..e5ca4a1 100644 --- a/common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/SetupCommands.kt +++ b/common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/SetupCommands.kt @@ -4,6 +4,7 @@ import dev.erdragh.astralbot.* import dev.erdragh.astralbot.config.AstralBotConfig import dev.erdragh.astralbot.config.AstralBotTextConfig import dev.erdragh.astralbot.handlers.WhitelistHandler +import dev.erdragh.astralbot.listeners.CommandHandlingListener import kotlinx.coroutines.runBlocking import net.dv8tion.jda.api.Permission import net.dv8tion.jda.api.entities.Role diff --git a/common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/CommandHandlingListener.kt b/common/src/main/kotlin/dev/erdragh/astralbot/listeners/CommandHandlingListener.kt similarity index 96% rename from common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/CommandHandlingListener.kt rename to common/src/main/kotlin/dev/erdragh/astralbot/listeners/CommandHandlingListener.kt index 9e2bd28..bae61a1 100644 --- a/common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/CommandHandlingListener.kt +++ b/common/src/main/kotlin/dev/erdragh/astralbot/listeners/CommandHandlingListener.kt @@ -1,7 +1,9 @@ -package dev.erdragh.astralbot.commands.discord +package dev.erdragh.astralbot.listeners import dev.erdragh.astralbot.LOGGER import dev.erdragh.astralbot.applicationId +import dev.erdragh.astralbot.commands.discord.AutocompleteCommand +import dev.erdragh.astralbot.commands.discord.getEnabledCommands import dev.erdragh.astralbot.config.AstralBotTextConfig import dev.erdragh.astralbot.guild import dev.erdragh.astralbot.waitForSetup diff --git a/common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/UserEventListener.kt b/common/src/main/kotlin/dev/erdragh/astralbot/listeners/UserEventListener.kt similarity index 88% rename from common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/UserEventListener.kt rename to common/src/main/kotlin/dev/erdragh/astralbot/listeners/UserEventListener.kt index abba232..06deee2 100644 --- a/common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/UserEventListener.kt +++ b/common/src/main/kotlin/dev/erdragh/astralbot/listeners/UserEventListener.kt @@ -1,4 +1,4 @@ -package dev.erdragh.astralbot.commands.discord +package dev.erdragh.astralbot.listeners import dev.erdragh.astralbot.handlers.WhitelistHandler import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent From 964c8c3a1660e3308461ec50f9ef5fbf1f10d709 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Sat, 27 Jul 2024 10:46:04 +0200 Subject: [PATCH 17/22] Fix configs constantly getting recognized as invalid --- common/src/main/kotlin/dev/erdragh/astralbot/Bot.kt | 4 ++-- .../dev/erdragh/astralbot/config/AstralBotConfig.kt | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/common/src/main/kotlin/dev/erdragh/astralbot/Bot.kt b/common/src/main/kotlin/dev/erdragh/astralbot/Bot.kt index 21af669..6ae89a3 100644 --- a/common/src/main/kotlin/dev/erdragh/astralbot/Bot.kt +++ b/common/src/main/kotlin/dev/erdragh/astralbot/Bot.kt @@ -78,11 +78,11 @@ private fun setupFromJDA(api: JDA) { LOGGER.info("Fetching required data from Discord") updatePresence(0) applicationId = api.retrieveApplicationInfo().submit().get().idLong - if (AstralBotConfig.DISCORD_GUILD.get() < 0) { + if (AstralBotConfig.DISCORD_GUILD.get() <= 0) { LOGGER.warn("No text channel for chat synchronization configured. Chat sync will not be enabled.") return } - if (AstralBotConfig.DISCORD_CHANNEL.get() < 0) { + if (AstralBotConfig.DISCORD_CHANNEL.get() <= 0) { LOGGER.warn("No text channel for chat synchronization configured. Chat sync will not be enabled.") return } diff --git a/common/src/main/kotlin/dev/erdragh/astralbot/config/AstralBotConfig.kt b/common/src/main/kotlin/dev/erdragh/astralbot/config/AstralBotConfig.kt index 83c58e3..d0c99ac 100644 --- a/common/src/main/kotlin/dev/erdragh/astralbot/config/AstralBotConfig.kt +++ b/common/src/main/kotlin/dev/erdragh/astralbot/config/AstralBotConfig.kt @@ -139,11 +139,11 @@ object AstralBotConfig { DISCORD_LINK = builder.comment("Link to the discord where your users can run the /link command") .define("discordLink", "") DISCORD_CHANNEL = builder.comment("Channel ID where the chat messages are synced") - .define("discordChannel", (-1).toLong()) + .define("discordChannel", 0L) DISCORD_GUILD = builder.comment("Guild (server) ID where the chat messages etc. are synced") - .define("discordGuild", (-1).toLong()) + .define("discordGuild", 0L) DISCORD_ROLE = builder.comment("ID of the role given to linked users") - .define("discordRole", (-1).toLong()) + .define("discordRole", 0L) CLICKABLE_MESSAGES = builder.comment("Whether to make messages sent into the Minecraft chat open the Discord chat when clicked") @@ -166,7 +166,8 @@ object AstralBotConfig { "https://rule34.xxx", "https://discord.gg" ) - ) + ), + null ) { if (it !is String) { LOGGER.warn("$it in URI blocklist is not a String") @@ -184,7 +185,9 @@ object AstralBotConfig { ENABLED_COMMANDS = builder.comment("Enabled Slash Commands") .defineList("enabledCommands", - allCommands.map { it.command.name }) { + allCommands.map { it.command.name }, + null + ) { if (it !is String) { LOGGER.warn("$it in enabledCommands is not a String") return@defineList false From f6bb72408590e399d8ee63084dc40b4f16638461 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Sat, 27 Jul 2024 10:46:21 +0200 Subject: [PATCH 18/22] Improve FAQ experience, including /listfaq --- .../commands/discord/DiscordCommands.kt | 3 +- .../astralbot/commands/discord/FAQCommand.kt | 48 +++++++++++++++++-- .../astralbot/config/AstralBotTextConfig.kt | 9 ++-- .../erdragh/astralbot/handlers/FAQHandler.kt | 6 +-- 4 files changed, 54 insertions(+), 12 deletions(-) diff --git a/common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/DiscordCommands.kt b/common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/DiscordCommands.kt index 9f78625..e5f4343 100644 --- a/common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/DiscordCommands.kt +++ b/common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/DiscordCommands.kt @@ -16,7 +16,8 @@ val allCommands = arrayOf( // Bot management commands ReloadCommand, // Utility Commands - FAQCommand, + FAQCommands, + ListFaqsCommand, // Player related commands LinkCommand, UnlinkCommand, diff --git a/common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/FAQCommand.kt b/common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/FAQCommand.kt index caa1d98..0078adc 100644 --- a/common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/FAQCommand.kt +++ b/common/src/main/kotlin/dev/erdragh/astralbot/commands/discord/FAQCommand.kt @@ -1,11 +1,15 @@ package dev.erdragh.astralbot.commands.discord +import dev.erdragh.astralbot.config.AstralBotTextConfig import dev.erdragh.astralbot.handlers.FAQHandler +import net.dv8tion.jda.api.entities.Message import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent import net.dv8tion.jda.api.interactions.commands.OptionType import net.dv8tion.jda.api.interactions.commands.build.Commands +import net.dv8tion.jda.api.interactions.commands.build.OptionData import net.dv8tion.jda.api.interactions.commands.build.SlashCommandData +import kotlin.math.min /** * This command prints FAQ messages, fetching them from @@ -16,11 +20,11 @@ import net.dv8tion.jda.api.interactions.commands.build.SlashCommandData * * @author Erdragh */ -object FAQCommand : HandledSlashCommand, AutocompleteCommand { +object FAQCommands : HandledSlashCommand, AutocompleteCommand { private const val OPTION_ID = "id" - override val command: SlashCommandData = Commands.slash("faq", "prints a specified FAQ answer") - .addOption(OptionType.STRING, OPTION_ID, "id of the faq", true, true) + override val command: SlashCommandData = Commands.slash("faq", "Prints a specified FAQ answer") + .addOption(OptionType.STRING, OPTION_ID, "ID of the FAQ", true, true) override fun handle(event: SlashCommandInteractionEvent) { // since interacting with the disk may take a while, the reply gets deferred @@ -29,12 +33,46 @@ object FAQCommand : HandledSlashCommand, AutocompleteCommand { val faqId = event.getOption(OPTION_ID)!!.asString val faqResponse = FAQHandler.getFAQForId(faqId) - event.hook.sendMessage(faqResponse).queue() + if (faqResponse.length >= Message.MAX_CONTENT_LENGTH) { + event.hook.sendMessage(AstralBotTextConfig.FAQ_TOO_LONG.get().replace("{{id}}", faqId)).queue() + } else { + event.hook.sendMessage(faqResponse).queue() + } + } override fun autocomplete(event: CommandAutoCompleteInteractionEvent) { if (event.focusedOption.name == OPTION_ID) { - event.replyChoiceStrings(FAQHandler.suggestFAQIds(event.focusedOption.value)).queue() + val faqs = FAQHandler.suggestFAQIds(event.focusedOption.value) + event.replyChoiceStrings(faqs.slice(0.. val GENERIC_BLOCKED: ModConfigSpec.ConfigValue - val FAQ_ERROR: ModConfigSpec.ConfigValue + val FAQ_TOO_LONG: ModConfigSpec.ConfigValue + val FAQ_NONE_AVAILABLE: ModConfigSpec.ConfigValue val FAQ_NO_REGISTERED: ModConfigSpec.ConfigValue val TICK_REPORT: ModConfigSpec.ConfigValue @@ -50,8 +51,10 @@ object AstralBotTextConfig { GENERIC_BLOCKED = builder.comment("Generic string that replaces blocked URLs/Links") .define("genericBlocked", "[BLOCKED]") - FAQ_ERROR = builder.comment("Message sent to Discord if an error ocurrs during FAQ loading") - .define(mutableListOf("faq", "error"), "Bot Error (Contact Bot Operator)") + FAQ_TOO_LONG = builder.comment("Message sent to Discord if an FAQ entry is too long. The id is accessible via {{id}}") + .define(mutableListOf("faq", "tooLong"), "FAQ for id `{{id}}` exceeds Discord's message length limit.") + FAQ_NONE_AVAILABLE = builder.comment("Message sent to Discord if there are no FAQs available") + .define(mutableListOf("faq", "noneAvailable"), "No FAQs available") FAQ_NO_REGISTERED = builder.comment( """Message sent to Discord when there is no FAQ for the given id. diff --git a/common/src/main/kotlin/dev/erdragh/astralbot/handlers/FAQHandler.kt b/common/src/main/kotlin/dev/erdragh/astralbot/handlers/FAQHandler.kt index 68b6d4b..7951068 100644 --- a/common/src/main/kotlin/dev/erdragh/astralbot/handlers/FAQHandler.kt +++ b/common/src/main/kotlin/dev/erdragh/astralbot/handlers/FAQHandler.kt @@ -68,7 +68,7 @@ object FAQHandler { fun getFAQForId(id: String): String { if (!faqDirectory.exists() || !faqDirectory.isDirectory) { LOGGER.error("FAQ directory not specified as directory: ${faqDirectory.absolutePath}") - return AstralBotTextConfig.FAQ_ERROR.get() + return AstralBotTextConfig.GENERIC_ERROR.get() } val faqFiles = faqDirectory.listFiles { file -> file.name == "$id.md" } val faqFile = if (faqFiles?.isNotEmpty() == true) faqFiles[0] else null @@ -81,8 +81,8 @@ object FAQHandler { * Used in the autocomplete implementation of the faq command. * @return a List of all available FAQ ids that start with the given [slug] */ - fun suggestFAQIds(slug: String): List { - return availableFAQIDs.filter { it.startsWith(slug, true) } + fun suggestFAQIds(slug: String?): List { + return availableFAQIDs.filter { it.contains(slug ?: "", true) } } /** From 62a41e49d5aa8310b9754e325602a1aa50e376ce Mon Sep 17 00:00:00 2001 From: Erdragh Date: Sat, 27 Jul 2024 10:46:27 +0200 Subject: [PATCH 19/22] Update CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94794dd..7704b45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # 1.5.3 - Unlink users on leave - Update Dependencies +- Show better error message if FAQ is too long +- Limit the autocomplete suggestion return value length to fix no options showing up +- Added the `/listfaq` command # 1.5.2 Fix tps command using wrong numbers for calculation From c464fb0425fe471607648eab78985b360aaa3d39 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Sat, 27 Jul 2024 11:52:07 +0200 Subject: [PATCH 20/22] Fix using incorrect config spec type for Long --- .../dev/erdragh/astralbot/config/AstralBotConfig.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/common/src/main/kotlin/dev/erdragh/astralbot/config/AstralBotConfig.kt b/common/src/main/kotlin/dev/erdragh/astralbot/config/AstralBotConfig.kt index d0c99ac..055e1f7 100644 --- a/common/src/main/kotlin/dev/erdragh/astralbot/config/AstralBotConfig.kt +++ b/common/src/main/kotlin/dev/erdragh/astralbot/config/AstralBotConfig.kt @@ -61,18 +61,18 @@ object AstralBotConfig { /** * The ID of the discord channel where the messages are synchronized */ - val DISCORD_CHANNEL: ModConfigSpec.ConfigValue + val DISCORD_CHANNEL: ModConfigSpec.LongValue /** * The ID of the Discord Guild (server) where this bot will be active. * This is used to get the chat sync channel etc. */ - val DISCORD_GUILD: ModConfigSpec.ConfigValue + val DISCORD_GUILD: ModConfigSpec.LongValue /** * The ID of the Discord role given to linked members */ - val DISCORD_ROLE: ModConfigSpec.ConfigValue + val DISCORD_ROLE: ModConfigSpec.LongValue /** * If this is set to true the message sent into the Minecraft chat @@ -139,11 +139,11 @@ object AstralBotConfig { DISCORD_LINK = builder.comment("Link to the discord where your users can run the /link command") .define("discordLink", "") DISCORD_CHANNEL = builder.comment("Channel ID where the chat messages are synced") - .define("discordChannel", 0L) + .defineInRange("discordChannel", 0L, 0L, Long.MAX_VALUE) DISCORD_GUILD = builder.comment("Guild (server) ID where the chat messages etc. are synced") - .define("discordGuild", 0L) + .defineInRange("discordChannel", 0L, 0L, Long.MAX_VALUE) DISCORD_ROLE = builder.comment("ID of the role given to linked users") - .define("discordRole", 0L) + .defineInRange("discordChannel", 0L, 0L, Long.MAX_VALUE) CLICKABLE_MESSAGES = builder.comment("Whether to make messages sent into the Minecraft chat open the Discord chat when clicked") From e5eb592da434021dcf9974dd778a78c24a95569d Mon Sep 17 00:00:00 2001 From: Erdragh Date: Sat, 27 Jul 2024 15:16:50 +0200 Subject: [PATCH 21/22] Fix inclusion of common subproject in neo dev --- build.gradle.kts | 11 +++++++---- neoforge/build.gradle.kts | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 004c0a3..cc0e480 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -93,9 +93,12 @@ subprojects { val runtimeLib by configurations.creating { isTransitive = true } - configurations.implementation.extendsFrom(configurations.named("shadowBotDep")) - configurations.implementation.extendsFrom(configurations.named("includeBotDep")) - configurations.implementation.extendsFrom(configurations.named("runtimeLib")) + // Configuration for depending on the common project + val commonDep by configurations.creating + configurations.implementation.extendsFrom(configurations.named(shadowBotDep.name)) + configurations.implementation.extendsFrom(configurations.named(includeBotDep.name)) + configurations.implementation.extendsFrom(configurations.named(runtimeLib.name)) + configurations.implementation.extendsFrom(configurations.named(commonDep.name)) dependencies { runtimeLib("org.xerial:sqlite-jdbc:$sqliteJDBCVersion") @@ -216,7 +219,7 @@ subprojects { dependencies { // This is runtimeLib, because NG doesn't add the common classes to the runtime classpath correctly - runtimeLib(project(":common")) { + commonDep(project(":common")) { isTransitive = false } } diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index 1059711..d487062 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -41,6 +41,7 @@ neoForge { mods { create(modId) { sourceSet(project.sourceSets.main.get()) + sourceSet(project(":common").sourceSets.main.get()) } } From d1b6368099c348d03c0e3fbbc1ffbe94537578f8 Mon Sep 17 00:00:00 2001 From: Erdragh Date: Fri, 30 Aug 2024 19:11:11 +0200 Subject: [PATCH 22/22] Update dependencies --- .gitignore | 1 + build.gradle.kts | 4 ++-- common/build.gradle.kts | 3 ++- gradle.properties | 27 ++++++++++++++------------- neoforge/build.gradle.kts | 3 ++- 5 files changed, 21 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index 984aba0..f95b34b 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ ### IntelliJ IDEA ### .idea +.kotlin ### Eclipse ### .apt_generated diff --git a/build.gradle.kts b/build.gradle.kts index cc0e480..7679417 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,7 +10,7 @@ plugins { id("io.github.goooler.shadow") version "8.1.8" apply false // Since this mod/bot is written in Kotlin and expected to run on Minecraft and as such // the JVM, the Kotlin plugin is needed - kotlin("jvm") version "2.0.0" + kotlin("jvm") version "2.0.10" // For generating documentation based on comments in the code id("org.jetbrains.dokka") version "1.9.10" java @@ -20,7 +20,7 @@ plugins { id("me.modmuss50.mod-publish-plugin") version "0.6.2" // NeoForge and Common development - id("net.neoforged.moddev") version "1.0.15" apply false + id("net.neoforged.moddev") version "1.0.19" apply false // Fabric development id("fabric-loom") version "1.7-SNAPSHOT" apply false } diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 0c5e5ba..310d465 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -8,13 +8,14 @@ val neoformVersion: String by project val minecraftVersion: String by project val mcVersion = minecraftVersion val parchmentVersion: String by project +val parchmentMinecraft: String by project val modId: String by project neoForge { neoFormVersion = neoformVersion parchment { - minecraftVersion = mcVersion + minecraftVersion = parchmentMinecraft mappingsVersion = parchmentVersion } } diff --git a/gradle.properties b/gradle.properties index 77bee75..f689b61 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,14 +5,14 @@ org.gradle.jvmargs=-Xmx3G -XX:ThreadStackSize=4096 -XX:CompilerThreadStackSize=4 enabledPlatforms=fabric,neoforge # Fabric -fabricLoaderVersion=0.16.0 -fabricApiVersion=0.100.7 -fabricKotlinVersion=1.11.0+kotlin.2.0.0 +fabricLoaderVersion=0.16.3 +fabricApiVersion=0.102.0 +fabricKotlinVersion=1.12.1+kotlin.2.0.20 # Neo -neoVersion=21.0.139-beta +neoVersion=21.1.31 neoVersionRange=[21.0,21.1) -kotlinForgeVersion=5.4.0 +kotlinForgeVersion=5.5.0 kffLoaderRange=[5,) version=1.5.3 @@ -25,21 +25,22 @@ title=AstralBot description=Discord Bot and Minecraft Mod in one bundle. credits=Erdragh -minecraftVersion=1.21 +minecraftVersion=1.21.1 # https://projects.neoforged.net/neoforged/neoform -neoformVersion=1.21-20240613.152323 -minecraftVersionRange=[1.21,) -parchmentVersion=2024.07.07 +neoformVersion=1.21.1-20240808.144430 +minecraftVersionRange=[1.21,1.21.1) +parchmentMinecraft=1.21 +parchmentVersion=2024.07.28 -forgeConfigAPIVersion=21.0.6 +forgeConfigAPIVersion=21.1.0 # Discord Interactions -jdaVersion=5.0.1 +jdaVersion=5.1.0 dcWebhooksVersion=0.8.4 # Database Interactions -exposedVersion=0.52.0 -sqliteJDBCVersion=3.46.0.0 +exposedVersion=0.54.0 +sqliteJDBCVersion=3.46.1.0 # Message parsing commonmarkVersion=0.22.0 \ No newline at end of file diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index d487062..69e47d7 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -17,6 +17,7 @@ val runtimeLib: Configuration by configurations.getting val minecraftVersion: String by project val mcVersion = minecraftVersion +val parchmentMinecraft: String by project val parchmentVersion: String by project val neoVersion: String by project val kotlinForgeVersion: String by project @@ -25,7 +26,7 @@ neoForge { version = neoVersion parchment { - minecraftVersion = mcVersion + minecraftVersion = parchmentMinecraft mappingsVersion = parchmentVersion }