From 3ae5407a2d2c68857ddf25856d11e25dbc853370 Mon Sep 17 00:00:00 2001 From: Jannik Reimers Date: Sat, 5 Apr 2025 21:55:02 +0200 Subject: [PATCH] add a possibility for a replay session --- src/main/kotlin/dev/jansel/aglaea/App.kt | 5 +-- .../database/collections/ConfigCollection.kt | 27 +++++++++++++ .../aglaea/database/entities/ConfigData.kt | 8 ++++ .../aglaea/extensions/ReplayExtension.kt | 25 ++++++++++++ .../aglaea/extensions/SessionExtension.kt | 39 +++++++++++++++++++ .../kotlin/dev/jansel/aglaea/utils/_Utils.kt | 2 + .../translations/aglaea/strings.properties | 5 ++- 7 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 src/main/kotlin/dev/jansel/aglaea/database/collections/ConfigCollection.kt create mode 100644 src/main/kotlin/dev/jansel/aglaea/database/entities/ConfigData.kt create mode 100644 src/main/kotlin/dev/jansel/aglaea/extensions/SessionExtension.kt diff --git a/src/main/kotlin/dev/jansel/aglaea/App.kt b/src/main/kotlin/dev/jansel/aglaea/App.kt index 93223b0..04051c2 100644 --- a/src/main/kotlin/dev/jansel/aglaea/App.kt +++ b/src/main/kotlin/dev/jansel/aglaea/App.kt @@ -1,11 +1,9 @@ -/* - * This Kotlin source file was generated by the Gradle 'init' task. - */ package dev.jansel.aglaea import com.github.twitch4j.TwitchClient import dev.jansel.aglaea.extensions.EventHooks import dev.jansel.aglaea.extensions.ReplayExtension +import dev.jansel.aglaea.extensions.SessionExtension import dev.jansel.aglaea.utils.database import dev.jansel.aglaea.utils.twitch import dev.kord.common.entity.Snowflake @@ -29,6 +27,7 @@ suspend fun main() { extensions { add(::ReplayExtension) add(::EventHooks) + add(::SessionExtension) } database(true) twitch(true) diff --git a/src/main/kotlin/dev/jansel/aglaea/database/collections/ConfigCollection.kt b/src/main/kotlin/dev/jansel/aglaea/database/collections/ConfigCollection.kt new file mode 100644 index 0000000..9de729b --- /dev/null +++ b/src/main/kotlin/dev/jansel/aglaea/database/collections/ConfigCollection.kt @@ -0,0 +1,27 @@ +package dev.jansel.aglaea.database.collections + +import dev.jansel.aglaea.database.Database +import dev.jansel.aglaea.database.entities.ConfigData +import dev.kordex.core.koin.KordExKoinComponent +import org.koin.core.component.inject +import org.litote.kmongo.exists + +class ConfigCollection : KordExKoinComponent { + private val db: Database by inject() + + @PublishedApi + internal val collection = db.mongo.getCollection() + suspend fun get(): ConfigData? = + collection.findOne() + suspend fun set(config: ConfigData) = + collection.insertOne(config) + suspend fun update(config: ConfigData) = + collection.findOneAndReplace( + ConfigData::replaySession exists true, + config + ) + suspend fun delete() = + collection.deleteOne(ConfigData::replaySession exists true) + suspend fun deleteAll() = + collection.deleteMany(ConfigData::replaySession exists true) +} diff --git a/src/main/kotlin/dev/jansel/aglaea/database/entities/ConfigData.kt b/src/main/kotlin/dev/jansel/aglaea/database/entities/ConfigData.kt new file mode 100644 index 0000000..3779e3a --- /dev/null +++ b/src/main/kotlin/dev/jansel/aglaea/database/entities/ConfigData.kt @@ -0,0 +1,8 @@ +package dev.jansel.aglaea.database.entities + +import kotlinx.serialization.Serializable + +@Serializable +data class ConfigData( + val replaySession: Boolean? +) diff --git a/src/main/kotlin/dev/jansel/aglaea/extensions/ReplayExtension.kt b/src/main/kotlin/dev/jansel/aglaea/extensions/ReplayExtension.kt index ac73dd7..0af5ea6 100644 --- a/src/main/kotlin/dev/jansel/aglaea/extensions/ReplayExtension.kt +++ b/src/main/kotlin/dev/jansel/aglaea/extensions/ReplayExtension.kt @@ -1,15 +1,24 @@ package dev.jansel.aglaea.extensions +import dev.jansel.aglaea.botRef +import dev.jansel.aglaea.database.collections.ConfigCollection import dev.jansel.aglaea.database.collections.ReplayCollection import dev.jansel.aglaea.database.entities.ReplayData import dev.jansel.aglaea.i18n.Translations import dev.kord.common.entity.Snowflake +import dev.kord.core.behavior.channel.createMessage +import dev.kord.core.behavior.getChannelOf +import dev.kord.core.entity.channel.GuildMessageChannel import dev.kordex.core.checks.inChannel import dev.kordex.core.commands.Arguments import dev.kordex.core.commands.converters.impl.attachment import dev.kordex.core.extensions.Extension import dev.kordex.core.extensions.ephemeralSlashCommand import dev.kordex.core.utils.download +import io.ktor.client.request.forms.* +import io.ktor.utils.io.* +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid @@ -26,6 +35,22 @@ class ReplayExtension : Extension() { } action { val file = arguments.file + val downloadedFile = file.download() + val replayToggle = ConfigCollection().get()?.replaySession ?: false + + if (replayToggle) { + val channel = botRef!!.kordRef.getGuildOrNull(Snowflake(1130932838200512584))!! + .getChannelOf(Snowflake(1130954956892029060)) + runBlocking { + launch { + channel.createMessage { + content = "Replay submitted by: ${event.interaction.user.globalName}" + this.addFile("replay.osr", ChannelProvider(null) { ByteReadChannel(downloadedFile) }) + } + } + } + return@action + } if (file.filename.endsWith(".osr")) { val id = Uuid.random().toString() diff --git a/src/main/kotlin/dev/jansel/aglaea/extensions/SessionExtension.kt b/src/main/kotlin/dev/jansel/aglaea/extensions/SessionExtension.kt new file mode 100644 index 0000000..ec48c19 --- /dev/null +++ b/src/main/kotlin/dev/jansel/aglaea/extensions/SessionExtension.kt @@ -0,0 +1,39 @@ +package dev.jansel.aglaea.extensions + +import dev.jansel.aglaea.database.collections.ConfigCollection +import dev.jansel.aglaea.i18n.Translations +import dev.jansel.aglaea.logger +import dev.kord.common.entity.Permission +import dev.kordex.core.checks.hasPermission +import dev.kordex.core.extensions.Extension +import dev.kordex.core.extensions.ephemeralSlashCommand + +class SessionExtension : Extension() { + override val name = "Session" + override suspend fun setup() { + // This is where you can add any code that should run when the bot is ready + // For example, you can initialize any services or start any background tasks + logger.info { "ReplaySession extension loaded!" } + ephemeralSlashCommand { + check { + hasPermission(Permission.Administrator) + } + name = Translations.Commands.Replaysession.name + description = Translations.Commands.Replaysession.description + action { + val toggle = ConfigCollection().get()?.replaySession ?: false + if (toggle) { + ConfigCollection().update(ConfigCollection().get()!!.copy(replaySession = false)) + respond { + content = "Replay session disabled" + } + } else { + ConfigCollection().update(ConfigCollection().get()!!.copy(replaySession = true)) + respond { + content = "Replay session enabled" + } + } + } + } + } +} diff --git a/src/main/kotlin/dev/jansel/aglaea/utils/_Utils.kt b/src/main/kotlin/dev/jansel/aglaea/utils/_Utils.kt index 0ee096c..7ab5582 100644 --- a/src/main/kotlin/dev/jansel/aglaea/utils/_Utils.kt +++ b/src/main/kotlin/dev/jansel/aglaea/utils/_Utils.kt @@ -1,6 +1,7 @@ package dev.jansel.aglaea.utils import dev.jansel.aglaea.database.Database +import dev.jansel.aglaea.database.collections.ConfigCollection import dev.jansel.aglaea.database.collections.MetaCollection import dev.jansel.aglaea.database.collections.ReplayCollection import dev.jansel.aglaea.twitchClient @@ -27,6 +28,7 @@ suspend inline fun ExtensibleBotBuilder.database(migrate: Boolean) { loadModule { single { MetaCollection() } bind MetaCollection::class single { ReplayCollection() } bind ReplayCollection::class + single { ConfigCollection() } bind ConfigCollection::class } if (migrate) { diff --git a/src/main/resources/translations/aglaea/strings.properties b/src/main/resources/translations/aglaea/strings.properties index faca416..10ed016 100644 --- a/src/main/resources/translations/aglaea/strings.properties +++ b/src/main/resources/translations/aglaea/strings.properties @@ -1,5 +1,8 @@ commands.replay.name=replay -commands.replay.description=Upload a replay file to get an auth code +commands.replay.description=Upload a replay file to get an auth code/Send in a replay for a Replay Session + +commands.replaysession.name=replaysession +commands.replaysession.description=Toggle the replay session arguments.file.name=file arguments.file.description=The file to upload