From 1800f44941ca08d922abb722aa5a08be2a934e3f Mon Sep 17 00:00:00 2001 From: Jannik Reimers Date: Wed, 27 Nov 2024 23:13:31 +0100 Subject: [PATCH 1/3] work on the translation stuff in kordex that is required as of version 2.3 --- .idea/kotlinc.xml | 2 +- build.gradle.kts | 10 ++++-- gradle/libs.versions.toml | 2 +- settings.gradle.kts | 16 ++++++--- src/main/kotlin/dev/jansel/feixiao/App.kt | 4 +++ .../feixiao/extensions/StreamerCommand.kt | 33 ++++++++++--------- .../translations/feixiao/strings.properties | 16 +++++++++ 7 files changed, 57 insertions(+), 26 deletions(-) create mode 100644 src/main/resources/translations/feixiao/strings.properties diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index d4b7acc..c224ad5 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index f795a72..802ad4c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -32,8 +32,7 @@ dependencies { } kordEx { - kordExVersion = "2.2.1-SNAPSHOT" - kordVersion = "0.16.0-SNAPSHOT" + kordExVersion = "2.3.1-SNAPSHOT" jvmTarget = 21 bot { @@ -42,6 +41,11 @@ kordEx { mainClass = "dev.jansel.feixiao.AppKt" } + + i18n { + classPackage = "dev.jansel.feixiao.i18n" + translationBundle = "feixiao.strings" + } } // Automatically generate a Dockerfile. Set `generateOnBuild` to `false` if you'd prefer to manually run the @@ -85,6 +89,6 @@ docker { } tasks.wrapper { - gradleVersion = "8.10.2" + gradleVersion = "8.11.1" distributionType = Wrapper.DistributionType.BIN } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 76665e0..9329a3e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -kotlin = "2.0.20" # Note: Plugin versions must be updated in the settings.gradle.kts too +kotlin = "2.0.21" # Note: Plugin versions must be updated in the settings.gradle.kts too groovy = "3.0.22" jansi = "2.4.1" diff --git a/settings.gradle.kts b/settings.gradle.kts index 3e1187a..bc1be29 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,14 +1,20 @@ pluginManagement { plugins { // Update this in libs.version.toml when you change it here. - kotlin("jvm") version "2.0.20" - kotlin("plugin.serialization") version "2.0.20" + kotlin("jvm") version "2.0.21" + kotlin("plugin.serialization") version "2.0.21" - id("com.github.jakemarsden.git-hooks") version "0.0.2" id("com.github.johnrengelman.shadow") version "8.1.1" - id("dev.kordex.gradle.docker") version "1.4.2" - id("dev.kordex.gradle.kordex") version "1.4.2" + id("dev.kordex.gradle.docker") version "1.5.8" + id("dev.kordex.gradle.kordex") version "1.5.8" + } + repositories { + gradlePluginPortal() + mavenCentral() + + maven("https://snapshots-repo.kordex.dev") + maven("https://releases-repo.kordex.dev") } } diff --git a/src/main/kotlin/dev/jansel/feixiao/App.kt b/src/main/kotlin/dev/jansel/feixiao/App.kt index 9f70fcc..85a790f 100644 --- a/src/main/kotlin/dev/jansel/feixiao/App.kt +++ b/src/main/kotlin/dev/jansel/feixiao/App.kt @@ -13,6 +13,7 @@ import dev.jansel.feixiao.extensions.StreamerCommand import dev.jansel.feixiao.utils.* import dev.kord.core.entity.channel.GuildMessageChannel import dev.kordex.core.ExtensibleBot +import dev.kordex.core.i18n.SupportedLocales import io.github.oshai.kotlinlogging.KotlinLogging import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking @@ -27,6 +28,9 @@ suspend fun main() { add(::EventHooks) add(::StreamerCommand) } + i18n { + applicationCommandLocale(SupportedLocales.ENGLISH, SupportedLocales.GERMAN) + } } twitchClient = TwitchClientBuilder.builder() .withEnableHelix(true) diff --git a/src/main/kotlin/dev/jansel/feixiao/extensions/StreamerCommand.kt b/src/main/kotlin/dev/jansel/feixiao/extensions/StreamerCommand.kt index 3f7f66e..53bfedd 100644 --- a/src/main/kotlin/dev/jansel/feixiao/extensions/StreamerCommand.kt +++ b/src/main/kotlin/dev/jansel/feixiao/extensions/StreamerCommand.kt @@ -1,6 +1,7 @@ package dev.jansel.feixiao.extensions import dev.jansel.feixiao.database.collections.StreamerCollection +import dev.jansel.feixiao.i18n.Translations import dev.jansel.feixiao.twitchClient import dev.kord.common.entity.Permission import dev.kordex.core.checks.anyGuild @@ -18,12 +19,12 @@ class StreamerCommand : Extension() { override val name = "streaming" override suspend fun setup() { publicSlashCommand { - name = "streamer" - description = "Streamer commands" + name = Translations.Streamer.Command.name + description = Translations.Streamer.Command.description publicSubCommand(::AddStreamerArgs) { - name = "add" - description = "Add a streamer to the listener of this server" + name = Translations.Streamer.Command.Add.name + description = Translations.Streamer.Command.Add.description check { anyGuild() hasPermission(Permission.ManageGuild) @@ -39,8 +40,8 @@ class StreamerCommand : Extension() { } publicSubCommand(::RemoveStreamerArgs) { - name = "remove" - description = "Remove a streamer from the listener of this server" + name = Translations.Streamer.Command.Remove.name + description = Translations.Streamer.Command.Remove.description check { anyGuild() hasPermission(Permission.ManageGuild) @@ -58,29 +59,29 @@ class StreamerCommand : Extension() { inner class AddStreamerArgs : Arguments() { val streamer by string { - name = "streamer" - description = "The streamer to add" + name = Translations.Streamer.Command.Arguments.Add.Streamer.name + description = Translations.Streamer.Command.Arguments.Add.Streamer.description require(true) } val channel by channel { - name = "announcechannel" - description = "Channel where the bot will send a message when the streamer goes live" + name = Translations.Streamer.Command.Arguments.Add.Channel.name + description = Translations.Streamer.Command.Arguments.Add.Channel.description require(true) } val role by optionalRole { - name = "role" - description = "Role to ping when the streamer goes live" + name = Translations.Streamer.Command.Arguments.Add.Role.name + description = Translations.Streamer.Command.Arguments.Add.Role.description } val message by optionalString { - name = "message" - description = "Possible placeholders (put in curly braces!!): url, name, title, category, role (if set)" + name = Translations.Streamer.Command.Arguments.Add.Message.name + description = Translations.Streamer.Command.Arguments.Add.Message.description } } inner class RemoveStreamerArgs : Arguments() { val streamer by string { - name = "streamer" - description = "The streamer to remove" + name = Translations.Streamer.Command.Arguments.Remove.name + description = Translations.Streamer.Command.Arguments.Remove.description require(true) } } diff --git a/src/main/resources/translations/feixiao/strings.properties b/src/main/resources/translations/feixiao/strings.properties new file mode 100644 index 0000000..266c513 --- /dev/null +++ b/src/main/resources/translations/feixiao/strings.properties @@ -0,0 +1,16 @@ +streamer.command.name=streamer +streamer.command.description=A bundle of Streamer commands +streamer.command.add.name=add +streamer.command.add.description=Add a new streamer to the listener +streamer.command.remove.name=remove +streamer.command.remove.description=Remove a streamer from the listener +streamer.command.arguments.add.streamer.name=streamer +streamer.command.arguments.add.streamer.description=The streamer to add +streamer.command.arguments.add.channel.name=channel +streamer.command.arguments.add.channel.description=The channel to add the streamer to +streamer.command.arguments.add.role.name=role +streamer.command.arguments.add.role.description=The role to assign to the streamer +streamer.command.arguments.add.message.name=message +streamer.command.arguments.add.message.description=Custom Announce message. Placeholders (in curly braces): url, name, title, category, role (if set) +streamer.command.arguments.remove.name=streamer +streamer.command.arguments.remove.description=The streamer to remove From fce192d295057f5739777bc0b67cf7b9c9f06788 Mon Sep 17 00:00:00 2001 From: Jannik Reimers Date: Wed, 27 Nov 2024 23:36:45 +0100 Subject: [PATCH 2/3] add comment to the streamer command to be able to differentiate it better later --- src/main/resources/translations/feixiao/strings.properties | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/resources/translations/feixiao/strings.properties b/src/main/resources/translations/feixiao/strings.properties index 266c513..95535d7 100644 --- a/src/main/resources/translations/feixiao/strings.properties +++ b/src/main/resources/translations/feixiao/strings.properties @@ -1,3 +1,5 @@ +# Streamer Command + streamer.command.name=streamer streamer.command.description=A bundle of Streamer commands streamer.command.add.name=add @@ -14,3 +16,5 @@ streamer.command.arguments.add.message.name=message streamer.command.arguments.add.message.description=Custom Announce message. Placeholders (in curly braces): url, name, title, category, role (if set) streamer.command.arguments.remove.name=streamer streamer.command.arguments.remove.description=The streamer to remove + +# more to come... From 20da6a5dda9f7dab5d9cd65bb0a3fa4f6d472f9e Mon Sep 17 00:00:00 2001 From: Jannik Reimers Date: Wed, 27 Nov 2024 23:38:04 +0100 Subject: [PATCH 3/3] reformat code and optimize imports (IntelliJ internal function) --- src/main/kotlin/dev/jansel/feixiao/App.kt | 33 +++++++++++-------- .../collections/StreamerCollection.kt | 16 +++++++-- .../jansel/feixiao/extensions/EventHooks.kt | 1 - .../feixiao/extensions/StreamerCommand.kt | 8 ++++- 4 files changed, 41 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/dev/jansel/feixiao/App.kt b/src/main/kotlin/dev/jansel/feixiao/App.kt index 85a790f..299c7a5 100644 --- a/src/main/kotlin/dev/jansel/feixiao/App.kt +++ b/src/main/kotlin/dev/jansel/feixiao/App.kt @@ -10,7 +10,10 @@ import com.github.twitch4j.events.ChannelGoLiveEvent import dev.jansel.feixiao.database.collections.StreamerCollection import dev.jansel.feixiao.extensions.EventHooks import dev.jansel.feixiao.extensions.StreamerCommand -import dev.jansel.feixiao.utils.* +import dev.jansel.feixiao.utils.database +import dev.jansel.feixiao.utils.token +import dev.jansel.feixiao.utils.twitchcid +import dev.jansel.feixiao.utils.twitchcs import dev.kord.core.entity.channel.GuildMessageChannel import dev.kordex.core.ExtensibleBot import dev.kordex.core.i18n.SupportedLocales @@ -19,7 +22,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking var twitchClient: TwitchClient? = null -val logger = KotlinLogging.logger { } +val logger = KotlinLogging.logger { } suspend fun main() { val bot = ExtensibleBot(token) { @@ -51,22 +54,26 @@ suspend fun main() { if (role != null) { if (livemessage != null) { - channel?.createMessage(livemessage - .replace("{name}", it.channel.name) - .replace("{category}", it.stream.gameName) - .replace("{title}", it.stream.title) - .replace("{url}", "https://twitch.tv/${it.channel.name}") - .replace("{role}", "<@&$role>")) + channel?.createMessage( + livemessage + .replace("{name}", it.channel.name) + .replace("{category}", it.stream.gameName) + .replace("{title}", it.stream.title) + .replace("{url}", "https://twitch.tv/${it.channel.name}") + .replace("{role}", "<@&$role>") + ) } else { channel?.createMessage("<@&$role> https://twitch.tv/${it.channel.name} went live streaming ${it.stream.gameName}: ${it.stream.title}") } } else { if (livemessage != null) { - channel?.createMessage(livemessage - .replace("{name}", it.channel.name) - .replace("{category}", it.stream.gameName) - .replace("{title}", it.stream.title) - .replace("{url}", "https://twitch.tv/${it.channel.name}")) + channel?.createMessage( + livemessage + .replace("{name}", it.channel.name) + .replace("{category}", it.stream.gameName) + .replace("{title}", it.stream.title) + .replace("{url}", "https://twitch.tv/${it.channel.name}") + ) } else { channel?.createMessage("https://twitch.tv/${it.channel.name} went live streaming ${it.stream.gameName}: ${it.stream.title}") } diff --git a/src/main/kotlin/dev/jansel/feixiao/database/collections/StreamerCollection.kt b/src/main/kotlin/dev/jansel/feixiao/database/collections/StreamerCollection.kt index 8304211..651df09 100644 --- a/src/main/kotlin/dev/jansel/feixiao/database/collections/StreamerCollection.kt +++ b/src/main/kotlin/dev/jansel/feixiao/database/collections/StreamerCollection.kt @@ -20,7 +20,13 @@ class StreamerCollection : KordExKoinComponent { suspend fun getData(channelName: String): StreamerData? = collection.findOne(StreamerData::name eq channelName) - suspend fun updateData(guildId: Snowflake, channelId: Snowflake, streamerName: String, roleId: Snowflake?, liveMessage: String?) { + suspend fun updateData( + guildId: Snowflake, + channelId: Snowflake, + streamerName: String, + roleId: Snowflake?, + liveMessage: String? + ) { val coll = collection.findOne(StreamerData::name eq streamerName) if (coll != null) { collection.updateOne( @@ -34,7 +40,13 @@ class StreamerCollection : KordExKoinComponent { } } - suspend fun removeData(guildId: Snowflake, channelId: Snowflake, streamerName: String, roleId: Snowflake?, liveMessage: String?) { + suspend fun removeData( + guildId: Snowflake, + channelId: Snowflake, + streamerName: String, + roleId: Snowflake?, + liveMessage: String? + ) { val coll = collection.findOne(StreamerData::name eq streamerName) if (coll != null) { collection.updateOne( diff --git a/src/main/kotlin/dev/jansel/feixiao/extensions/EventHooks.kt b/src/main/kotlin/dev/jansel/feixiao/extensions/EventHooks.kt index 246afb1..0a49bd4 100644 --- a/src/main/kotlin/dev/jansel/feixiao/extensions/EventHooks.kt +++ b/src/main/kotlin/dev/jansel/feixiao/extensions/EventHooks.kt @@ -7,7 +7,6 @@ import dev.jansel.feixiao.twitchClient import dev.kord.core.event.gateway.ReadyEvent import dev.kordex.core.extensions.Extension import dev.kordex.core.extensions.event -import org.litote.kmongo.deleteMany import org.litote.kmongo.eq class EventHooks : Extension() { diff --git a/src/main/kotlin/dev/jansel/feixiao/extensions/StreamerCommand.kt b/src/main/kotlin/dev/jansel/feixiao/extensions/StreamerCommand.kt index 53bfedd..efafbac 100644 --- a/src/main/kotlin/dev/jansel/feixiao/extensions/StreamerCommand.kt +++ b/src/main/kotlin/dev/jansel/feixiao/extensions/StreamerCommand.kt @@ -31,7 +31,13 @@ class StreamerCommand : Extension() { } action { val streamer = arguments.streamer - StreamerCollection().updateData(guild!!.id, arguments.channel.id, streamer, arguments.role?.id, arguments.message) + StreamerCollection().updateData( + guild!!.id, + arguments.channel.id, + streamer, + arguments.role?.id, + arguments.message + ) twitchClient!!.clientHelper.enableStreamEventListener(streamer) respond { content = "Added streamer $streamer"