diff --git a/build.gradle.kts b/build.gradle.kts index 1bfa025..a25aa83 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -47,17 +47,21 @@ dependencies { compileOnly("me.clip:placeholderapi:2.11.6") compileOnly("net.essentialsx:EssentialsX:2.21.0") compileOnly(files("libs/AnnouncerPlus-1.4.1.jar")) + compileOnly(project(":libs:Utilities-OG")) - implementation("net.dv8tion:JDA:5.5.1") { - exclude(module = "opus-java") - } - implementation(project(":libs:Utilities-OG")) + implementation("net.dv8tion:JDA:5.5.1") implementation("club.minnced:jda-ktx:0.12.0") implementation("club.minnced:discord-webhooks:0.8.4") implementation("com.google.code.gson:gson:2.13.1") - implementation("io.github.crackthecodeabhi:kreds:0.9.1") + implementation("io.lettuce:lettuce-core:6.7.1.RELEASE") implementation("com.squareup.okhttp3:okhttp:4.12.0") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2") + implementation("org.jetbrains.kotlin:kotlin-stdlib") +} + +configurations.all { + exclude(group = "com.google.crypto.tink", module = "tink") + exclude(group = "net.java", module = "opus-java") + exclude(group = "io.projectreactor") } java { @@ -80,6 +84,7 @@ tasks.jar { tasks.shadowJar { archiveClassifier.set("") // Use empty string instead of null. exclude("io.github.miniplaceholders.*") // Exclude the MiniPlaceholders package from being shadowed. + exclude("natives/**") minimize() } diff --git a/src/main/kotlin/nl/skbotnl/chatog/BlocklistManager.kt b/src/main/kotlin/nl/skbotnl/chatog/BlocklistManager.kt index 4d811cd..622c4f6 100755 --- a/src/main/kotlin/nl/skbotnl/chatog/BlocklistManager.kt +++ b/src/main/kotlin/nl/skbotnl/chatog/BlocklistManager.kt @@ -1,6 +1,5 @@ package nl.skbotnl.chatog -import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.net.URI @@ -9,7 +8,6 @@ import java.util.concurrent.TimeUnit object BlocklistManager { private var blockList = mutableListOf() - @OptIn(DelicateCoroutinesApi::class) fun load() { ChatOG.plugin.logger.info("Loading the blocklists...") diff --git a/src/main/kotlin/nl/skbotnl/chatog/ChatOG.kt b/src/main/kotlin/nl/skbotnl/chatog/ChatOG.kt index d3dc2c6..3464e79 100755 --- a/src/main/kotlin/nl/skbotnl/chatog/ChatOG.kt +++ b/src/main/kotlin/nl/skbotnl/chatog/ChatOG.kt @@ -15,6 +15,7 @@ class ChatOG : JavaPlugin() { lateinit var plugin: JavaPlugin lateinit var chat: Chat + lateinit var languageDatabase: LanguageDatabase var translator: OpenAI? = null var essentials = Bukkit.getServer().pluginManager.getPlugin("Essentials") as Essentials @@ -62,7 +63,13 @@ class ChatOG : JavaPlugin() { OpenAI() } else null - LanguageDatabase.init() + languageDatabase = LanguageDatabase() + if (languageDatabase.testConnection()) { + logger.severe("Could not connect to Redis") + Bukkit.getPluginManager().disablePlugin(this) + return + } + BlocklistManager.load() scope.launch { EmojiConverter.load() diff --git a/src/main/kotlin/nl/skbotnl/chatog/LanguageDatabase.kt b/src/main/kotlin/nl/skbotnl/chatog/LanguageDatabase.kt index 9cd8a1b..5fd43c5 100755 --- a/src/main/kotlin/nl/skbotnl/chatog/LanguageDatabase.kt +++ b/src/main/kotlin/nl/skbotnl/chatog/LanguageDatabase.kt @@ -1,37 +1,37 @@ package nl.skbotnl.chatog -import io.github.crackthecodeabhi.kreds.connection.Endpoint -import io.github.crackthecodeabhi.kreds.connection.KredsClient -import io.github.crackthecodeabhi.kreds.connection.newClient +import io.lettuce.core.RedisClient +import io.lettuce.core.RedisConnectionException import java.util.* -import java.util.logging.Level -object LanguageDatabase { - private lateinit var client: KredsClient - - fun init() { - client = newClient(Endpoint.from(Config.redisUrl)) - } - - suspend fun getPlayerLanguage(uuid: UUID): String? { - try { - return client.get("chatog:language:$uuid") - } catch (e: Exception) { - ChatOG.plugin.logger.log(Level.SEVERE, "Exception:", e) - } - return null - } +class LanguageDatabase { + private val redisClient: RedisClient = RedisClient.create(Config.redisUrl) /** * @return True if failed */ - suspend fun setPlayerLanguage(uuid: UUID, language: String): Boolean { + fun testConnection(): Boolean { try { - client.set("chatog:language:$uuid", language) + val connection = redisClient.connect() + connection.close() return false - } catch (e: Exception) { - ChatOG.plugin.logger.log(Level.SEVERE, "Exception:", e) + } catch (_: RedisConnectionException) { + return true } - return true + } + + fun getPlayerLanguage(uuid: UUID): String? { + val connection = redisClient.connect() + val commands = connection.sync() + val value = commands.get("chatog:language:$uuid") + connection.close() + return value + } + + fun setPlayerLanguage(uuid: UUID, language: String) { + val connection = redisClient.connect() + val commands = connection.sync() + commands.set("chatog:language:$uuid", language) + connection.close() } } diff --git a/src/main/kotlin/nl/skbotnl/chatog/commands/ChatConfigReload.kt b/src/main/kotlin/nl/skbotnl/chatog/commands/ChatConfigReload.kt index 3d54ff5..2124869 100755 --- a/src/main/kotlin/nl/skbotnl/chatog/commands/ChatConfigReload.kt +++ b/src/main/kotlin/nl/skbotnl/chatog/commands/ChatConfigReload.kt @@ -20,7 +20,12 @@ class ChatConfigReload : CommandExecutor { return true } - LanguageDatabase.init() + ChatOG.languageDatabase = LanguageDatabase() + if (ChatOG.languageDatabase.testConnection()) { + ChatOG.plugin.logger.severe("Could not connect to Redis") + Bukkit.getPluginManager().disablePlugin(ChatOG.plugin) + return true + } if (Config.discordEnabled) { DiscordBridge.webhook = WebhookClient.withUrl(Config.webhook) diff --git a/src/main/kotlin/nl/skbotnl/chatog/commands/TranslateMessage.kt b/src/main/kotlin/nl/skbotnl/chatog/commands/TranslateMessage.kt index 30e1f11..4dba08a 100755 --- a/src/main/kotlin/nl/skbotnl/chatog/commands/TranslateMessage.kt +++ b/src/main/kotlin/nl/skbotnl/chatog/commands/TranslateMessage.kt @@ -1,13 +1,14 @@ package nl.skbotnl.chatog.commands import kotlinx.coroutines.DelicateCoroutinesApi -import kotlinx.coroutines.launch import me.clip.placeholderapi.PlaceholderAPI import net.kyori.adventure.text.Component import net.kyori.adventure.text.JoinConfiguration import net.kyori.adventure.text.format.NamedTextColor import net.trueog.utilitiesog.UtilitiesOG -import nl.skbotnl.chatog.* +import nl.skbotnl.chatog.ChatOG +import nl.skbotnl.chatog.Config +import nl.skbotnl.chatog.Helper import nl.skbotnl.chatog.Helper.legacyToMm import org.bukkit.Bukkit import org.bukkit.command.Command @@ -97,40 +98,27 @@ class TranslateMessage : CommandExecutor { return true } - ChatOG.scope.launch { - val language = LanguageDatabase.getPlayerLanguage(player.uniqueId) + val language = ChatOG.languageDatabase.getPlayerLanguage(player.uniqueId) - if (language == null) { - player.sendMessage( - UtilitiesOG.trueogColorize("${Config.prefix}: Something went wrong while trying to get your preferred language.") - ) - return@launch - } - - player.sendMessage(UtilitiesOG.trueogColorize("${Config.prefix}: Translating message (this can take some time)...")) - - val translated = ChatOG.translator!!.translate(sentMessage.message, language) - translateCallback(translated, player, messageType, sentMessage, language) + if (language == null) { + player.sendMessage( + UtilitiesOG.trueogColorize("${Config.prefix}: Something went wrong while trying to get your preferred language.") + ) + return true } - return true - } + player.sendMessage(UtilitiesOG.trueogColorize("${Config.prefix}: Translating message (this can take some time)...")) + + val translated = ChatOG.translator!!.translate(sentMessage.message, language) - private fun translateCallback( - translated: OpenAI.Translated, - player: Player, - messageType: Int, - sentMessage: ISentMessage?, - language: String - ) { if (translated.error != null) { player.sendMessage(translated.error) - return + return true } if (translated.translatedText == null) { player.sendMessage(UtilitiesOG.trueogColorize("${Config.prefix}: Could not translate that message.")) - return + return true } lateinit var translateMessage: Component @@ -198,5 +186,7 @@ class TranslateMessage : CommandExecutor { } } player.sendMessage(translateMessage) + + return true } } diff --git a/src/main/kotlin/nl/skbotnl/chatog/commands/TranslateSettings.kt b/src/main/kotlin/nl/skbotnl/chatog/commands/TranslateSettings.kt index 18a062b..79b8c03 100755 --- a/src/main/kotlin/nl/skbotnl/chatog/commands/TranslateSettings.kt +++ b/src/main/kotlin/nl/skbotnl/chatog/commands/TranslateSettings.kt @@ -1,11 +1,9 @@ package nl.skbotnl.chatog.commands import kotlinx.coroutines.DelicateCoroutinesApi -import kotlinx.coroutines.launch import net.trueog.utilitiesog.UtilitiesOG import nl.skbotnl.chatog.ChatOG import nl.skbotnl.chatog.Config -import nl.skbotnl.chatog.LanguageDatabase import org.bukkit.command.Command import org.bukkit.command.CommandExecutor import org.bukkit.command.CommandSender @@ -79,14 +77,8 @@ class TranslateSettings : CommandExecutor { return true } - ChatOG.scope.launch { - val failed = LanguageDatabase.setPlayerLanguage(sender.uniqueId, language) - if (failed) { - sender.sendMessage(UtilitiesOG.trueogColorize("${Config.prefix}: Failed to set your preferred language. Try again later.")) - return@launch - } - sender.sendMessage(UtilitiesOG.trueogColorize("${Config.prefix}: Set language to: $language.")) - } + ChatOG.languageDatabase.setPlayerLanguage(sender.uniqueId, language) + sender.sendMessage(UtilitiesOG.trueogColorize("${Config.prefix}: Set language to: $language.")) return true } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 5073c46..0cf900d 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -3,7 +3,8 @@ prefix: [Chat-OG] # ---Redis--- -redisUrl: 127.0.0.1:6379 +# Redis URL according to https://redis.github.io/lettuce/user-guide/connecting-redis/#uri-syntax +redisUrl: 127.0.0.1:6379/0 # ---OpenAI API Translation--- # Any OpenAI-compatible (OpenAI, ollama, llama.cpp) API will work here