From cd05b9a6685d680bbefab05905703b23de68acd0 Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Sun, 7 Dec 2025 17:32:53 +0300 Subject: [PATCH 1/4] remove fabric, forge, replace with neoforge --- .gitignore | 3 +- build.gradle.kts | 5 +- gradle.properties | 2 +- gradle/libs.versions.toml | 24 +-- .../messagebridge/di/RootModuleImpl.kt | 2 +- instances/fabric/build.gradle.kts | 153 ------------------ .../messagebridge/FabricEntryPoint.kt | 20 --- .../core/api/FabricLuckPermsProvider.kt | 11 -- .../core/api/FabricOnlinePlayersProvider.kt | 13 -- .../messagebridge/core/api/FabricServer.kt | 23 --- .../core/util/FabricEventFlow.kt | 51 ------ .../core/util/NativeComponentExt.kt | 16 -- .../messagebridge/di/RootModule.kt | 94 ----------- .../fabric/di/FabricMessengerModule.kt | 30 ---- .../messenger/fabric/event/FabricEvents.kt | 125 -------------- .../fabric/messaging/FabricBEventConsumer.kt | 63 -------- .../fabric/src/main/resources/fabric.mod.json | 36 ----- .../messagebridge/ForgeEntryPoint.kt | 53 ------ .../src/main/resources/META-INF/mods.toml | 22 --- instances/forge/src/main/resources/icon.png | Bin 5036 -> 0 bytes .../forge/src/main/resources/pack.mcmeta | 7 - .../{forge => neoforge}/build.gradle.kts | 84 ++++++---- instances/neoforge/gradle.properties | 1 + .../messagebridge/NeoForgeEntryPoint.kt | 30 ++++ .../messagebridge/di/RootModuleImpl.kt | 45 +++--- .../resources/META-INF/neoforge.mods.toml | 24 +++ .../messagebridge/core/di/CoreModule.kt | 2 +- modules/core/forge/build.gradle.kts | 34 ---- .../core/command/util/ForgeCommandExt.kt | 63 -------- .../forge/core/event/ForgeEvent.kt | 36 ----- modules/core/neoforge/build.gradle.kts | 40 +++++ .../core/api/NeoForgeLuckPermsProvider.kt} | 2 +- .../api/NeoForgeOnlinePlayersProvider.kt} | 7 +- .../messaging/MinecraftBEventConsumer.kt | 2 +- .../discord/event/MessageEventListener.kt | 2 +- .../messaging/DiscordBEventConsumer.kt | 2 +- modules/messenger/forge/build.gradle.kts | 38 ----- .../forge/util/NativeComponentExt.kt | 11 -- modules/messenger/neoforge/build.gradle.kts | 45 ++++++ .../forge/di/NeoForgeMessengerModule.kt} | 14 +- .../messenger/forge/event/NeoForgeEvents.kt} | 19 ++- .../messaging/NeoForgeBEventConsumer.kt} | 12 +- .../messaging/TelegramBEventConsumer.kt | 2 +- settings.gradle.kts | 8 +- 44 files changed, 262 insertions(+), 1014 deletions(-) delete mode 100644 instances/fabric/build.gradle.kts delete mode 100644 instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/FabricEntryPoint.kt delete mode 100644 instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/api/FabricLuckPermsProvider.kt delete mode 100644 instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/api/FabricOnlinePlayersProvider.kt delete mode 100644 instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/api/FabricServer.kt delete mode 100644 instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/util/FabricEventFlow.kt delete mode 100644 instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/util/NativeComponentExt.kt delete mode 100644 instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/di/RootModule.kt delete mode 100644 instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/fabric/di/FabricMessengerModule.kt delete mode 100644 instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/fabric/event/FabricEvents.kt delete mode 100644 instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/fabric/messaging/FabricBEventConsumer.kt delete mode 100644 instances/fabric/src/main/resources/fabric.mod.json delete mode 100755 instances/forge/src/main/kotlin/ru/astrainteractive/messagebridge/ForgeEntryPoint.kt delete mode 100644 instances/forge/src/main/resources/META-INF/mods.toml delete mode 100644 instances/forge/src/main/resources/icon.png delete mode 100644 instances/forge/src/main/resources/pack.mcmeta rename instances/{forge => neoforge}/build.gradle.kts (64%) create mode 100644 instances/neoforge/gradle.properties create mode 100755 instances/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/NeoForgeEntryPoint.kt rename instances/{forge => neoforge}/src/main/kotlin/ru/astrainteractive/messagebridge/di/RootModuleImpl.kt (59%) create mode 100644 instances/neoforge/src/main/resources/META-INF/neoforge.mods.toml delete mode 100644 modules/core/forge/build.gradle.kts delete mode 100644 modules/core/forge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/command/util/ForgeCommandExt.kt delete mode 100644 modules/core/forge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/event/ForgeEvent.kt create mode 100644 modules/core/neoforge/build.gradle.kts rename modules/core/{forge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/api/ForgeLuckPermsProvider.kt => neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/api/NeoForgeLuckPermsProvider.kt} (85%) rename modules/core/{forge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/api/ForgeOnlinePlayersProvider.kt => neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/api/NeoForgeOnlinePlayersProvider.kt} (63%) delete mode 100644 modules/messenger/forge/build.gradle.kts delete mode 100644 modules/messenger/forge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/util/NativeComponentExt.kt create mode 100644 modules/messenger/neoforge/build.gradle.kts rename modules/messenger/{forge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/di/ForgeMessengerModule.kt => neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/di/NeoForgeMessengerModule.kt} (60%) rename modules/messenger/{forge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/event/ForgeEvents.kt => neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/event/NeoForgeEvents.kt} (87%) rename modules/messenger/{forge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/messaging/ForgeBEventConsumer.kt => neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/messaging/NeoForgeBEventConsumer.kt} (86%) diff --git a/.gitignore b/.gitignore index 3c92aa0..6f57b62 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,5 @@ build-logic/build build-logic/plugins/convention/build astra.properties .gradle -libs \ No newline at end of file +libs +**/junit \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index dc2c923..d0a2926 100755 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,10 +19,11 @@ plugins { alias(libs.plugins.klibs.gradle.detekt.compose) apply false alias(libs.plugins.klibs.gradle.dokka.root) apply false alias(libs.plugins.klibs.gradle.dokka.module) apply false - alias(libs.plugins.klibs.gradle.java.core) apply false + alias(libs.plugins.klibs.gradle.java.version) apply false alias(libs.plugins.klibs.gradle.publication) apply false alias(libs.plugins.klibs.gradle.rootinfo) apply false alias(libs.plugins.klibs.minecraft.resource.processor) apply false + alias(libs.plugins.neoforgegradle) apply false } apply(plugin = "ru.astrainteractive.gradleplugin.dokka.root") @@ -32,6 +33,6 @@ apply(plugin = "ru.astrainteractive.gradleplugin.root.info") subprojects.forEach { it.apply(plugin = "ru.astrainteractive.gradleplugin.dokka.module") it.plugins.withId("org.jetbrains.kotlin.jvm") { - it.apply(plugin = "ru.astrainteractive.gradleplugin.java.core") + it.apply(plugin = "ru.astrainteractive.gradleplugin.java.version") } } diff --git a/gradle.properties b/gradle.properties index 4406b2c..06f3740 100755 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ makeevrserg.java.ktarget=21 # Project makeevrserg.project.name=MessageBridge makeevrserg.project.group=ru.astrainteractive.messagebridge -makeevrserg.project.version.string=0.16.0 +makeevrserg.project.version.string=0.17.0 makeevrserg.project.description=Bridge for TG and Discord makeevrserg.project.developers=makeevrserg|Makeev Roman|makeevrserg@gmail.com makeevrserg.project.url=https://empireprojekt.ru diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b785c0a..c71df2c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,6 +7,7 @@ driver-mariadb = "3.5.6" driver-mysql = "8.0.33" exposed = "0.61.0" forgegradle = "[6.0,6.2)" +neoforgegradle = "7.1.6" gradle-buildconfig = "5.7.0" gradle-ftp = "0.1.2" gradle-shadow = "9.2.2" @@ -14,7 +15,7 @@ gson = "2.13.2" guava = "33.5.0-jre" jda = "6.1.0" jda-webhook = "0.8.4" -klibs-gradleplugin = "1.11.1" +klibs-gradleplugin = "1.13.2" klibs-kdi = "1.4.8" klibs-kstorage = "4.4.1" klibs-mikro = "1.16.0" @@ -29,19 +30,19 @@ ktor = "3.3.1" kyori = "4.25.0" kyori-adventure = "4.25.0" mcprotocollib = "1.21.7-SNAPSHOT" -minecraft-astralibs = "3.28.4" +minecraft-astralibs = "3.31.1" minecraft-bstats = "3.1.0" minecraft-bungee = "1.21-R0.5-SNAPSHOT" minecraft-essentialsx = "2.21.2" -minecraft-fabric-api = "0.134.1+" +minecraft-fabric-api = "0.136.3+" minecraft-fabric-yarn = "1.20.1+build.10" -minecraft-fabric-kotlin = "1.13.1+" -minecraft-fabric-loader = "0.17.2" -minecraft-fabric-loom = "1.11.8" +minecraft-fabric-kotlin = "1.13.7+" +minecraft-fabric-loader = "0.17.3" +minecraft-fabric-loom = "1.12.5" minecraft-luckperms = "5.5" minecraft-mockbukkit = "4.33.2" -minecraft-mojang-version = "1.20.1" -minecraft-packetevents = "2.10.0" +minecraft-mojang-version = "1.21.1" +minecraft-packetevents = "2.10.1" minecraft-papi = "2.11.6" minecraft-protocollib = "5.3.0" minecraft-spigot = "1.21.9-R0.1-SNAPSHOT" @@ -49,6 +50,7 @@ minecraft-towny = "0.101.2.1" minecraft-vault = "1.7.1" minecraft-velocity = "4.0.0-SNAPSHOT" minecraft-forgeversion = "47.2.20" +minecraft-neoforgeversion = "21.1.129" shadow = "8.1.8" telegrambots = "9.2.0" tests-junit-bom = "6.0.1" @@ -103,7 +105,7 @@ mcprotocollib = { module = "org.geysermc.mcprotocollib:protocol", version.ref = minecraft-astralibs-command = { module = "ru.astrainteractive.astralibs:command", version.ref = "minecraft-astralibs" } minecraft-astralibs-command-bukkit = { module = "ru.astrainteractive.astralibs:command-bukkit", version.ref = "minecraft-astralibs" } minecraft-astralibs-core-bukkit = { module = "ru.astrainteractive.astralibs:core-bukkit", version.ref = "minecraft-astralibs" } -minecraft-astralibs-core-forge = { module = "ru.astrainteractive.astralibs:core-forge", version.ref = "minecraft-astralibs" } +minecraft-astralibs-core-neoforge = { module = "ru.astrainteractive.astralibs:core-neoforge", version.ref = "minecraft-astralibs" } minecraft-astralibs-exposed = { module = "ru.astrainteractive.astralibs:exposed", version.ref = "minecraft-astralibs" } minecraft-astralibs-menu-bukkit = { module = "ru.astrainteractive.astralibs:menu-bukkit", version.ref = "minecraft-astralibs" } minecraft-astralibs-orm = { module = "ru.astrainteractive.astralibs:orm", version.ref = "minecraft-astralibs" } @@ -126,6 +128,7 @@ minecraft-spigot-core = { module = "org.spigotmc:spigot", version.ref = "minecra minecraft-towny = { module = "com.palmergames.bukkit.towny:towny", version.ref = "minecraft-towny" } minecraft-vaultapi = { module = "com.github.MilkBowl:VaultAPI", version.ref = "minecraft-vault" } minecraft-velocity-api = { module = "com.velocitypowered:velocity-api", version.ref = "minecraft-velocity" } +minecraft-neoforgeversion = { module = "net.neoforged:neoforge", version.ref = "minecraft-neoforgeversion" } telegrambots-client = { module = "org.telegram:telegrambots-client", version.ref = "telegrambots" } telegrambots-extensions = { module = "org.telegram:telegrambots-extensions", version.ref = "telegrambots" } telegrambots-longpolling = { module = "org.telegram:telegrambots-longpolling", version.ref = "telegrambots" } @@ -142,13 +145,14 @@ turbine = { module = "app.cash.turbine:turbine", version.ref = "turbine" } fabric-loom = { id = "fabric-loom", version.ref = "minecraft-fabric-loom" } forgegradle = { id = "net.minecraftforge.gradle", version.ref = "forgegradle" } gradle-buildconfig = { id = "com.github.gmazzo.buildconfig", version.ref = "gradle-buildconfig" } +neoforgegradle = { id = "net.neoforged.gradle.userdev", version.ref = "neoforgegradle" } gradle-ftp = { id = "ru.astrainteractive.ftpplugin.gradleftp", version.ref = "gradle-ftp" } gradle-shadow = { id = "com.gradleup.shadow", version.ref = "gradle-shadow" } klibs-gradle-detekt = { id = "ru.astrainteractive.gradleplugin.detekt", version.ref = "klibs-gradleplugin" } klibs-gradle-detekt-compose = { id = "ru.astrainteractive.gradleplugin.detekt.compose", version.ref = "klibs-gradleplugin" } klibs-gradle-dokka-module = { id = "ru.astrainteractive.gradleplugin.dokka.module", version.ref = "klibs-gradleplugin" } klibs-gradle-dokka-root = { id = "ru.astrainteractive.gradleplugin.dokka.root", version.ref = "klibs-gradleplugin" } -klibs-gradle-java-core = { id = "ru.astrainteractive.gradleplugin.java.core", version.ref = "klibs-gradleplugin" } +klibs-gradle-java-version = { id = "ru.astrainteractive.gradleplugin.java.version", version.ref = "klibs-gradleplugin" } klibs-gradle-minecraft-empty = { id = "ru.astrainteractive.gradleplugin.minecraft.empty", version.ref = "klibs-gradleplugin" } klibs-gradle-minecraft-multiplatform = { id = "ru.astrainteractive.gradleplugin.minecraft.multiplatform", version.ref = "klibs-gradleplugin" } klibs-gradle-publication = { id = "ru.astrainteractive.gradleplugin.publication", version.ref = "klibs-gradleplugin" } diff --git a/instances/bukkit/src/main/kotlin/ru/astrainteractive/messagebridge/di/RootModuleImpl.kt b/instances/bukkit/src/main/kotlin/ru/astrainteractive/messagebridge/di/RootModuleImpl.kt index 547af8e..a08a89f 100755 --- a/instances/bukkit/src/main/kotlin/ru/astrainteractive/messagebridge/di/RootModuleImpl.kt +++ b/instances/bukkit/src/main/kotlin/ru/astrainteractive/messagebridge/di/RootModuleImpl.kt @@ -2,7 +2,7 @@ package ru.astrainteractive.messagebridge.di import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch -import ru.astrainteractive.astralibs.async.DefaultBukkitDispatchers +import ru.astrainteractive.astralibs.coroutines.DefaultBukkitDispatchers import ru.astrainteractive.astralibs.kyori.KyoriComponentSerializer import ru.astrainteractive.astralibs.lifecycle.Lifecycle import ru.astrainteractive.klibs.kstorage.api.impl.DefaultMutableKrate diff --git a/instances/fabric/build.gradle.kts b/instances/fabric/build.gradle.kts deleted file mode 100644 index 7f36fc2..0000000 --- a/instances/fabric/build.gradle.kts +++ /dev/null @@ -1,153 +0,0 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import net.fabricmc.loom.task.RemapJarTask -import ru.astrainteractive.gradleplugin.property.extension.ModelPropertyValueExt.requireProjectInfo - -plugins { - kotlin("jvm") - alias(libs.plugins.fabric.loom) - alias(libs.plugins.klibs.minecraft.resource.processor) - alias(libs.plugins.gradle.shadow) -} - -dependencies { - minecraft(libs.minecraft.fabric.mojang.get()) - mappings("net.fabricmc:yarn:${libs.versions.minecraft.fabric.yarn.get()}:v2") - modImplementation(libs.minecraft.fabric.loader.get()) - modImplementation(libs.minecraft.fabric.api.get()) -} - -dependencies { - // Kotlin - implementation(libs.kotlin.coroutines.core) - // AstraLibs - implementation(libs.minecraft.astralibs.core) - implementation(libs.minecraft.astralibs.command) - implementation(libs.kotlin.serialization.kaml) - implementation(libs.klibs.mikro.core) - implementation(libs.klibs.kstorage) - implementation(libs.kotlin.datetime) - implementation(libs.driver.h2) - // Spigot - compileOnly(libs.minecraft.luckperms) - // Local - implementation(projects.modules.messenger.api) - implementation(projects.modules.messenger.discord) - implementation(projects.modules.messenger.forge) - implementation(projects.modules.messenger.telegram) - implementation(projects.modules.core.api) - implementation(projects.modules.core.forge) - implementation(projects.modules.link) - implementation(libs.kyori.plain) - implementation(libs.kyori.legacy) - implementation(libs.kyori.gson) -} - -minecraftProcessResource { - fabric() -} - -val destination = rootDir.resolve("build") - .resolve("fabric") - .resolve("mods") - .takeIf { it.exists() } - ?: File(rootDir, "jars") - -val shadowJar by tasks.getting(ShadowJar::class) { - mergeServiceFiles() -// mustRunAfter(minecraftProcessResource.task) -// dependsOn(minecraftProcessResource.task) - configurations = listOf(project.configurations.shadow.get()) - isReproducibleFileOrder = true - archiveClassifier = null as String? - archiveVersion = requireProjectInfo.versionString - archiveBaseName = "${requireProjectInfo.name}-fabric" - dependencies { - // deps - exclude(dependency("org.jetbrains:annotations")) - // deps paths - exclude("co/touchlab/stately/**") - exclude("club/minnced/opus/**") - exclude("com/google/**") - exclude("com/sun/**") - exclude("google/protobuf/**") - exclude("io/github/**") - exclude("io/javalin/**") - exclude("jakarta/servlet/**") - exclude("javax/annotation/**") - exclude("javax/servlet/**") - exclude("natives/**") - exclude("nl/altindag/**") - exclude("org/eclipse/**") - exclude("org/bouncycastle/**") - exclude("org/checkerframework/**") - exclude("org/conscrypt/**") - exclude("tomp2p/opuswrapper/**") - exclude("DebugProbesKt.bin") - exclude("_COROUTINE/**") - // meta -// exclude("META-INF/services/**") - exclude("META-INF/*.kotlin_module") - exclude("META-INF/com.android.tools/**") - exclude("META-INF/gradle-plugins/**") - exclude("META-INF/maven/**") - exclude("META-INF/proguard/**") - exclude("META-INF/versions/**") - exclude("META-INF/native/**") - exclude("META-INF/**LICENCE**") - } - // Be sure to relocate EXACT PACKAGES!! - // For example, relocate org.some.package instead of org - // Becuase relocation org will break other non-relocated dependencies such as org.minecraft - listOf( - "com.fasterxml", - "net.kyori", - "org.h2", - "com.neovisionaries", - "gnu.trove", - "org.json", - "org.apache", - "org.telegram", - "okhttp3", - "net.dv8tion", - "okio", - "org.slf4j", - "kotlin", - "kotlinx", - "it.krzeminski", - "net.thauvin", - "org.jetbrains.exposed.dao", - "org.jetbrains.exposed.exceptions", - "org.jetbrains.exposed.sql", - "org.jetbrains.exposed.jdbc", - "org.jetbrains.kotlin", - "org.jetbrains.kotlinx", - "com.charleskorn.kaml", - "ru.astrainteractive.klibs", - "ru.astrainteractive.astralibs", - "club.minnced.discord", - "club.minnced.opus" - ).forEach { pattern -> relocate(pattern, "${requireProjectInfo.group}.shade.$pattern") } -} - -val remapJar = tasks.getByName("remapJar") { - dependsOn(shadowJar) - mustRunAfter(shadowJar) - inputFile = shadowJar.archiveFile - addNestedDependencies.set(true) - archiveBaseName.set("${requireProjectInfo.name}-fabric") - destinationDirectory.set(destination) - archiveVersion = requireProjectInfo.versionString -} - -tasks.assemble { - dependsOn(remapJar) -} - -artifacts { - archives(remapJar) - shadow(shadowJar) -} - -minecraftProcessResource { - fabric() -} diff --git a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/FabricEntryPoint.kt b/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/FabricEntryPoint.kt deleted file mode 100644 index af66dea..0000000 --- a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/FabricEntryPoint.kt +++ /dev/null @@ -1,20 +0,0 @@ -package ru.astrainteractive.messagebridge - -import net.fabricmc.api.ModInitializer -import ru.astrainteractive.messagebridge.di.RootModule - -class FabricEntryPoint : ModInitializer { - - private val rootModule: RootModule by lazy { - RootModule() - } - - override fun onInitialize() { - println("AstraTemplate: onInitialize") - rootModule.lifecycle.onEnable() - } - - fun reload() { - rootModule.lifecycle.onReload() - } -} diff --git a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/api/FabricLuckPermsProvider.kt b/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/api/FabricLuckPermsProvider.kt deleted file mode 100644 index 8fff919..0000000 --- a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/api/FabricLuckPermsProvider.kt +++ /dev/null @@ -1,11 +0,0 @@ -package ru.astrainteractive.messagebridge.core.api - -import net.luckperms.api.LuckPerms - -object FabricLuckPermsProvider : LuckPermsProvider { - override fun provide(): LuckPerms? { - return runCatching { - net.luckperms.api.LuckPermsProvider.get() - }.getOrNull() - } -} diff --git a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/api/FabricOnlinePlayersProvider.kt b/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/api/FabricOnlinePlayersProvider.kt deleted file mode 100644 index 7dd7fb9..0000000 --- a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/api/FabricOnlinePlayersProvider.kt +++ /dev/null @@ -1,13 +0,0 @@ -package ru.astrainteractive.messagebridge.core.api - -import net.minecraft.server.network.ServerPlayerEntity -import net.minecraft.text.Text -import kotlin.collections.map - -class FabricOnlinePlayersProvider : OnlinePlayersProvider { - override fun provide(): List { - return FabricServer.getOnlinePlayers() - .map(ServerPlayerEntity::getDisplayName) - .map(Text::getString) - } -} diff --git a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/api/FabricServer.kt b/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/api/FabricServer.kt deleted file mode 100644 index 262d23d..0000000 --- a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/api/FabricServer.kt +++ /dev/null @@ -1,23 +0,0 @@ -package ru.astrainteractive.messagebridge.core.api - -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.stateIn -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents -import net.minecraft.server.network.ServerPlayerEntity -import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger -import ru.astrainteractive.klibs.mikro.core.logging.Logger -import ru.astrainteractive.messagebridge.core.util.fabricEventFlow -import ru.astrainteractive.messagebridge.core.util.send - -object FabricServer : Logger by JUtiltLogger("MessageBridge-FabricServer").withoutParentHandlers() { - val serverFlow = fabricEventFlow { - val callback = ServerLifecycleEvents.ServerStarted(::send) - ServerLifecycleEvents.SERVER_STARTED.register(callback) - }.map { it.t }.stateIn(GlobalScope, SharingStarted.Companion.Eagerly, null) - - fun getOnlinePlayers(): List { - return serverFlow.value?.playerManager?.playerList.orEmpty().filterNotNull() - } -} diff --git a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/util/FabricEventFlow.kt b/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/util/FabricEventFlow.kt deleted file mode 100644 index 8e16319..0000000 --- a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/util/FabricEventFlow.kt +++ /dev/null @@ -1,51 +0,0 @@ -package ru.astrainteractive.messagebridge.core.util - -import kotlinx.coroutines.channels.ProducerScope -import kotlinx.coroutines.channels.awaitClose -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.channelFlow -import kotlinx.coroutines.launch - -// data -data class KFabricEventData1(val t: T) -data class KFabricEventData2(val t1: T1, val t2: T2) -data class KFabricEventData3(val t1: T1, val t2: T2, val t3: T3) - -// scope -interface FabricEventProducerScope : ProducerScope -class FabricEventProducerScopeImpl( - instance: ProducerScope -) : FabricEventProducerScope, ProducerScope by instance - -fun fabricEventFlow(block: suspend FabricEventProducerScope.() -> Unit): Flow = channelFlow { - val scope = FabricEventProducerScopeImpl(this) - block.invoke(scope) - awaitClose { } -} - -/** - * ``` - * val START_SERVER_TICK = fabricEventFlow { - * val callback = ServerTickEvents.StartTick(::send) - * ServerTickEvents.START_SERVER_TICK.register(callback) - * } - * ``` - * - * ``` - * val JOIN = fabricEventFlow { - * val callback = ServerPlayConnectionEvents.Join(::send) - * ServerPlayConnectionEvents.JOIN.register(callback) - * } - * ``` - */ -inline fun FabricEventProducerScope>.send(t: T) { - launch { send(KFabricEventData1(t)) } -} - -fun FabricEventProducerScope>.send(t1: T1, t2: T2) { - launch { send(KFabricEventData2(t1, t2)) } -} - -fun FabricEventProducerScope>.send(t1: T1, t2: T2, t3: T3) { - launch { send(KFabricEventData3(t1, t2, t3)) } -} diff --git a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/util/NativeComponentExt.kt b/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/util/NativeComponentExt.kt deleted file mode 100644 index 44fc307..0000000 --- a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/core/util/NativeComponentExt.kt +++ /dev/null @@ -1,16 +0,0 @@ -package ru.astrainteractive.messagebridge.core.util - -import net.kyori.adventure.text.Component -import net.minecraft.text.MutableText -import net.minecraft.text.Text -import ru.astrainteractive.astralibs.kyori.KyoriComponentSerializer - -fun Component.toText(): MutableText { - val string = KyoriComponentSerializer.Gson.serializer.serialize(this) - return Text.Serializer.fromJson(string) ?: Text.empty() -} - -fun Text.toComponent(): Component { - val string = Text.Serializer.toJson(this) - return KyoriComponentSerializer.Gson.serializer.deserialize(string) -} diff --git a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/di/RootModule.kt b/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/di/RootModule.kt deleted file mode 100644 index 5620fdc..0000000 --- a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/di/RootModule.kt +++ /dev/null @@ -1,94 +0,0 @@ -package ru.astrainteractive.messagebridge.di - -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch -import net.fabricmc.loader.api.FabricLoader -import ru.astrainteractive.astralibs.kyori.KyoriComponentSerializer -import ru.astrainteractive.astralibs.lifecycle.Lifecycle -import ru.astrainteractive.klibs.kstorage.api.impl.DefaultMutableKrate -import ru.astrainteractive.klibs.kstorage.util.asCachedKrate -import ru.astrainteractive.klibs.mikro.core.dispatchers.DefaultKotlinDispatchers -import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers -import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger -import ru.astrainteractive.klibs.mikro.core.logging.Logger -import ru.astrainteractive.messagebridge.core.api.FabricLuckPermsProvider -import ru.astrainteractive.messagebridge.core.api.FabricOnlinePlayersProvider -import ru.astrainteractive.messagebridge.core.api.FabricServer -import ru.astrainteractive.messagebridge.core.di.CoreModule -import ru.astrainteractive.messagebridge.link.di.LinkModule -import ru.astrainteractive.messagebridge.messaging.internal.BEventChannel -import ru.astrainteractive.messagebridge.messaging.model.ServerClosedBEvent -import ru.astrainteractive.messagebridge.messaging.model.ServerOpenBEvent -import ru.astrainteractive.messagebridge.messenger.discord.di.JdaMessengerModule -import ru.astrainteractive.messagebridge.messenger.fabric.di.FabricMessengerModule -import ru.astrainteractive.messagebridge.messenger.telegram.di.TelegramMessengerModule -import java.io.File - -class RootModule : Logger by JUtiltLogger("MessageBridge-RootModuleImpl").withoutParentHandlers() { - val coreModule = CoreModule( - dataFolder = FabricLoader.getInstance().configDir - .toFile() - .resolve("MessageBridge") - .also(File::mkdirs), - dispatchers = object : KotlinDispatchers { - override val Main = DefaultKotlinDispatchers.IO - override val IO = DefaultKotlinDispatchers.IO - override val Default = DefaultKotlinDispatchers.Default - override val Unconfined = DefaultKotlinDispatchers.Unconfined - } - ) - - val fabricLuckPermsProvider = FabricLuckPermsProvider - val fabricOnlinePlayersProvider = FabricOnlinePlayersProvider() - - val linkModule = LinkModule.Default(coreModule, fabricLuckPermsProvider) - - val kyoriKrate = DefaultMutableKrate( - factory = { KyoriComponentSerializer.Legacy }, - loader = { null } - ).asCachedKrate() - - val fabricMessengerModule = FabricMessengerModule( - coreModule = coreModule, - serverStateFlow = FabricServer.serverFlow - ) - - val jdaMessengerModule = JdaMessengerModule( - coreModule = coreModule, - onlinePlayersProvider = fabricOnlinePlayersProvider, - linkModule = linkModule - ) - - val telegramMessengerModule = TelegramMessengerModule( - coreModule = coreModule, - onlinePlayersProvider = fabricOnlinePlayersProvider, - linkModule = linkModule - ) - - private val lifecycles: List - get() = listOf( - coreModule.lifecycle, - // event - fabricMessengerModule.lifecycle, - jdaMessengerModule.lifecycle, - telegramMessengerModule.lifecycle, - ) - - val lifecycle = Lifecycle.Lambda( - onEnable = { - GlobalScope.launch { - BEventChannel.consume(ServerOpenBEvent) - } - lifecycles.forEach(Lifecycle::onEnable) - }, - onReload = { - lifecycles.forEach(Lifecycle::onReload) - }, - onDisable = { - GlobalScope.launch { - BEventChannel.consume(ServerClosedBEvent) - } - lifecycles.forEach(Lifecycle::onDisable) - } - ) -} diff --git a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/fabric/di/FabricMessengerModule.kt b/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/fabric/di/FabricMessengerModule.kt deleted file mode 100644 index e16c121..0000000 --- a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/fabric/di/FabricMessengerModule.kt +++ /dev/null @@ -1,30 +0,0 @@ -package ru.astrainteractive.messagebridge.messenger.fabric.di - -import kotlinx.coroutines.cancel -import kotlinx.coroutines.flow.StateFlow -import net.minecraft.server.MinecraftServer -import ru.astrainteractive.astralibs.lifecycle.Lifecycle -import ru.astrainteractive.messagebridge.core.di.CoreModule -import ru.astrainteractive.messagebridge.messenger.fabric.event.FabricEvents -import ru.astrainteractive.messagebridge.messenger.fabric.messaging.FabricBEventConsumer - -class FabricMessengerModule( - coreModule: CoreModule, - serverStateFlow: StateFlow -) { - val eventBukkitMessengerModule = FabricEvents( - configKrate = coreModule.configKrate, - scope = coreModule.ioScope, - dispatchers = coreModule.dispatchers - ) - private val minecraftMessageController = FabricBEventConsumer( - translationKrate = coreModule.translationKrate, - serverStateFlow = serverStateFlow, - ) - - val lifecycle = Lifecycle.Lambda( - onDisable = { - minecraftMessageController.cancel() - } - ) -} diff --git a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/fabric/event/FabricEvents.kt b/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/fabric/event/FabricEvents.kt deleted file mode 100644 index 88cf12f..0000000 --- a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/fabric/event/FabricEvents.kt +++ /dev/null @@ -1,125 +0,0 @@ -package ru.astrainteractive.messagebridge.messenger.fabric.event - -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.launch -import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents -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 ru.astrainteractive.klibs.kstorage.api.CachedKrate -import ru.astrainteractive.klibs.kstorage.util.getValue -import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers -import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger -import ru.astrainteractive.klibs.mikro.core.logging.Logger -import ru.astrainteractive.messagebridge.core.PluginConfiguration -import ru.astrainteractive.messagebridge.core.util.fabricEventFlow -import ru.astrainteractive.messagebridge.core.util.send -import ru.astrainteractive.messagebridge.messaging.internal.BEventChannel -import ru.astrainteractive.messagebridge.messaging.model.PlayerDeathBEvent -import ru.astrainteractive.messagebridge.messaging.model.PlayerJoinedBEvent -import ru.astrainteractive.messagebridge.messaging.model.PlayerLeaveBEvent -import ru.astrainteractive.messagebridge.messaging.model.ServerClosedBEvent -import ru.astrainteractive.messagebridge.messaging.model.ServerOpenBEvent -import ru.astrainteractive.messagebridge.messaging.model.Text - -class FabricEvents( - configKrate: CachedKrate, - private val scope: CoroutineScope, - private val dispatchers: KotlinDispatchers -) : Logger by JUtiltLogger("MessageBridge-ForgeEvents").withoutParentHandlers() { - private val config by configKrate - - val serverStartedEvent = fabricEventFlow { - val callback = ServerLifecycleEvents.ServerStarted(::send) - ServerLifecycleEvents.SERVER_STARTED.register(callback) - } - .onEach { info { "#serverStartedEvent" } } - .onEach { - scope.launch { - BEventChannel.consume(ServerOpenBEvent) - } - }.launchIn(scope) - - val serverStoppingEvent = fabricEventFlow { - val callback = ServerLifecycleEvents.ServerStopping(::send) - ServerLifecycleEvents.SERVER_STOPPING.register(callback) - } - .onEach { info { "#serverStoppingEvent" } } - .onEach { - scope.launch { - BEventChannel.consume(ServerClosedBEvent) - } - }.launchIn(scope) - - val playerLoggedOutEvent = fabricEventFlow { - val callback = ServerPlayConnectionEvents.Disconnect(::send) - ServerPlayConnectionEvents.DISCONNECT.register(callback) - } - .onEach { info { "#playerLoggedOutEvent" } } - .filter { config.displayLeaveMessage } - .onEach { (handler, server) -> - val player = handler.player - scope.launch(dispatchers.IO) { - val serverEvent = PlayerLeaveBEvent( - name = player.name.string, - uuid = player.uuid.toString() - ) - BEventChannel.consume(serverEvent) - } - }.launchIn(scope) - - val playerLoggedInEvent = fabricEventFlow { - val callback = ServerPlayConnectionEvents.Join(::send) - ServerPlayConnectionEvents.JOIN.register(callback) - } - .onEach { info { "#playerLoggedInEvent" } } - .filter { config.displayJoinMessage } - .onEach { (handler, sender, server) -> - val player = handler.player - scope.launch(dispatchers.IO) { - val serverEvent = PlayerJoinedBEvent( - name = player.name.string, - uuid = player.uuid.toString(), - hasPlayedBefore = true - ) - BEventChannel.consume(serverEvent) - } - }.launchIn(scope) - - val afterDeathEvent = fabricEventFlow { - val callback = ServerLivingEntityEvents.AfterDeath(::send) - ServerLivingEntityEvents.AFTER_DEATH.register(callback) - } - .filter { config.displayDeathMessage } - .filter { (entity, source) -> entity.isPlayer } - .onEach { (entity, source) -> - scope.launch(dispatchers.IO) { - val deathCause = source.getDeathMessage(entity)?.string - val serverEvent = PlayerDeathBEvent( - name = entity.name.string, - cause = deathCause, - uuid = entity.uuid.toString() - ) - BEventChannel.consume(serverEvent) - } - }.launchIn(scope) - - val serverChatEvent = fabricEventFlow { - val callback = ServerMessageEvents.ChatMessage(::send) - ServerMessageEvents.CHAT_MESSAGE.register(callback) - } - .onEach { info { "#serverChatEvent" } } - .onEach { (signedMessage, player, params) -> - scope.launch(dispatchers.IO) { - val serverEvent = Text.Minecraft( - author = player.name.string, - text = signedMessage.content.string, - uuid = player.uuid.toString() - ) - BEventChannel.consume(serverEvent) - } - }.launchIn(scope) -} diff --git a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/fabric/messaging/FabricBEventConsumer.kt b/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/fabric/messaging/FabricBEventConsumer.kt deleted file mode 100644 index 6094be5..0000000 --- a/instances/fabric/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/fabric/messaging/FabricBEventConsumer.kt +++ /dev/null @@ -1,63 +0,0 @@ -package ru.astrainteractive.messagebridge.messenger.fabric.messaging - -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import net.minecraft.server.MinecraftServer -import ru.astrainteractive.astralibs.async.withTimings -import ru.astrainteractive.astralibs.kyori.KyoriComponentSerializer -import ru.astrainteractive.klibs.kstorage.api.CachedKrate -import ru.astrainteractive.klibs.kstorage.util.getValue -import ru.astrainteractive.klibs.mikro.core.coroutines.CoroutineFeature -import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger -import ru.astrainteractive.klibs.mikro.core.logging.Logger -import ru.astrainteractive.messagebridge.core.PluginTranslation -import ru.astrainteractive.messagebridge.core.util.toText -import ru.astrainteractive.messagebridge.messaging.BEventConsumer -import ru.astrainteractive.messagebridge.messaging.internal.BEventChannel -import ru.astrainteractive.messagebridge.messaging.model.BEvent -import ru.astrainteractive.messagebridge.messaging.model.MessageFrom -import ru.astrainteractive.messagebridge.messaging.model.PlayerDeathBEvent -import ru.astrainteractive.messagebridge.messaging.model.PlayerJoinedBEvent -import ru.astrainteractive.messagebridge.messaging.model.PlayerLeaveBEvent -import ru.astrainteractive.messagebridge.messaging.model.ServerClosedBEvent -import ru.astrainteractive.messagebridge.messaging.model.ServerOpenBEvent -import ru.astrainteractive.messagebridge.messaging.model.Text - -internal class FabricBEventConsumer( - translationKrate: CachedKrate, - private val serverStateFlow: StateFlow -) : BEventConsumer, - CoroutineFeature by CoroutineFeature.IO.withTimings(), - Logger by JUtiltLogger("MessageBridge-ForgeBEventConsumer").withoutParentHandlers() { - private val translation by translationKrate - - override suspend fun consume(bEvent: BEvent) { - if (bEvent.from == MessageFrom.MINECRAFT) return - val component = when (bEvent) { - is Text -> { - translation.minecraftMessageFormat( - playerName = bEvent.author, - message = bEvent.text, - from = bEvent.from.short - ) - } - - ServerOpenBEvent, - ServerClosedBEvent, - is PlayerLeaveBEvent, - is PlayerJoinedBEvent, - is PlayerDeathBEvent -> null - }?.let(KyoriComponentSerializer.Legacy::toComponent) ?: return - serverStateFlow.value?.playerManager?.playerList.orEmpty().forEach { player -> - player.sendMessage(component.toText()) - } - } - - init { - BEventChannel - .bEvents(this) - .onEach { bEvent -> consume(bEvent) } - .launchIn(this) - } -} diff --git a/instances/fabric/src/main/resources/fabric.mod.json b/instances/fabric/src/main/resources/fabric.mod.json deleted file mode 100644 index ded58f6..0000000 --- a/instances/fabric/src/main/resources/fabric.mod.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "schemaVersion": 1, - "id": "astratemplate", - "version": "${version}", - - "name": "Astra Template Fabric Mod", - "description": "Template Fabric mod made for EmpireProjekt.ru", - "authors": [ - "Makeev Roman" - ], - "contact": { - "homepage": "https://t.me/empiresmp", - "sources": "https://github.com/Astra-Interactive/AstraTemplate" - }, - - "license": "CC0-1.0", - "icon": "assets/modid/icon.png", - - "environment": "*", - "entrypoints": { - "main": [ - { - "value": "ru.astrainteractive.messagebridge.FabricEntryPoint" - } - ] - }, - "depends": { - "fabricloader": ">=0.14.24", - "fabric": "*", - "minecraft": "1.20.x", - "java": ">=17" - }, - "suggests": { - "another-mod": "*" - } -} \ No newline at end of file diff --git a/instances/forge/src/main/kotlin/ru/astrainteractive/messagebridge/ForgeEntryPoint.kt b/instances/forge/src/main/kotlin/ru/astrainteractive/messagebridge/ForgeEntryPoint.kt deleted file mode 100755 index 71e7f59..0000000 --- a/instances/forge/src/main/kotlin/ru/astrainteractive/messagebridge/ForgeEntryPoint.kt +++ /dev/null @@ -1,53 +0,0 @@ -package ru.astrainteractive.messagebridge - -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import net.minecraftforge.event.RegisterCommandsEvent -import net.minecraftforge.event.server.ServerStartedEvent -import net.minecraftforge.event.server.ServerStoppingEvent -import net.minecraftforge.eventbus.api.EventPriority -import net.minecraftforge.fml.common.Mod -import ru.astrainteractive.astralibs.lifecycle.Lifecycle -import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger -import ru.astrainteractive.klibs.mikro.core.logging.Logger -import ru.astrainteractive.messagebridge.di.RootModuleImpl -import ru.astrainteractive.messagebridge.forge.core.event.flowEvent -import javax.annotation.ParametersAreNonnullByDefault - -@Mod("messagebridge") -@ParametersAreNonnullByDefault -class ForgeEntryPoint : - Logger by JUtiltLogger("ForgeEntryPoint").withoutParentHandlers(), - Lifecycle { - private val rootModule by lazy { RootModuleImpl() } - - override fun onEnable() { - rootModule.lifecycle.onEnable() - } - - override fun onDisable() { - info { "#onDisable" } - rootModule.lifecycle.onDisable() - } - - override fun onReload() { - rootModule.lifecycle.onReload() - } - - val serverStartedEvent = flowEvent(EventPriority.HIGHEST) - .onEach { - info { "#serverStartedEvent" } - onEnable() - }.launchIn(rootModule.coreModule.ioScope) - - val serverStoppingEvent = flowEvent(EventPriority.HIGHEST) - .onEach { - info { "#serverStoppingEvent" } - onDisable() - }.launchIn(rootModule.coreModule.ioScope) - - val registerCommandsEvent = flowEvent(EventPriority.HIGHEST) - .onEach { e -> - info { "#registerCommandsEvent" } - }.launchIn(rootModule.coreModule.ioScope) -} diff --git a/instances/forge/src/main/resources/META-INF/mods.toml b/instances/forge/src/main/resources/META-INF/mods.toml deleted file mode 100644 index 3c004c6..0000000 --- a/instances/forge/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,22 +0,0 @@ -license = "MIT" -modLoader = "javafml" -loaderVersion = "[46,)" -[[mods]] -modId = "${modId}" -version = "${version}" -displayName = "${displayName}" -authors = "${authors}" -logoFile = "icon.png" -description = "${description}" -[[dependencies.${ modId }]] -modId = "forge" -mandatory = true -versionRange = "[47,)" -ordering = "NONE" -side = "BOTH" -[[dependencies.${ modId }]] -modId = "minecraft" -mandatory = true -versionRange = "[1.20.1]" -ordering = "NONE" -side = "BOTH" diff --git a/instances/forge/src/main/resources/icon.png b/instances/forge/src/main/resources/icon.png deleted file mode 100644 index 00201e8ab8644cdad7eccc7a95d063f38db59eb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5036 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"processResources") { + filteringCharset = "UTF-8" + duplicatesStrategy = DuplicatesStrategy.WARN + val sourceSets = project.extensions.getByName("sourceSets") as SourceSetContainer + val resDirs = sourceSets + .map(SourceSet::getResources) + .map(SourceDirectorySet::getSrcDirs) + from(resDirs) { + include("META-INF/neoforge.mods.toml") + expand( + mapOf( + "minecraft_version" to libs.versions.minecraft.mojang.version.get(), + "minecraft_version_range" to listOf(libs.versions.minecraft.mojang.version.get()) + .joinToString(","), + "neo_version" to "neo_version", + "neo_version_range" to "[${libs.versions.minecraft.neoforgeversion.get()},)", + "mod_id" to requireProjectInfo.name.lowercase(), + "mod_name" to requireProjectInfo.name, + "mod_license" to "mod_license", + "mod_version" to requireProjectInfo.versionString, + "mod_authors" to requireProjectInfo.developersList + .map(Developer::id) + .joinToString(","), + "mod_description" to requireProjectInfo.description + ) + ) } } -val destination = File("/home/makeevrsergh/Desktop/server/mods/") +val destination = rootDir + .resolve("build") + .resolve("neoforge") + .resolve("mods") .takeIf(File::exists) ?: File(rootDir, "jars") - -val reobfShadowJar = reobf.create("shadowJar") - -// astraShadowJar.configureManifest() - -// minecraftProcessResource.forge() - val shadowJar by tasks.getting(ShadowJar::class) { mergeServiceFiles() -// mustRunAfter(minecraftProcessResource.task) -// dependsOn(minecraftProcessResource.task) - finalizedBy(reobfShadowJar) + dependsOn(tasks.named("processResources")) configurations = listOf(project.configurations.shadow.get()) isReproducibleFileOrder = true + duplicatesStrategy = DuplicatesStrategy.EXCLUDE archiveClassifier = null as String? archiveVersion = requireProjectInfo.versionString - archiveBaseName = "${requireProjectInfo.name}-forge" + archiveBaseName = "${requireProjectInfo.name}-${project.name}" destinationDirectory = destination dependencies { // deps @@ -146,3 +150,13 @@ val shadowJar by tasks.getting(ShadowJar::class) { "club.minnced.opus" ).forEach { pattern -> relocate(pattern, "${requireProjectInfo.group}.shade.$pattern") } } + +dependencies { + compileOnly(libs.minecraft.neoforgeversion) +} + +java.toolchain.languageVersion = JavaLanguageVersion.of(requireJinfo.jtarget.majorVersion) + +configurations.runtimeElements { + setExtendsFrom(emptySet()) +} diff --git a/instances/neoforge/gradle.properties b/instances/neoforge/gradle.properties new file mode 100644 index 0000000..d431dff --- /dev/null +++ b/instances/neoforge/gradle.properties @@ -0,0 +1 @@ +makeevrserg.java.source=21 diff --git a/instances/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/NeoForgeEntryPoint.kt b/instances/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/NeoForgeEntryPoint.kt new file mode 100755 index 0000000..cb14fcd --- /dev/null +++ b/instances/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/NeoForgeEntryPoint.kt @@ -0,0 +1,30 @@ +package ru.astrainteractive.messagebridge + +import net.neoforged.fml.common.Mod +import ru.astrainteractive.astralibs.lifecycle.ForgeLifecycleServer +import ru.astrainteractive.astralibs.lifecycle.Lifecycle +import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger +import ru.astrainteractive.klibs.mikro.core.logging.Logger +import ru.astrainteractive.messagebridge.di.RootModuleImpl +import javax.annotation.ParametersAreNonnullByDefault + +@Mod("messagebridge") +@ParametersAreNonnullByDefault +class NeoForgeEntryPoint : + ForgeLifecycleServer(), + Logger by JUtiltLogger("NeoForgeEntryPoint").withoutParentHandlers(), + Lifecycle { + private val rootModule by lazy { RootModuleImpl() } + + override fun onEnable() { + rootModule.lifecycle.onEnable() + } + + override fun onDisable() { + rootModule.lifecycle.onDisable() + } + + override fun onReload() { + rootModule.lifecycle.onReload() + } +} diff --git a/instances/forge/src/main/kotlin/ru/astrainteractive/messagebridge/di/RootModuleImpl.kt b/instances/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/di/RootModuleImpl.kt similarity index 59% rename from instances/forge/src/main/kotlin/ru/astrainteractive/messagebridge/di/RootModuleImpl.kt rename to instances/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/di/RootModuleImpl.kt index d0cfa9e..ef29074 100755 --- a/instances/forge/src/main/kotlin/ru/astrainteractive/messagebridge/di/RootModuleImpl.kt +++ b/instances/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/di/RootModuleImpl.kt @@ -1,59 +1,54 @@ package ru.astrainteractive.messagebridge.di import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch -import net.minecraftforge.event.server.ServerStartedEvent -import net.minecraftforge.fml.loading.FMLPaths +import net.neoforged.fml.loading.FMLPaths +import ru.astrainteractive.astralibs.coroutines.NeoForgeDispatchers import ru.astrainteractive.astralibs.lifecycle.Lifecycle -import ru.astrainteractive.klibs.mikro.core.dispatchers.DefaultKotlinDispatchers import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger import ru.astrainteractive.klibs.mikro.core.logging.Logger import ru.astrainteractive.messagebridge.core.di.CoreModule -import ru.astrainteractive.messagebridge.forge.core.api.ForgeLuckPermsProvider -import ru.astrainteractive.messagebridge.forge.core.api.ForgeOnlinePlayersProvider -import ru.astrainteractive.messagebridge.forge.core.event.flowEvent +import ru.astrainteractive.messagebridge.forge.core.api.NeoForgeLuckPermsProvider +import ru.astrainteractive.messagebridge.forge.core.api.NeoForgeOnlinePlayersProvider import ru.astrainteractive.messagebridge.link.di.LinkModule import ru.astrainteractive.messagebridge.messaging.internal.BEventChannel import ru.astrainteractive.messagebridge.messaging.model.ServerClosedBEvent import ru.astrainteractive.messagebridge.messaging.model.ServerOpenBEvent import ru.astrainteractive.messagebridge.messenger.discord.di.JdaMessengerModule -import ru.astrainteractive.messagebridge.messenger.forge.di.ForgeMessengerModule +import ru.astrainteractive.messagebridge.messenger.forge.di.NeoForgeMessengerModule import ru.astrainteractive.messagebridge.messenger.telegram.di.TelegramMessengerModule +import java.io.File class RootModuleImpl : Logger by JUtiltLogger("MessageBridge-RootModuleImpl").withoutParentHandlers() { val coreModule by lazy { CoreModule( - dataFolder = FMLPaths.CONFIGDIR.get().resolve("MessageBridge").toAbsolutePath().toFile(), - dispatchers = DefaultKotlinDispatchers + dataFolder = FMLPaths.CONFIGDIR.get() + .resolve("SoulKeeper") + .toAbsolutePath() + .toFile() + .also(File::mkdirs), + dispatchers = NeoForgeDispatchers() ) } - private val serverStateFlow = flowEvent() - .map { event -> event.server } - .stateIn(coreModule.ioScope, SharingStarted.Eagerly, null) - - val forgeOnlinePlayersProvider by lazy { - ForgeOnlinePlayersProvider(serverStateFlow = serverStateFlow) + val onlinePlayersProvider by lazy { + NeoForgeOnlinePlayersProvider() } val linkModule by lazy { - LinkModule.Default(coreModule, ForgeLuckPermsProvider) + LinkModule.Default(coreModule, NeoForgeLuckPermsProvider) } - val forgeMessengerModule by lazy { - ForgeMessengerModule( + val neoForgeMessengerModule by lazy { + NeoForgeMessengerModule( coreModule = coreModule, - serverStateFlow = serverStateFlow ) } val jdaEventModule by lazy { JdaMessengerModule( coreModule = coreModule, - onlinePlayersProvider = forgeOnlinePlayersProvider, + onlinePlayersProvider = onlinePlayersProvider, linkModule = linkModule ) } @@ -61,7 +56,7 @@ class RootModuleImpl : Logger by JUtiltLogger("MessageBridge-RootModuleImpl").wi val tgEventModule by lazy { TelegramMessengerModule( coreModule = coreModule, - onlinePlayersProvider = forgeOnlinePlayersProvider, + onlinePlayersProvider = onlinePlayersProvider, linkModule = linkModule ) } @@ -72,7 +67,7 @@ class RootModuleImpl : Logger by JUtiltLogger("MessageBridge-RootModuleImpl").wi // event jdaEventModule.lifecycle, tgEventModule.lifecycle, - forgeMessengerModule.lifecycle + neoForgeMessengerModule.lifecycle ) val lifecycle = Lifecycle.Lambda( diff --git a/instances/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/instances/neoforge/src/main/resources/META-INF/neoforge.mods.toml new file mode 100644 index 0000000..ce0cd2b --- /dev/null +++ b/instances/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,24 @@ +modLoader = "javafml" +loaderVersion = "[1,)" +license = "${mod_license}" + +[[mods]] +modId = "${mod_id}" +version = "${mod_version}" +displayName = "${mod_name}" +authors = "[${mod_authors}]" +description = '''${mod_description}''' + +[[dependencies.${ mod_id }]] +modId = "neoforge" +type = "required" +versionRange = "${neo_version_range}" +ordering = "NONE" +side = "BOTH" + +[[dependencies.${ mod_id }]] +modId = "minecraft" +type = "required" +versionRange = "[${minecraft_version_range}]" +ordering = "NONE" +side = "BOTH" diff --git a/modules/core/api/src/main/kotlin/ru/astrainteractive/messagebridge/core/di/CoreModule.kt b/modules/core/api/src/main/kotlin/ru/astrainteractive/messagebridge/core/di/CoreModule.kt index 17521eb..0bc8bc3 100644 --- a/modules/core/api/src/main/kotlin/ru/astrainteractive/messagebridge/core/di/CoreModule.kt +++ b/modules/core/api/src/main/kotlin/ru/astrainteractive/messagebridge/core/di/CoreModule.kt @@ -3,7 +3,7 @@ package ru.astrainteractive.messagebridge.core.di import com.charleskorn.kaml.Yaml import com.charleskorn.kaml.YamlConfiguration import kotlinx.coroutines.cancel -import ru.astrainteractive.astralibs.async.withTimings +import ru.astrainteractive.astralibs.coroutines.withTimings import ru.astrainteractive.astralibs.lifecycle.Lifecycle import ru.astrainteractive.klibs.mikro.core.coroutines.CoroutineFeature import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers diff --git a/modules/core/forge/build.gradle.kts b/modules/core/forge/build.gradle.kts deleted file mode 100644 index 802dfe3..0000000 --- a/modules/core/forge/build.gradle.kts +++ /dev/null @@ -1,34 +0,0 @@ -plugins { - kotlin("jvm") - kotlin("plugin.serialization") - alias(libs.plugins.forgegradle) -} - -dependencies { - // Kotlin - implementation(libs.kotlin.coroutines.core) - - compileOnly(libs.minecraft.luckperms) - // AstraLibs - implementation(libs.minecraft.astralibs.core) - implementation(libs.minecraft.astralibs.command) - implementation(libs.klibs.mikro.core) - implementation(libs.klibs.kstorage) - // Local - implementation(projects.modules.core.api) -} - -dependencies { - minecraft( - "net.minecraftforge", - "forge", - "${libs.versions.minecraft.mojang.version.get()}-${libs.versions.minecraft.forgeversion.get()}" - ) -} -minecraft { - mappings("official", libs.versions.minecraft.mojang.version.get()) -} - -configurations.runtimeElements { - setExtendsFrom(emptySet()) -} diff --git a/modules/core/forge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/command/util/ForgeCommandExt.kt b/modules/core/forge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/command/util/ForgeCommandExt.kt deleted file mode 100644 index 0158f60..0000000 --- a/modules/core/forge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/command/util/ForgeCommandExt.kt +++ /dev/null @@ -1,63 +0,0 @@ -package ru.astrainteractive.messagebridge.forge.core.command.util - -import com.mojang.brigadier.Command -import com.mojang.brigadier.arguments.ArgumentType -import com.mojang.brigadier.builder.ArgumentBuilder -import com.mojang.brigadier.builder.LiteralArgumentBuilder -import com.mojang.brigadier.builder.RequiredArgumentBuilder -import com.mojang.brigadier.context.CommandContext -import net.minecraft.commands.CommandSourceStack -import net.minecraft.commands.Commands -import net.minecraftforge.event.RegisterCommandsEvent - -fun ArgumentBuilder.argument( - alias: String, - type: ArgumentType, - builder: (RequiredArgumentBuilder.() -> Unit)? = null, - execute: (RequiredArgumentBuilder.(CommandContext) -> Unit)? = null -) { - val argument: RequiredArgumentBuilder = Commands.argument(alias, type) - builder?.invoke(argument) - execute?.let { - argument.executes { commandContext -> - execute.invoke(argument, commandContext) - Command.SINGLE_SUCCESS - } - } - then(argument) -} - -/** - * Example: - * fun RegisterCommandsEvent.giveItemCommand() { - * command("giveitem2") { - * argument( - * alias = "player", - * type = StringArgumentType.string(), - * builder = { - * argument( - * alias = "truefalse", - * type = PrimitiveArgumentType.Boolean.toBrigadier(), - * builder = { - * argument( - * alias = "amount", - * type = IntegerArgumentType.integer(1, 4), - * execute = { - * println("Player -> Item -> amount") - * } - * ) - * }, - * execute = { - * println("Player -> Item") - * } - * ) - * }, - * ) - * } - * } - */ -fun RegisterCommandsEvent.command(alias: String, block: LiteralArgumentBuilder.() -> Unit) { - val literal = Commands.literal(alias) - literal.block() - dispatcher.register(literal) -} diff --git a/modules/core/forge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/event/ForgeEvent.kt b/modules/core/forge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/event/ForgeEvent.kt deleted file mode 100644 index 7b941a5..0000000 --- a/modules/core/forge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/event/ForgeEvent.kt +++ /dev/null @@ -1,36 +0,0 @@ -package ru.astrainteractive.messagebridge.forge.core.event - -import kotlinx.coroutines.channels.awaitClose -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.callbackFlow -import kotlinx.coroutines.launch -import net.minecraftforge.common.MinecraftForge -import net.minecraftforge.eventbus.api.Event -import net.minecraftforge.eventbus.api.EventPriority -import java.util.function.Consumer - -fun flowEvent( - type: Class, - priority: EventPriority = EventPriority.NORMAL -): Flow = callbackFlow { - val isCancelled = false - val consumer = Consumer { event -> - launch { send(event) } - } - MinecraftForge.EVENT_BUS.addListener( - priority, - isCancelled, - type, - consumer - ) - awaitClose { - MinecraftForge.EVENT_BUS.unregister(consumer) - } -} - -inline fun flowEvent( - priority: EventPriority = EventPriority.NORMAL -): Flow = flowEvent( - type = T::class.java, - priority = priority -) diff --git a/modules/core/neoforge/build.gradle.kts b/modules/core/neoforge/build.gradle.kts new file mode 100644 index 0000000..6fbe1f1 --- /dev/null +++ b/modules/core/neoforge/build.gradle.kts @@ -0,0 +1,40 @@ +plugins { + kotlin("jvm") + kotlin("plugin.serialization") +} + +dependencies { + // Kotlin + implementation(libs.kotlin.coroutines.core) + + compileOnly(libs.minecraft.luckperms) + // AstraLibs + implementation(libs.minecraft.astralibs.core) + implementation(libs.minecraft.astralibs.core.neoforge) + implementation(libs.minecraft.astralibs.command) + implementation(libs.klibs.mikro.core) + implementation(libs.klibs.kstorage) + // Local + implementation(projects.modules.core.api) +} + +dependencies { + compileOnly( + files( + rootProject.project(projects.instances.neoforge.path) + .file(".gradle") + .resolve("repositories") + .resolve("ng_dummy_ng") + .resolve("net") + .resolve("neoforged") + .resolve("neoforge") + .resolve(libs.versions.minecraft.neoforgeversion.get()) + .resolve("neoforge-${libs.versions.minecraft.neoforgeversion.get()}.jar") + ) + ) + compileOnly(libs.minecraft.neoforgeversion) + compileOnly("org.joml:joml:1.10.8") + compileOnly("com.mojang:datafixerupper:8.0.16") + compileOnly("com.mojang:brigadier:1.3.10") + compileOnly("net.neoforged:bus:8.0.2") +} diff --git a/modules/core/forge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/api/ForgeLuckPermsProvider.kt b/modules/core/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/api/NeoForgeLuckPermsProvider.kt similarity index 85% rename from modules/core/forge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/api/ForgeLuckPermsProvider.kt rename to modules/core/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/api/NeoForgeLuckPermsProvider.kt index effaee5..0dd2508 100755 --- a/modules/core/forge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/api/ForgeLuckPermsProvider.kt +++ b/modules/core/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/api/NeoForgeLuckPermsProvider.kt @@ -3,7 +3,7 @@ package ru.astrainteractive.messagebridge.forge.core.api import net.luckperms.api.LuckPerms import ru.astrainteractive.messagebridge.core.api.LuckPermsProvider -object ForgeLuckPermsProvider : LuckPermsProvider { +object NeoForgeLuckPermsProvider : LuckPermsProvider { override fun provide(): LuckPerms? { return runCatching { net.luckperms.api.LuckPermsProvider.get() diff --git a/modules/core/forge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/api/ForgeOnlinePlayersProvider.kt b/modules/core/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/api/NeoForgeOnlinePlayersProvider.kt similarity index 63% rename from modules/core/forge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/api/ForgeOnlinePlayersProvider.kt rename to modules/core/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/api/NeoForgeOnlinePlayersProvider.kt index e5c0278..79b2b51 100755 --- a/modules/core/forge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/api/ForgeOnlinePlayersProvider.kt +++ b/modules/core/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/forge/core/api/NeoForgeOnlinePlayersProvider.kt @@ -1,14 +1,13 @@ package ru.astrainteractive.messagebridge.forge.core.api -import kotlinx.coroutines.flow.StateFlow import net.minecraft.network.chat.Component -import net.minecraft.server.MinecraftServer import net.minecraft.server.level.ServerPlayer +import ru.astrainteractive.astralibs.server.util.NeoForgeUtil import ru.astrainteractive.messagebridge.core.api.OnlinePlayersProvider -class ForgeOnlinePlayersProvider(private val serverStateFlow: StateFlow) : OnlinePlayersProvider { +class NeoForgeOnlinePlayersProvider : OnlinePlayersProvider { override fun provide(): List { - return serverStateFlow.value + return NeoForgeUtil.serverOrNull ?.playerList ?.players .orEmpty() diff --git a/modules/messenger/bukkit/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/bukkit/messaging/MinecraftBEventConsumer.kt b/modules/messenger/bukkit/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/bukkit/messaging/MinecraftBEventConsumer.kt index fe9dc77..749d7a8 100644 --- a/modules/messenger/bukkit/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/bukkit/messaging/MinecraftBEventConsumer.kt +++ b/modules/messenger/bukkit/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/bukkit/messaging/MinecraftBEventConsumer.kt @@ -4,7 +4,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.withContext import org.bukkit.Bukkit -import ru.astrainteractive.astralibs.async.withTimings +import ru.astrainteractive.astralibs.coroutines.withTimings import ru.astrainteractive.astralibs.kyori.KyoriComponentSerializer import ru.astrainteractive.klibs.kstorage.api.CachedKrate import ru.astrainteractive.klibs.kstorage.util.getValue diff --git a/modules/messenger/discord/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/discord/event/MessageEventListener.kt b/modules/messenger/discord/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/discord/event/MessageEventListener.kt index 99a5da8..bc68c95 100644 --- a/modules/messenger/discord/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/discord/event/MessageEventListener.kt +++ b/modules/messenger/discord/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/discord/event/MessageEventListener.kt @@ -9,7 +9,7 @@ import net.dv8tion.jda.api.entities.channel.ChannelType import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent import net.dv8tion.jda.api.events.message.MessageReceivedEvent import net.dv8tion.jda.api.hooks.ListenerAdapter -import ru.astrainteractive.astralibs.async.withTimings +import ru.astrainteractive.astralibs.coroutines.withTimings import ru.astrainteractive.klibs.kstorage.api.CachedKrate import ru.astrainteractive.klibs.mikro.core.coroutines.CoroutineFeature import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger diff --git a/modules/messenger/discord/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/discord/messaging/DiscordBEventConsumer.kt b/modules/messenger/discord/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/discord/messaging/DiscordBEventConsumer.kt index bd9b455..88b3756 100755 --- a/modules/messenger/discord/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/discord/messaging/DiscordBEventConsumer.kt +++ b/modules/messenger/discord/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/discord/messaging/DiscordBEventConsumer.kt @@ -13,7 +13,7 @@ import kotlinx.coroutines.flow.shareIn import net.dv8tion.jda.api.EmbedBuilder import net.dv8tion.jda.api.JDA import net.dv8tion.jda.api.entities.channel.concrete.TextChannel -import ru.astrainteractive.astralibs.async.withTimings +import ru.astrainteractive.astralibs.coroutines.withTimings import ru.astrainteractive.klibs.kstorage.api.CachedKrate import ru.astrainteractive.klibs.kstorage.util.getValue import ru.astrainteractive.klibs.mikro.core.coroutines.CoroutineFeature diff --git a/modules/messenger/forge/build.gradle.kts b/modules/messenger/forge/build.gradle.kts deleted file mode 100644 index eadb1e5..0000000 --- a/modules/messenger/forge/build.gradle.kts +++ /dev/null @@ -1,38 +0,0 @@ -plugins { - kotlin("jvm") - kotlin("plugin.serialization") - alias(libs.plugins.forgegradle) -} - -dependencies { - // Kotlin - implementation(libs.kotlin.coroutines.core) - - // AstraLibs - implementation(libs.minecraft.astralibs.core) - implementation(libs.klibs.mikro.core) - implementation(libs.klibs.kstorage) - implementation(libs.kotlin.datetime) - implementation(libs.kyori.plain) - implementation(libs.kyori.legacy) - implementation(libs.kyori.gson) - // Local - implementation(projects.modules.messenger.api) - implementation(projects.modules.core.api) - implementation(projects.modules.core.forge) - implementation(projects.modules.link) -} -dependencies { - minecraft( - "net.minecraftforge", - "forge", - "${libs.versions.minecraft.mojang.version.get()}-${libs.versions.minecraft.forgeversion.get()}" - ) -} -minecraft { - mappings("official", libs.versions.minecraft.mojang.version.get()) -} - -configurations.runtimeElements { - setExtendsFrom(emptySet()) -} diff --git a/modules/messenger/forge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/util/NativeComponentExt.kt b/modules/messenger/forge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/util/NativeComponentExt.kt deleted file mode 100644 index b3b185a..0000000 --- a/modules/messenger/forge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/util/NativeComponentExt.kt +++ /dev/null @@ -1,11 +0,0 @@ -package ru.astrainteractive.messagebridge.messenger.forge.util - -import net.kyori.adventure.text.Component -import net.minecraft.network.chat.Component.Serializer -import ru.astrainteractive.astralibs.kyori.KyoriComponentSerializer - -fun Component.toNative(): net.minecraft.network.chat.Component { - val json = KyoriComponentSerializer.Json - val jsonComponent = json.serializer.serialize(this) - return Serializer.fromJson(jsonComponent) ?: net.minecraft.network.chat.Component.empty() -} diff --git a/modules/messenger/neoforge/build.gradle.kts b/modules/messenger/neoforge/build.gradle.kts new file mode 100644 index 0000000..a95dadf --- /dev/null +++ b/modules/messenger/neoforge/build.gradle.kts @@ -0,0 +1,45 @@ +plugins { + kotlin("jvm") + kotlin("plugin.serialization") +} + +dependencies { + // Kotlin + implementation(libs.kotlin.coroutines.core) + + // AstraLibs + implementation(libs.minecraft.astralibs.core) + implementation(libs.minecraft.astralibs.core.neoforge) + implementation(libs.klibs.mikro.core) + implementation(libs.klibs.kstorage) + implementation(libs.kotlin.datetime) + implementation(libs.kyori.plain) + implementation(libs.kyori.legacy) + implementation(libs.kyori.gson) + // Local + implementation(projects.modules.messenger.api) + implementation(projects.modules.core.api) + implementation(projects.modules.core.neoforge) + implementation(projects.modules.link) +} + +dependencies { + compileOnly( + files( + rootProject.project(projects.instances.neoforge.path) + .file(".gradle") + .resolve("repositories") + .resolve("ng_dummy_ng") + .resolve("net") + .resolve("neoforged") + .resolve("neoforge") + .resolve(libs.versions.minecraft.neoforgeversion.get()) + .resolve("neoforge-${libs.versions.minecraft.neoforgeversion.get()}.jar") + ) + ) + compileOnly(libs.minecraft.neoforgeversion) + compileOnly("org.joml:joml:1.10.8") + compileOnly("com.mojang:datafixerupper:8.0.16") + compileOnly("com.mojang:brigadier:1.3.10") + compileOnly("net.neoforged:bus:8.0.2") +} diff --git a/modules/messenger/forge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/di/ForgeMessengerModule.kt b/modules/messenger/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/di/NeoForgeMessengerModule.kt similarity index 60% rename from modules/messenger/forge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/di/ForgeMessengerModule.kt rename to modules/messenger/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/di/NeoForgeMessengerModule.kt index 2958367..1d93f0e 100644 --- a/modules/messenger/forge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/di/ForgeMessengerModule.kt +++ b/modules/messenger/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/di/NeoForgeMessengerModule.kt @@ -1,26 +1,22 @@ package ru.astrainteractive.messagebridge.messenger.forge.di import kotlinx.coroutines.cancel -import kotlinx.coroutines.flow.StateFlow -import net.minecraft.server.MinecraftServer import ru.astrainteractive.astralibs.lifecycle.Lifecycle import ru.astrainteractive.messagebridge.core.di.CoreModule -import ru.astrainteractive.messagebridge.messenger.forge.event.ForgeEvents -import ru.astrainteractive.messagebridge.messenger.forge.messaging.ForgeBEventConsumer +import ru.astrainteractive.messagebridge.messenger.forge.event.NeoForgeEvents +import ru.astrainteractive.messagebridge.messenger.forge.messaging.NeoForgeBEventConsumer -class ForgeMessengerModule( +class NeoForgeMessengerModule( coreModule: CoreModule, - serverStateFlow: StateFlow ) { - val eventBukkitMessengerModule = ForgeEvents( + val eventBukkitMessengerModule = NeoForgeEvents( configKrate = coreModule.configKrate, scope = coreModule.ioScope, dispatchers = coreModule.dispatchers ) - private val minecraftMessageController = ForgeBEventConsumer( + private val minecraftMessageController = NeoForgeBEventConsumer( translationKrate = coreModule.translationKrate, - serverStateFlow = serverStateFlow, ) val lifecycle = Lifecycle.Lambda( diff --git a/modules/messenger/forge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/event/ForgeEvents.kt b/modules/messenger/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/event/NeoForgeEvents.kt similarity index 87% rename from modules/messenger/forge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/event/ForgeEvents.kt rename to modules/messenger/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/event/NeoForgeEvents.kt index 51670ac..8ddf3a2 100755 --- a/modules/messenger/forge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/event/ForgeEvents.kt +++ b/modules/messenger/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/event/NeoForgeEvents.kt @@ -6,19 +6,18 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import net.minecraft.world.entity.player.Player -import net.minecraftforge.event.ServerChatEvent -import net.minecraftforge.event.entity.living.LivingDeathEvent -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent -import net.minecraftforge.event.server.ServerStartedEvent -import net.minecraftforge.event.server.ServerStoppingEvent +import net.neoforged.neoforge.event.ServerChatEvent +import net.neoforged.neoforge.event.entity.living.LivingDeathEvent +import net.neoforged.neoforge.event.entity.player.PlayerEvent +import net.neoforged.neoforge.event.server.ServerStartedEvent +import net.neoforged.neoforge.event.server.ServerStoppingEvent +import ru.astrainteractive.astralibs.event.flowEvent import ru.astrainteractive.klibs.kstorage.api.CachedKrate import ru.astrainteractive.klibs.kstorage.util.getValue import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger import ru.astrainteractive.klibs.mikro.core.logging.Logger import ru.astrainteractive.messagebridge.core.PluginConfiguration -import ru.astrainteractive.messagebridge.forge.core.event.flowEvent import ru.astrainteractive.messagebridge.messaging.internal.BEventChannel import ru.astrainteractive.messagebridge.messaging.model.PlayerDeathBEvent import ru.astrainteractive.messagebridge.messaging.model.PlayerJoinedBEvent @@ -27,7 +26,7 @@ import ru.astrainteractive.messagebridge.messaging.model.ServerClosedBEvent import ru.astrainteractive.messagebridge.messaging.model.ServerOpenBEvent import ru.astrainteractive.messagebridge.messaging.model.Text -class ForgeEvents( +class NeoForgeEvents( configKrate: CachedKrate, private val scope: CoroutineScope, private val dispatchers: KotlinDispatchers @@ -50,7 +49,7 @@ class ForgeEvents( } }.launchIn(scope) - val playerLoggedOutEvent = flowEvent() + val playerLoggedOutEvent = flowEvent() .onEach { info { "#playerLoggedOutEvent" } } .filter { config.displayLeaveMessage } .onEach { @@ -63,7 +62,7 @@ class ForgeEvents( } }.launchIn(scope) - val playerLoggedInEvent = flowEvent() + val playerLoggedInEvent = flowEvent() .onEach { info { "#playerLoggedInEvent" } } .filter { config.displayJoinMessage } .onEach { diff --git a/modules/messenger/forge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/messaging/ForgeBEventConsumer.kt b/modules/messenger/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/messaging/NeoForgeBEventConsumer.kt similarity index 86% rename from modules/messenger/forge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/messaging/ForgeBEventConsumer.kt rename to modules/messenger/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/messaging/NeoForgeBEventConsumer.kt index 9a97739..ce9cb52 100644 --- a/modules/messenger/forge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/messaging/ForgeBEventConsumer.kt +++ b/modules/messenger/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/forge/messaging/NeoForgeBEventConsumer.kt @@ -1,11 +1,11 @@ package ru.astrainteractive.messagebridge.messenger.forge.messaging -import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import net.minecraft.server.MinecraftServer -import ru.astrainteractive.astralibs.async.withTimings +import ru.astrainteractive.astralibs.coroutines.withTimings import ru.astrainteractive.astralibs.kyori.KyoriComponentSerializer +import ru.astrainteractive.astralibs.server.util.NeoForgeUtil +import ru.astrainteractive.astralibs.server.util.toNative import ru.astrainteractive.klibs.kstorage.api.CachedKrate import ru.astrainteractive.klibs.kstorage.util.getValue import ru.astrainteractive.klibs.mikro.core.coroutines.CoroutineFeature @@ -22,11 +22,9 @@ import ru.astrainteractive.messagebridge.messaging.model.PlayerLeaveBEvent import ru.astrainteractive.messagebridge.messaging.model.ServerClosedBEvent import ru.astrainteractive.messagebridge.messaging.model.ServerOpenBEvent import ru.astrainteractive.messagebridge.messaging.model.Text -import ru.astrainteractive.messagebridge.messenger.forge.util.toNative -internal class ForgeBEventConsumer( +internal class NeoForgeBEventConsumer( translationKrate: CachedKrate, - private val serverStateFlow: StateFlow ) : BEventConsumer, CoroutineFeature by CoroutineFeature.IO.withTimings(), Logger by JUtiltLogger("MessageBridge-ForgeBEventConsumer").withoutParentHandlers() { @@ -50,7 +48,7 @@ internal class ForgeBEventConsumer( is PlayerDeathBEvent -> null }?.let(KyoriComponentSerializer.Legacy::toComponent) ?: return - serverStateFlow.value?.playerList?.players.orEmpty().forEach { player -> + NeoForgeUtil.serverOrNull?.playerList?.players.orEmpty().forEach { player -> player.sendSystemMessage(component.toNative()) } } diff --git a/modules/messenger/telegram/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/telegram/messaging/TelegramBEventConsumer.kt b/modules/messenger/telegram/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/telegram/messaging/TelegramBEventConsumer.kt index 286923c..4f7cc9b 100644 --- a/modules/messenger/telegram/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/telegram/messaging/TelegramBEventConsumer.kt +++ b/modules/messenger/telegram/src/main/kotlin/ru/astrainteractive/messagebridge/messenger/telegram/messaging/TelegramBEventConsumer.kt @@ -8,7 +8,7 @@ import org.telegram.telegrambots.client.okhttp.OkHttpTelegramClient import org.telegram.telegrambots.meta.api.methods.send.SendMessage import org.telegram.telegrambots.meta.exceptions.TelegramApiException import org.telegram.telegrambots.meta.exceptions.TelegramApiRequestException -import ru.astrainteractive.astralibs.async.withTimings +import ru.astrainteractive.astralibs.coroutines.withTimings import ru.astrainteractive.klibs.kstorage.api.CachedKrate import ru.astrainteractive.klibs.kstorage.util.getValue import ru.astrainteractive.klibs.mikro.core.coroutines.CoroutineFeature diff --git a/settings.gradle.kts b/settings.gradle.kts index fdcd1d4..45a6980 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,6 @@ pluginManagement { repositories { + maven("https://maven.neoforged.net/releases") maven("https://maven.fabricmc.net/") { name = "Fabric" } maven("https://plugins.gradle.org/m2/") maven("https://jitpack.io") @@ -53,15 +54,14 @@ rootProject.name = "MessageBridge" // Spigot include(":instances:bukkit") -include(":instances:forge") -include(":instances:fabric") +include(":instances:neoforge") include(":modules:messenger:api") include(":modules:messenger:bukkit") -include(":modules:messenger:forge") +include(":modules:messenger:neoforge") include(":modules:messenger:telegram") include(":modules:messenger:discord") include(":modules:core:api") include(":modules:core:bukkit") -include(":modules:core:forge") +include(":modules:core:neoforge") include(":modules:link") include(":modules:command:bukkit") From 3cb9d127db7b2c6456ef793b1b262130d5062939 Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Sun, 7 Dec 2025 17:41:49 +0300 Subject: [PATCH 2/4] fix gradle.properties --- gradle.properties | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/gradle.properties b/gradle.properties index 06f3740..cd17cf4 100755 --- a/gradle.properties +++ b/gradle.properties @@ -1,10 +1,11 @@ - # Gradle -org.gradle.parallel=true +# Gradle +org.gradle.parallel=false org.gradle.configuration-cache=false org.gradle.caching=false -org.gradle.jvmargs=-Xmx3g -XX:+UseParallelGC -Dkotlin.daemon.jvm.options\="-Xmx3G" +kotlin.incremental=false +org.gradle.jvmargs=-Xmx5g -XX:+UseParallelGC -Dkotlin.daemon.jvm.options\="-Xmx5G" kotlin.code.style=official -testTask.ignoreFailures=true +testTask.ignoreFailures=false # Java makeevrserg.java.source=8 makeevrserg.java.target=21 From 1cac603d160acaa93308584a581f6710a666e9ed Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Mon, 8 Dec 2025 00:17:35 +0300 Subject: [PATCH 3/4] fix ci --- .github/workflows/call-build-project.yml | 6 ++---- .github/workflows/call-upload-artifacts.yml | 6 ++---- .github/workflows/call-upload-github-release.yml | 9 ++------- .github/workflows/call-upload-modrinth-release.yml | 4 ++-- 4 files changed, 8 insertions(+), 17 deletions(-) diff --git a/.github/workflows/call-build-project.yml b/.github/workflows/call-build-project.yml index 7b0d90f..976eda5 100644 --- a/.github/workflows/call-build-project.yml +++ b/.github/workflows/call-build-project.yml @@ -8,12 +8,10 @@ jobs: strategy: matrix: include: - - id: "forge" - task: ":instances:forge:build" + - id: "neoforge" + task: ":instances:neoforge:build" - id: "bukkit" task: ":instances:bukkit:build" - - id: "fabric" - task: ":instances:fabric:build" steps: - name: Checkout Git repo uses: actions/checkout@v4 diff --git a/.github/workflows/call-upload-artifacts.yml b/.github/workflows/call-upload-artifacts.yml index f584fbc..8fc0f99 100644 --- a/.github/workflows/call-upload-artifacts.yml +++ b/.github/workflows/call-upload-artifacts.yml @@ -8,12 +8,10 @@ jobs: strategy: matrix: include: - - id: "forge" - task: ":instances:forge:shadowJar" + - id: "neoforge" + task: ":instances:neoforge:shadowJar" - id: "bukkit" task: ":instances:bukkit:shadowJar" - - id: "fabric" - task: ":instances:fabric:remapJar" steps: - name: Checkout Git repo uses: actions/checkout@v4 diff --git a/.github/workflows/call-upload-github-release.yml b/.github/workflows/call-upload-github-release.yml index aab328c..8477958 100644 --- a/.github/workflows/call-upload-github-release.yml +++ b/.github/workflows/call-upload-github-release.yml @@ -19,20 +19,15 @@ jobs: properties: 'makeevrserg.project.name makeevrserg.project.version.string' - uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e - name: "Download forge" + name: "Download neoforge" with: - name: forge + name: neoforge path: ./jars - uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e name: "Download bukkit" with: name: bukkit path: ./jars - - uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e - name: "Download fabric" - with: - name: fabric - path: ./jars - name: Create release id: create_internal_release diff --git a/.github/workflows/call-upload-modrinth-release.yml b/.github/workflows/call-upload-modrinth-release.yml index 1bcd069..8c13662 100644 --- a/.github/workflows/call-upload-modrinth-release.yml +++ b/.github/workflows/call-upload-modrinth-release.yml @@ -11,8 +11,8 @@ jobs: strategy: matrix: include: - - id: "forge" - task: ":instances:forge:shadowJar" + - id: "neoforge" + task: ":instances:neoforge:shadowJar" - id: "bukkit" task: ":instances:bukkit:shadowJar" steps: From 0ee106e80ed6637eeaa7010783e11822ac82b5c6 Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Tue, 9 Dec 2025 02:35:56 +0300 Subject: [PATCH 4/4] fix shadow --- docker-compose.yml | 22 ++- gradle/libs.versions.toml | 2 +- instances/neoforge/build.gradle.kts | 133 ++++++++++-------- .../messagebridge/NeoForgeEntryPoint.kt | 2 +- .../messagebridge/di/RootModuleImpl.kt | 2 +- .../messagebridge/core/di/CoreModule.kt | 37 +++-- .../core/di/factory/ConfigKrateFactory.kt | 42 ------ .../link/database/di/LinkDatabaseModule.kt | 7 +- 8 files changed, 114 insertions(+), 133 deletions(-) delete mode 100644 modules/core/api/src/main/kotlin/ru/astrainteractive/messagebridge/core/di/factory/ConfigKrateFactory.kt diff --git a/docker-compose.yml b/docker-compose.yml index 6ede29e..fa01221 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,22 +12,16 @@ services: EULA: true ONLINE_MODE: false # Forge -------------------- - # TYPE: FORGE - # VERSION: "1.20.1" - # FORGE_VERSION: "47.2.20" + TYPE: NEOFORGE + VERSION: "1.21.1" + NEOFORGE_VERSION: "21.1.129" # Paper -------------------- - TYPE: PAPER - VERSION: 1.21.8 + # TYPE: PAPER + # VERSION: 1.21.8 # Custom ------------------- - # CUSTOM_SERVER: https://api.papermc.io/v2/projects/paper/versions/1.21.1/builds/121/downloads/paper-1.21.1-121.jar - # Fabric - # TYPE: FABRIC - # MEMORY: 6G - # VERSION: "1.20.1" - # FABRIC_LAUNCHER_VERSION: 1.0.3 - # FABRIC_LOADER_VERSION: 0.16.14 + # CUSTOM_SERVER: https://api.papermc.io/v2/projects/paper/versions/1.21.1/builds/121/downloads/paper-1.21.1-121.jar volumes: - # - ./build/forge:/data # Forge - - ./build/bukkit:/data # Bukkit/Paper/Spigot + - ./build/neoforge:/data # Forge +# - ./build/bukkit:/data # Bukkit/Paper/Spigot # - ./build/velocity:/data # Velocity # - ./build/fabric:/data # Fabric \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c71df2c..af2c32a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -18,7 +18,7 @@ jda-webhook = "0.8.4" klibs-gradleplugin = "1.13.2" klibs-kdi = "1.4.8" klibs-kstorage = "4.4.1" -klibs-mikro = "1.16.0" +klibs-mikro = "1.16.1" kotlin-benchmark = "0.4.14" kotlin-coroutines = "1.10.2" kotlin-datetime = "0.7.1-0.6.x-compat" diff --git a/instances/neoforge/build.gradle.kts b/instances/neoforge/build.gradle.kts index 4771495..3cfe8b6 100644 --- a/instances/neoforge/build.gradle.kts +++ b/instances/neoforge/build.gradle.kts @@ -12,30 +12,34 @@ plugins { dependencies { // Kotlin - implementation(libs.kotlin.coroutines.core) + shadow(libs.kotlin.coroutines.core) + shadow(libs.kotlin.datetime) + shadow(libs.kotlin.serialization.kaml) // AstraLibs - implementation(libs.minecraft.astralibs.core) - implementation(libs.minecraft.astralibs.command) - implementation(libs.minecraft.astralibs.core.neoforge) - implementation(libs.kotlin.serialization.kaml) - implementation(libs.klibs.mikro.core) - implementation(libs.klibs.mikro.extensions) - implementation(libs.klibs.kstorage) - implementation(libs.kotlin.datetime) - implementation(libs.driver.h2) + shadow(libs.minecraft.astralibs.core) + shadow(libs.minecraft.astralibs.command) + shadow(libs.minecraft.astralibs.core.neoforge) + + shadow(libs.klibs.mikro.core) + shadow(libs.klibs.mikro.extensions) + shadow(libs.klibs.kstorage) + + shadow(libs.driver.h2) + shadow(libs.exposed.jdbc) + + shadow(libs.kyori.plain) + shadow(libs.kyori.legacy) + shadow(libs.kyori.gson) // Spigot compileOnly(libs.minecraft.luckperms) // Local - implementation(projects.modules.messenger.api) - implementation(projects.modules.messenger.discord) - implementation(projects.modules.messenger.neoforge) - implementation(projects.modules.messenger.telegram) - implementation(projects.modules.core.api) - implementation(projects.modules.core.neoforge) - implementation(projects.modules.link) - implementation(libs.kyori.plain) - implementation(libs.kyori.legacy) - implementation(libs.kyori.gson) + shadow(projects.modules.messenger.api) + shadow(projects.modules.messenger.discord) + shadow(projects.modules.messenger.neoforge) + shadow(projects.modules.messenger.telegram) + shadow(projects.modules.core.api) + shadow(projects.modules.core.neoforge) + shadow(projects.modules.link) } tasks.named("processResources") { @@ -67,12 +71,6 @@ tasks.named("processResources") { } } -val destination = rootDir - .resolve("build") - .resolve("neoforge") - .resolve("mods") - .takeIf(File::exists) - ?: File(rootDir, "jars") val shadowJar by tasks.getting(ShadowJar::class) { mergeServiceFiles() dependsOn(tasks.named("processResources")) @@ -82,14 +80,27 @@ val shadowJar by tasks.getting(ShadowJar::class) { archiveClassifier = null as String? archiveVersion = requireProjectInfo.versionString archiveBaseName = "${requireProjectInfo.name}-${project.name}" - destinationDirectory = destination + destinationDirectory = rootDir + .resolve("build") + .resolve("neoforge") + .resolve("mods") + .takeIf(File::exists) + ?: File(rootDir, "jars") dependencies { - // deps + // Dependencies exclude(dependency("org.jetbrains:annotations")) - // deps paths - exclude("co/touchlab/stately/**") + // Root + exclude("_COROUTINE/**") + exclude("DebugProbesKt.bin") + exclude("jetty-dir.css") + exclude("license/**") + exclude("**LICENCE**") + exclude("**LICENSE**") + // Other dependencies exclude("club/minnced/opus/**") + exclude("co/touchlab/stately/**") exclude("com/google/**") + exclude("com/ibm/icu/**") exclude("com/sun/**") exclude("google/protobuf/**") exclude("io/github/**") @@ -98,65 +109,77 @@ val shadowJar by tasks.getting(ShadowJar::class) { exclude("javax/annotation/**") exclude("javax/servlet/**") exclude("natives/**") + exclude("net/luckperms/**") exclude("nl/altindag/**") - exclude("org/eclipse/**") exclude("org/bouncycastle/**") exclude("org/checkerframework/**") exclude("org/conscrypt/**") + exclude("org/eclipse/**") exclude("tomp2p/opuswrapper/**") - exclude("DebugProbesKt.bin") - exclude("_COROUTINE/**") - // meta -// exclude("META-INF/services/**") - exclude("META-INF/*.kotlin_module") + // META + exclude("META-INF/**.md") + exclude("META-INF/**.MD") + exclude("META-INF/**.txt**") + exclude("META-INF/**LICENCE**") exclude("META-INF/com.android.tools/**") exclude("META-INF/gradle-plugins/**") + exclude("META-INF/imports/**") + exclude("META-INF/license/**") exclude("META-INF/maven/**") + exclude("META-INF/native-image/**") + exclude("META-INF/native/**") exclude("META-INF/proguard/**") + exclude("META-INF/rewrite/**") exclude("META-INF/versions/**") - exclude("META-INF/native/**") - exclude("META-INF/**LICENCE**") } + // Be sure to relocate EXACT PACKAGES!! // For example, relocate org.some.package instead of org // Becuase relocation org will break other non-relocated dependencies such as org.minecraft listOf( + "ch.qos.logback", + "club.minnced.discord", + "club.minnced.opus", + "com.arkivanov", + "com.charleskorn.kaml", "com.fasterxml", - "net.kyori", - "org.h2", "com.neovisionaries", + "dev.icerock", "gnu.trove", - "org.json", - "org.apache", - "org.telegram", - "okhttp3", - "net.dv8tion", - "okio", - "org.slf4j", + "it.krzeminski", + "javax.xml", "kotlin", "kotlinx", - "it.krzeminski", + "net.dv8tion", + "net.kyori", "net.thauvin", + "okhttp3", + "okio", + "org.apache", + "org.h2", "org.jetbrains.exposed.dao", "org.jetbrains.exposed.exceptions", - "org.jetbrains.exposed.sql", "org.jetbrains.exposed.jdbc", + "org.jetbrains.exposed.sql", "org.jetbrains.kotlin", "org.jetbrains.kotlinx", - "com.charleskorn.kaml", - "ru.astrainteractive.klibs", + "org.json", + "org.slf4j", + "org.telegram", + "org.w3c.css", + "org.w3c.dom", + "org.xml.sax", "ru.astrainteractive.astralibs", - "club.minnced.discord", - "club.minnced.opus" + "ru.astrainteractive.klibs", ).forEach { pattern -> relocate(pattern, "${requireProjectInfo.group}.shade.$pattern") } } +java.toolchain.languageVersion = JavaLanguageVersion.of(requireJinfo.jtarget.majorVersion) + dependencies { compileOnly(libs.minecraft.neoforgeversion) } -java.toolchain.languageVersion = JavaLanguageVersion.of(requireJinfo.jtarget.majorVersion) - configurations.runtimeElements { setExtendsFrom(emptySet()) } diff --git a/instances/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/NeoForgeEntryPoint.kt b/instances/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/NeoForgeEntryPoint.kt index cb14fcd..f910e33 100755 --- a/instances/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/NeoForgeEntryPoint.kt +++ b/instances/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/NeoForgeEntryPoint.kt @@ -12,7 +12,7 @@ import javax.annotation.ParametersAreNonnullByDefault @ParametersAreNonnullByDefault class NeoForgeEntryPoint : ForgeLifecycleServer(), - Logger by JUtiltLogger("NeoForgeEntryPoint").withoutParentHandlers(), + Logger by JUtiltLogger("NeoForgeEntryPoint"), Lifecycle { private val rootModule by lazy { RootModuleImpl() } diff --git a/instances/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/di/RootModuleImpl.kt b/instances/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/di/RootModuleImpl.kt index ef29074..f94a4c0 100755 --- a/instances/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/di/RootModuleImpl.kt +++ b/instances/neoforge/src/main/kotlin/ru/astrainteractive/messagebridge/di/RootModuleImpl.kt @@ -23,7 +23,7 @@ class RootModuleImpl : Logger by JUtiltLogger("MessageBridge-RootModuleImpl").wi val coreModule by lazy { CoreModule( dataFolder = FMLPaths.CONFIGDIR.get() - .resolve("SoulKeeper") + .resolve("MessageBridge") .toAbsolutePath() .toFile() .also(File::mkdirs), diff --git a/modules/core/api/src/main/kotlin/ru/astrainteractive/messagebridge/core/di/CoreModule.kt b/modules/core/api/src/main/kotlin/ru/astrainteractive/messagebridge/core/di/CoreModule.kt index 0bc8bc3..d01ab9a 100644 --- a/modules/core/api/src/main/kotlin/ru/astrainteractive/messagebridge/core/di/CoreModule.kt +++ b/modules/core/api/src/main/kotlin/ru/astrainteractive/messagebridge/core/di/CoreModule.kt @@ -5,11 +5,14 @@ import com.charleskorn.kaml.YamlConfiguration import kotlinx.coroutines.cancel import ru.astrainteractive.astralibs.coroutines.withTimings import ru.astrainteractive.astralibs.lifecycle.Lifecycle +import ru.astrainteractive.astralibs.util.parseOrWriteIntoDefault +import ru.astrainteractive.klibs.kstorage.api.impl.DefaultMutableKrate +import ru.astrainteractive.klibs.kstorage.util.asStateFlowKrate import ru.astrainteractive.klibs.mikro.core.coroutines.CoroutineFeature import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers +import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger import ru.astrainteractive.messagebridge.core.PluginConfiguration import ru.astrainteractive.messagebridge.core.PluginTranslation -import ru.astrainteractive.messagebridge.core.di.factory.ConfigKrateFactory import java.io.File class CoreModule( @@ -31,19 +34,27 @@ class CoreModule( .Default(dispatchers.Main) .withTimings() - val configKrate = ConfigKrateFactory.create( - fileNameWithoutExtension = "config", - stringFormat = yamlStringFormat, - dataFolder = dataFolder, - factory = ::PluginConfiguration - ) + val configKrate = DefaultMutableKrate( + factory = ::PluginConfiguration, + loader = { + yamlStringFormat.parseOrWriteIntoDefault( + file = dataFolder.resolve("config.yml"), + logger = JUtiltLogger("MessageBridge-config"), + default = ::PluginConfiguration + ) + } + ).asStateFlowKrate() - val translationKrate = ConfigKrateFactory.create( - fileNameWithoutExtension = "translations", - stringFormat = yamlStringFormat, - dataFolder = dataFolder, - factory = ::PluginTranslation - ) + val translationKrate = DefaultMutableKrate( + factory = ::PluginTranslation, + loader = { + yamlStringFormat.parseOrWriteIntoDefault( + file = dataFolder.resolve("translations.yml"), + logger = JUtiltLogger("MessageBridge-translations"), + default = ::PluginTranslation + ) + } + ).asStateFlowKrate() val lifecycle = Lifecycle.Lambda( onReload = { diff --git a/modules/core/api/src/main/kotlin/ru/astrainteractive/messagebridge/core/di/factory/ConfigKrateFactory.kt b/modules/core/api/src/main/kotlin/ru/astrainteractive/messagebridge/core/di/factory/ConfigKrateFactory.kt deleted file mode 100644 index edffb0b..0000000 --- a/modules/core/api/src/main/kotlin/ru/astrainteractive/messagebridge/core/di/factory/ConfigKrateFactory.kt +++ /dev/null @@ -1,42 +0,0 @@ -package ru.astrainteractive.messagebridge.core.di.factory - -import kotlinx.serialization.StringFormat -import ru.astrainteractive.astralibs.util.parse -import ru.astrainteractive.astralibs.util.writeIntoFile -import ru.astrainteractive.klibs.kstorage.api.StateFlowMutableKrate -import ru.astrainteractive.klibs.kstorage.api.impl.DefaultMutableKrate -import ru.astrainteractive.klibs.kstorage.api.value.ValueFactory -import ru.astrainteractive.klibs.kstorage.util.asStateFlowMutableKrate -import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger -import ru.astrainteractive.klibs.mikro.core.logging.Logger -import java.io.File - -object ConfigKrateFactory : Logger by JUtiltLogger("MessageBridge-ConfigKrateFactory").withoutParentHandlers() { - inline fun create( - fileNameWithoutExtension: String, - stringFormat: StringFormat, - dataFolder: File, - factory: ValueFactory - ): StateFlowMutableKrate { - return DefaultMutableKrate( - factory = factory, - loader = { - info { "#create trying to load file $fileNameWithoutExtension" } - if (!dataFolder.exists()) dataFolder.mkdirs() - val file = dataFolder.resolve("$fileNameWithoutExtension.yml") - stringFormat.parse(file) - .onFailure { - val defaultFile = when { - !file.exists() || file.length() == 0L -> file - else -> dataFolder.resolve("$fileNameWithoutExtension.default.yml") - } - if (!defaultFile.exists()) defaultFile.createNewFile() - stringFormat.writeIntoFile(factory.create(), defaultFile) - error { "Could not read $fileNameWithoutExtension.yml! Loaded default. Error -> ${it.message}" } - } - .onSuccess { stringFormat.writeIntoFile(it, file) } - .getOrElse { factory.create() } - } - ).asStateFlowMutableKrate() - } -} diff --git a/modules/link/src/main/kotlin/ru/astrainteractive/messagebridge/link/database/di/LinkDatabaseModule.kt b/modules/link/src/main/kotlin/ru/astrainteractive/messagebridge/link/database/di/LinkDatabaseModule.kt index 61662af..785c019 100755 --- a/modules/link/src/main/kotlin/ru/astrainteractive/messagebridge/link/database/di/LinkDatabaseModule.kt +++ b/modules/link/src/main/kotlin/ru/astrainteractive/messagebridge/link/database/di/LinkDatabaseModule.kt @@ -8,8 +8,6 @@ import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.launch import org.jetbrains.exposed.sql.Database import org.jetbrains.exposed.sql.SchemaUtils -import org.jetbrains.exposed.sql.Slf4jSqlDebugLogger -import org.jetbrains.exposed.sql.addLogger import org.jetbrains.exposed.sql.transactions.TransactionManager import org.jetbrains.exposed.sql.transactions.transaction import ru.astrainteractive.astralibs.lifecycle.Lifecycle @@ -36,10 +34,7 @@ interface LinkDatabaseModule { val database = dbConfig.connect() TransactionManager.manager.defaultIsolationLevel = java.sql.Connection.TRANSACTION_SERIALIZABLE transaction(database) { - addLogger(Slf4jSqlDebugLogger) - SchemaUtils.create( - LinkedPlayerTable - ) + SchemaUtils.create(LinkedPlayerTable) } database }