1
0

add a possibility for a replay session
All checks were successful
Build & Publish / build (push) Successful in 3m59s

This commit is contained in:
Jannik Reimers 2025-04-05 21:55:02 +02:00
parent 61ffaa7116
commit 3ae5407a2d
Signed by: jansel
GPG Key ID: 39C62D7D5233CFD0
7 changed files with 107 additions and 4 deletions

View File

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

View File

@ -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<ConfigData>()
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)
}

View File

@ -0,0 +1,8 @@
package dev.jansel.aglaea.database.entities
import kotlinx.serialization.Serializable
@Serializable
data class ConfigData(
val replaySession: Boolean?
)

View File

@ -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<GuildMessageChannel>(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()

View File

@ -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"
}
}
}
}
}
}

View File

@ -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) {

View File

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