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..299c7a5 100644 --- a/src/main/kotlin/dev/jansel/feixiao/App.kt +++ b/src/main/kotlin/dev/jansel/feixiao/App.kt @@ -10,15 +10,19 @@ 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 import io.github.oshai.kotlinlogging.KotlinLogging 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) { @@ -27,6 +31,9 @@ suspend fun main() { add(::EventHooks) add(::StreamerCommand) } + i18n { + applicationCommandLocale(SupportedLocales.ENGLISH, SupportedLocales.GERMAN) + } } twitchClient = TwitchClientBuilder.builder() .withEnableHelix(true) @@ -47,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 24b7641..5fb0e0d 100644 --- a/src/main/kotlin/dev/jansel/feixiao/extensions/EventHooks.kt +++ b/src/main/kotlin/dev/jansel/feixiao/extensions/EventHooks.kt @@ -11,7 +11,6 @@ import dev.kord.core.entity.channel.GuildMessageChannel 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 3f7f66e..efafbac 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,19 +19,25 @@ 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) } 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" @@ -39,8 +46,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 +65,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..95535d7 --- /dev/null +++ b/src/main/resources/translations/feixiao/strings.properties @@ -0,0 +1,20 @@ +# Streamer Command + +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 + +# more to come...