Merge branch 'refactor/translations-and-latest-kordex' into root

This commit is contained in:
Jannik Reimers 2024-11-27 23:51:47 +01:00
commit c96e4f56ee
Signed by: jansel
GPG key ID: 39C62D7D5233CFD0
9 changed files with 102 additions and 43 deletions

2
.idea/kotlinc.xml generated
View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="KotlinJpsPluginSettings"> <component name="KotlinJpsPluginSettings">
<option name="version" value="2.0.20" /> <option name="version" value="2.0.21" />
</component> </component>
</project> </project>

View file

@ -32,8 +32,7 @@ dependencies {
} }
kordEx { kordEx {
kordExVersion = "2.2.1-SNAPSHOT" kordExVersion = "2.3.1-SNAPSHOT"
kordVersion = "0.16.0-SNAPSHOT"
jvmTarget = 21 jvmTarget = 21
bot { bot {
@ -42,6 +41,11 @@ kordEx {
mainClass = "dev.jansel.feixiao.AppKt" 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 // Automatically generate a Dockerfile. Set `generateOnBuild` to `false` if you'd prefer to manually run the
@ -85,6 +89,6 @@ docker {
} }
tasks.wrapper { tasks.wrapper {
gradleVersion = "8.10.2" gradleVersion = "8.11.1"
distributionType = Wrapper.DistributionType.BIN distributionType = Wrapper.DistributionType.BIN
} }

View file

@ -1,5 +1,5 @@
[versions] [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" groovy = "3.0.22"
jansi = "2.4.1" jansi = "2.4.1"

View file

@ -1,14 +1,20 @@
pluginManagement { pluginManagement {
plugins { plugins {
// Update this in libs.version.toml when you change it here. // Update this in libs.version.toml when you change it here.
kotlin("jvm") version "2.0.20" kotlin("jvm") version "2.0.21"
kotlin("plugin.serialization") version "2.0.20" 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("com.github.johnrengelman.shadow") version "8.1.1"
id("dev.kordex.gradle.docker") version "1.4.2" id("dev.kordex.gradle.docker") version "1.5.8"
id("dev.kordex.gradle.kordex") version "1.4.2" id("dev.kordex.gradle.kordex") version "1.5.8"
}
repositories {
gradlePluginPortal()
mavenCentral()
maven("https://snapshots-repo.kordex.dev")
maven("https://releases-repo.kordex.dev")
} }
} }

View file

@ -10,15 +10,19 @@ import com.github.twitch4j.events.ChannelGoLiveEvent
import dev.jansel.feixiao.database.collections.StreamerCollection import dev.jansel.feixiao.database.collections.StreamerCollection
import dev.jansel.feixiao.extensions.EventHooks import dev.jansel.feixiao.extensions.EventHooks
import dev.jansel.feixiao.extensions.StreamerCommand 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.kord.core.entity.channel.GuildMessageChannel
import dev.kordex.core.ExtensibleBot import dev.kordex.core.ExtensibleBot
import dev.kordex.core.i18n.SupportedLocales
import io.github.oshai.kotlinlogging.KotlinLogging import io.github.oshai.kotlinlogging.KotlinLogging
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
var twitchClient: TwitchClient? = null var twitchClient: TwitchClient? = null
val logger = KotlinLogging.logger { } val logger = KotlinLogging.logger { }
suspend fun main() { suspend fun main() {
val bot = ExtensibleBot(token) { val bot = ExtensibleBot(token) {
@ -27,6 +31,9 @@ suspend fun main() {
add(::EventHooks) add(::EventHooks)
add(::StreamerCommand) add(::StreamerCommand)
} }
i18n {
applicationCommandLocale(SupportedLocales.ENGLISH, SupportedLocales.GERMAN)
}
} }
twitchClient = TwitchClientBuilder.builder() twitchClient = TwitchClientBuilder.builder()
.withEnableHelix(true) .withEnableHelix(true)
@ -47,22 +54,26 @@ suspend fun main() {
if (role != null) { if (role != null) {
if (livemessage != null) { if (livemessage != null) {
channel?.createMessage(livemessage channel?.createMessage(
.replace("{name}", it.channel.name) livemessage
.replace("{category}", it.stream.gameName) .replace("{name}", it.channel.name)
.replace("{title}", it.stream.title) .replace("{category}", it.stream.gameName)
.replace("{url}", "https://twitch.tv/${it.channel.name}") .replace("{title}", it.stream.title)
.replace("{role}", "<@&$role>")) .replace("{url}", "https://twitch.tv/${it.channel.name}")
.replace("{role}", "<@&$role>")
)
} else { } else {
channel?.createMessage("<@&$role> https://twitch.tv/${it.channel.name} went live streaming ${it.stream.gameName}: ${it.stream.title}") channel?.createMessage("<@&$role> https://twitch.tv/${it.channel.name} went live streaming ${it.stream.gameName}: ${it.stream.title}")
} }
} else { } else {
if (livemessage != null) { if (livemessage != null) {
channel?.createMessage(livemessage channel?.createMessage(
.replace("{name}", it.channel.name) livemessage
.replace("{category}", it.stream.gameName) .replace("{name}", it.channel.name)
.replace("{title}", it.stream.title) .replace("{category}", it.stream.gameName)
.replace("{url}", "https://twitch.tv/${it.channel.name}")) .replace("{title}", it.stream.title)
.replace("{url}", "https://twitch.tv/${it.channel.name}")
)
} else { } else {
channel?.createMessage("https://twitch.tv/${it.channel.name} went live streaming ${it.stream.gameName}: ${it.stream.title}") channel?.createMessage("https://twitch.tv/${it.channel.name} went live streaming ${it.stream.gameName}: ${it.stream.title}")
} }

View file

@ -20,7 +20,13 @@ class StreamerCollection : KordExKoinComponent {
suspend fun getData(channelName: String): StreamerData? = suspend fun getData(channelName: String): StreamerData? =
collection.findOne(StreamerData::name eq channelName) 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) val coll = collection.findOne(StreamerData::name eq streamerName)
if (coll != null) { if (coll != null) {
collection.updateOne( 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) val coll = collection.findOne(StreamerData::name eq streamerName)
if (coll != null) { if (coll != null) {
collection.updateOne( collection.updateOne(

View file

@ -11,7 +11,6 @@ import dev.kord.core.entity.channel.GuildMessageChannel
import dev.kord.core.event.gateway.ReadyEvent import dev.kord.core.event.gateway.ReadyEvent
import dev.kordex.core.extensions.Extension import dev.kordex.core.extensions.Extension
import dev.kordex.core.extensions.event import dev.kordex.core.extensions.event
import org.litote.kmongo.deleteMany
import org.litote.kmongo.eq import org.litote.kmongo.eq
class EventHooks : Extension() { class EventHooks : Extension() {

View file

@ -1,6 +1,7 @@
package dev.jansel.feixiao.extensions package dev.jansel.feixiao.extensions
import dev.jansel.feixiao.database.collections.StreamerCollection import dev.jansel.feixiao.database.collections.StreamerCollection
import dev.jansel.feixiao.i18n.Translations
import dev.jansel.feixiao.twitchClient import dev.jansel.feixiao.twitchClient
import dev.kord.common.entity.Permission import dev.kord.common.entity.Permission
import dev.kordex.core.checks.anyGuild import dev.kordex.core.checks.anyGuild
@ -18,19 +19,25 @@ class StreamerCommand : Extension() {
override val name = "streaming" override val name = "streaming"
override suspend fun setup() { override suspend fun setup() {
publicSlashCommand { publicSlashCommand {
name = "streamer" name = Translations.Streamer.Command.name
description = "Streamer commands" description = Translations.Streamer.Command.description
publicSubCommand(::AddStreamerArgs) { publicSubCommand(::AddStreamerArgs) {
name = "add" name = Translations.Streamer.Command.Add.name
description = "Add a streamer to the listener of this server" description = Translations.Streamer.Command.Add.description
check { check {
anyGuild() anyGuild()
hasPermission(Permission.ManageGuild) hasPermission(Permission.ManageGuild)
} }
action { action {
val streamer = arguments.streamer 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) twitchClient!!.clientHelper.enableStreamEventListener(streamer)
respond { respond {
content = "Added streamer $streamer" content = "Added streamer $streamer"
@ -39,8 +46,8 @@ class StreamerCommand : Extension() {
} }
publicSubCommand(::RemoveStreamerArgs) { publicSubCommand(::RemoveStreamerArgs) {
name = "remove" name = Translations.Streamer.Command.Remove.name
description = "Remove a streamer from the listener of this server" description = Translations.Streamer.Command.Remove.description
check { check {
anyGuild() anyGuild()
hasPermission(Permission.ManageGuild) hasPermission(Permission.ManageGuild)
@ -58,29 +65,29 @@ class StreamerCommand : Extension() {
inner class AddStreamerArgs : Arguments() { inner class AddStreamerArgs : Arguments() {
val streamer by string { val streamer by string {
name = "streamer" name = Translations.Streamer.Command.Arguments.Add.Streamer.name
description = "The streamer to add" description = Translations.Streamer.Command.Arguments.Add.Streamer.description
require(true) require(true)
} }
val channel by channel { val channel by channel {
name = "announcechannel" name = Translations.Streamer.Command.Arguments.Add.Channel.name
description = "Channel where the bot will send a message when the streamer goes live" description = Translations.Streamer.Command.Arguments.Add.Channel.description
require(true) require(true)
} }
val role by optionalRole { val role by optionalRole {
name = "role" name = Translations.Streamer.Command.Arguments.Add.Role.name
description = "Role to ping when the streamer goes live" description = Translations.Streamer.Command.Arguments.Add.Role.description
} }
val message by optionalString { val message by optionalString {
name = "message" name = Translations.Streamer.Command.Arguments.Add.Message.name
description = "Possible placeholders (put in curly braces!!): url, name, title, category, role (if set)" description = Translations.Streamer.Command.Arguments.Add.Message.description
} }
} }
inner class RemoveStreamerArgs : Arguments() { inner class RemoveStreamerArgs : Arguments() {
val streamer by string { val streamer by string {
name = "streamer" name = Translations.Streamer.Command.Arguments.Remove.name
description = "The streamer to remove" description = Translations.Streamer.Command.Arguments.Remove.description
require(true) require(true)
} }
} }

View file

@ -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...