diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
index e805548aa..c264799a5 100644
--- a/.idea/kotlinc.xml
+++ b/.idea/kotlinc.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/clients/sponsorblock-kt/build.gradle.kts b/clients/sponsorblock-kt/build.gradle.kts
deleted file mode 100644
index 031e2a17c..000000000
--- a/clients/sponsorblock-kt/build.gradle.kts
+++ /dev/null
@@ -1,20 +0,0 @@
- plugins {
- `mikbot-module`
- `mikbot-publishing`
- alias(libs.plugins.kotlinx.serialization)
-}
-
-group = "dev.nycode"
-version = "1.3-SNAPSHOT"
-
-dependencies {
-// implementation(libs.ktor.client.okhttp)
- implementation(libs.ktor.client.content.negotiation)
- implementation(libs.ktor.serialization.kotlinx.json)
- testImplementation(kotlin("test"))
- testImplementation(libs.kotlinx.coroutines.test)
-}
-
-kotlin {
- explicitApi()
-}
diff --git a/clients/sponsorblock-kt/src/main/kotlin/SponsorBlockClient.kt b/clients/sponsorblock-kt/src/main/kotlin/SponsorBlockClient.kt
deleted file mode 100644
index 1d1ce1a28..000000000
--- a/clients/sponsorblock-kt/src/main/kotlin/SponsorBlockClient.kt
+++ /dev/null
@@ -1,38 +0,0 @@
-package dev.nycode.sponsorblock
-
-import dev.nycode.sponsorblock.segments.SponsorBlockSegmentsAPI
-import io.ktor.client.*
-import io.ktor.client.call.*
-import io.ktor.client.plugins.contentnegotiation.*
-import io.ktor.client.request.*
-import io.ktor.http.*
-import io.ktor.serialization.kotlinx.json.*
-import kotlinx.serialization.json.Json
-
-public class SponsorBlockClient(
- @PublishedApi
- internal val rootUrl: String = "https://sponsor.ajay.app/api",
- httpClientBuilder: HttpClientConfig<*>.() -> Unit = {}
-) {
-
- @PublishedApi
- internal val httpClient: HttpClient = HttpClient {
- httpClientBuilder()
- expectSuccess = true
- val json = Json {
- ignoreUnknownKeys = true
- }
- install(ContentNegotiation) {
- json(json)
- }
- }
-
- @PublishedApi
- internal suspend inline fun request(vararg path: String, builder: HttpRequestBuilder.() -> Unit): T {
- val url = URLBuilder(rootUrl).appendPathSegments(*path).build()
- return httpClient.request(url, builder).body()
- }
-
- public val segments: SponsorBlockSegmentsAPI
- get() = SponsorBlockSegmentsAPI(this)
-}
diff --git a/clients/sponsorblock-kt/src/main/kotlin/model/ActionType.kt b/clients/sponsorblock-kt/src/main/kotlin/model/ActionType.kt
deleted file mode 100644
index 1168d1a8e..000000000
--- a/clients/sponsorblock-kt/src/main/kotlin/model/ActionType.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package dev.nycode.sponsorblock.model
-
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
-
-@Serializable
-public enum class ActionType {
- @SerialName("skip")
- SKIP,
-
- @SerialName("mute")
- MUTE
-}
diff --git a/clients/sponsorblock-kt/src/main/kotlin/model/Category.kt b/clients/sponsorblock-kt/src/main/kotlin/model/Category.kt
deleted file mode 100644
index 3a4cae3c8..000000000
--- a/clients/sponsorblock-kt/src/main/kotlin/model/Category.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-package dev.nycode.sponsorblock.model
-
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
-
-@Serializable
-public enum class Category(private val stringValue: String) {
- @SerialName("sponsor")
- SPONSOR("sponsor"),
-
- @SerialName("selfpromo")
- SELF_PROMO("selfpromo"),
-
- @SerialName("interaction")
- INTERACTION("interaction"),
-
- @SerialName("intro")
- INTRO("intro"),
-
- @SerialName("outro")
- OUTRO("outro"),
-
- @SerialName("preview")
- PREVIEW("preview"),
-
- @SerialName("music_offtopic")
- MUSIC_OFF_TOPIC("music_offtopic");
-
- override fun toString(): String {
- return stringValue
- }
-}
diff --git a/clients/sponsorblock-kt/src/main/kotlin/model/PrivacySkipSegment.kt b/clients/sponsorblock-kt/src/main/kotlin/model/PrivacySkipSegment.kt
deleted file mode 100644
index 99d08ce24..000000000
--- a/clients/sponsorblock-kt/src/main/kotlin/model/PrivacySkipSegment.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package dev.nycode.sponsorblock.model
-
-import kotlinx.serialization.Serializable
-
-@Serializable
-public data class PrivacySkipSegment(
- val videoId: String,
- val hash: String,
- val segments: List
-)
diff --git a/clients/sponsorblock-kt/src/main/kotlin/model/Service.kt b/clients/sponsorblock-kt/src/main/kotlin/model/Service.kt
deleted file mode 100644
index c01e47ff9..000000000
--- a/clients/sponsorblock-kt/src/main/kotlin/model/Service.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package dev.nycode.sponsorblock.model
-
-public enum class Service {
- YOUTUBE
-}
diff --git a/clients/sponsorblock-kt/src/main/kotlin/model/SkipSegment.kt b/clients/sponsorblock-kt/src/main/kotlin/model/SkipSegment.kt
deleted file mode 100644
index 08580c5e6..000000000
--- a/clients/sponsorblock-kt/src/main/kotlin/model/SkipSegment.kt
+++ /dev/null
@@ -1,21 +0,0 @@
-package dev.nycode.sponsorblock.model
-
-import dev.nycode.sponsorblock.serialization.DurationSecondsSerializer
-import dev.nycode.sponsorblock.serialization.VideoDurationSerializer
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
-import kotlin.time.Duration
-
-public typealias VideoSegment = Pair
-
-@Serializable
-public data class SkipSegment(
- @Serializable(with = VideoDurationSerializer::class)
- val segment: VideoSegment,
- @SerialName("UUID")
- val uuid: String,
- val category: Category,
- @Serializable(with = DurationSecondsSerializer::class)
- val videoDuration: Duration,
- val actionType: String
-)
diff --git a/clients/sponsorblock-kt/src/main/kotlin/model/UserInfo.kt b/clients/sponsorblock-kt/src/main/kotlin/model/UserInfo.kt
deleted file mode 100644
index a552034c2..000000000
--- a/clients/sponsorblock-kt/src/main/kotlin/model/UserInfo.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-package dev.nycode.sponsorblock.model
-
-import dev.nycode.sponsorblock.serialization.DurationMinutesSerializer
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
-import kotlin.time.Duration
-
-@Serializable
-public data class UserInfo(
- @SerialName("userID")
- val userId: String,
- @SerialName("userName")
- val username: String,
- @Serializable(with = DurationMinutesSerializer::class)
- val savedTime: Duration,
- val segmentCount: Int,
- val ignoredSegmentCount: Int,
- val viewCount: Int,
- val ignoredViewCount: Int,
- val warnings: Int,
- val warningReason: String,
- val reputation: Double,
- @SerialName("vip")
- val isVip: Boolean,
- val lastSegmentId: String?
-)
diff --git a/clients/sponsorblock-kt/src/main/kotlin/model/VoteType.kt b/clients/sponsorblock-kt/src/main/kotlin/model/VoteType.kt
deleted file mode 100644
index fec617e09..000000000
--- a/clients/sponsorblock-kt/src/main/kotlin/model/VoteType.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-package dev.nycode.sponsorblock.model
-
-import kotlinx.serialization.KSerializer
-import kotlinx.serialization.Serializable
-import kotlinx.serialization.descriptors.PrimitiveKind
-import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
-import kotlinx.serialization.descriptors.SerialDescriptor
-import kotlinx.serialization.encoding.Decoder
-import kotlinx.serialization.encoding.Encoder
-
-@Serializable(with = VoteType.Serializer::class)
-public enum class VoteType(public val num: Int) {
- DOWN_VOTE(0),
- UP_VOTE(1),
- UNDO_VOTE(20);
-
- internal object Serializer : KSerializer {
- override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("VoteType", PrimitiveKind.INT)
-
- override fun deserialize(decoder: Decoder): VoteType {
- val num = decoder.decodeInt()
- return values().first { it.num == num }
- }
-
- override fun serialize(encoder: Encoder, value: VoteType) {
- encoder.encodeInt(value.num)
- }
- }
-
-}
diff --git a/clients/sponsorblock-kt/src/main/kotlin/request/CategoryVoteRequestBuilder.kt b/clients/sponsorblock-kt/src/main/kotlin/request/CategoryVoteRequestBuilder.kt
deleted file mode 100644
index 45287ef45..000000000
--- a/clients/sponsorblock-kt/src/main/kotlin/request/CategoryVoteRequestBuilder.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-package dev.nycode.sponsorblock.request
-
-import dev.nycode.sponsorblock.model.Category
-import io.ktor.client.request.*
-import kotlinx.serialization.encodeToString
-import kotlinx.serialization.json.Json
-
-public class CategoryVoteRequestBuilder(
- public val uuid: String,
- public val userId: String,
- public val category: Category
-) : RequestBuilder {
- override fun HttpRequestBuilder.applyRequestBuilder() {
- parameter("UUID", uuid)
- parameter("userID", userId)
- parameter("category", Json.encodeToString(category))
- }
-}
diff --git a/clients/sponsorblock-kt/src/main/kotlin/request/CreateSegmentsRequestBuilder.kt b/clients/sponsorblock-kt/src/main/kotlin/request/CreateSegmentsRequestBuilder.kt
deleted file mode 100644
index ae9c65fb6..000000000
--- a/clients/sponsorblock-kt/src/main/kotlin/request/CreateSegmentsRequestBuilder.kt
+++ /dev/null
@@ -1,37 +0,0 @@
-package dev.nycode.sponsorblock.request
-
-import dev.nycode.sponsorblock.model.ActionType
-import dev.nycode.sponsorblock.model.Category
-import dev.nycode.sponsorblock.model.Service
-import dev.nycode.sponsorblock.model.VideoSegment
-import dev.nycode.sponsorblock.serialization.DurationSecondsSerializer
-import dev.nycode.sponsorblock.serialization.VideoDurationSerializer
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
-import kotlin.time.Duration
-
-@Serializable
-public class CreateSegmentsRequestBuilder(
- @SerialName("videoID")
- public val videoId: String,
- @SerialName("userID")
- public val userId: String,
- public val userAgent: String,
- public val service: Service? = null,
- @Serializable(with = DurationSecondsSerializer::class)
- public val videoDuration: Duration? = null,
- @PublishedApi
- internal val segments: MutableList = mutableListOf()
-) {
- public inline fun segment(segment: VideoSegment, category: Category, builder: SegmentBuilder.() -> Unit) {
- segments.add(SegmentBuilder(segment, category).apply(builder))
- }
-}
-
-@Serializable
-public class SegmentBuilder(
- @Serializable(with = VideoDurationSerializer::class)
- public val segment: VideoSegment,
- public val category: Category,
- public var actionType: ActionType? = null
-)
diff --git a/clients/sponsorblock-kt/src/main/kotlin/request/GetSkipSegementsRequestBuilder.kt b/clients/sponsorblock-kt/src/main/kotlin/request/GetSkipSegementsRequestBuilder.kt
deleted file mode 100644
index 97760251d..000000000
--- a/clients/sponsorblock-kt/src/main/kotlin/request/GetSkipSegementsRequestBuilder.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-package dev.nycode.sponsorblock.request
-
-import dev.nycode.sponsorblock.model.ActionType
-import dev.nycode.sponsorblock.model.Category
-import dev.nycode.sponsorblock.model.Service
-import io.ktor.client.request.*
-
-public class GetSkipSegementsRequestBuilder(
- public var categories: List = listOf(),
- public var requiredSegements: List = listOf(),
- public var actionTypes: List = listOf(),
- public var service: Service? = null
-) : RequestBuilder {
- override fun HttpRequestBuilder.applyRequestBuilder() {
- if (categories.isNotEmpty()) {
- parameter("categories", categories.joinToString(separator = ",", prefix = "[", postfix = "]") { """"$it"""" })
- }
- }
-}
diff --git a/clients/sponsorblock-kt/src/main/kotlin/request/NormalVoteRequestBuilder.kt b/clients/sponsorblock-kt/src/main/kotlin/request/NormalVoteRequestBuilder.kt
deleted file mode 100644
index c9587afa0..000000000
--- a/clients/sponsorblock-kt/src/main/kotlin/request/NormalVoteRequestBuilder.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-package dev.nycode.sponsorblock.request
-
-import dev.nycode.sponsorblock.model.VoteType
-import io.ktor.client.request.*
-
-public class NormalVoteRequestBuilder(
- public val uuid: String,
- public val userId: String,
- public val type: VoteType
-) : RequestBuilder {
- override fun HttpRequestBuilder.applyRequestBuilder() {
- parameter("UUID", uuid)
- parameter("userID", userId)
- parameter("type", type.num)
- }
-}
diff --git a/clients/sponsorblock-kt/src/main/kotlin/request/RequestBuilder.kt b/clients/sponsorblock-kt/src/main/kotlin/request/RequestBuilder.kt
deleted file mode 100644
index 7d188f2bb..000000000
--- a/clients/sponsorblock-kt/src/main/kotlin/request/RequestBuilder.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package dev.nycode.sponsorblock.request
-
-import io.ktor.client.request.*
-
-internal sealed interface RequestBuilder {
- fun HttpRequestBuilder.applyRequestBuilder()
-}
diff --git a/clients/sponsorblock-kt/src/main/kotlin/segments/SponsorBlockSegmentsAPI.kt b/clients/sponsorblock-kt/src/main/kotlin/segments/SponsorBlockSegmentsAPI.kt
deleted file mode 100644
index 1df18f616..000000000
--- a/clients/sponsorblock-kt/src/main/kotlin/segments/SponsorBlockSegmentsAPI.kt
+++ /dev/null
@@ -1,81 +0,0 @@
-package dev.nycode.sponsorblock.segments
-
-import dev.nycode.sponsorblock.SponsorBlockClient
-import dev.nycode.sponsorblock.model.*
-import dev.nycode.sponsorblock.request.CategoryVoteRequestBuilder
-import dev.nycode.sponsorblock.request.CreateSegmentsRequestBuilder
-import dev.nycode.sponsorblock.request.GetSkipSegementsRequestBuilder
-import dev.nycode.sponsorblock.request.NormalVoteRequestBuilder
-import io.ktor.client.request.*
-import io.ktor.http.*
-import kotlin.time.Duration
-
-@JvmInline
-public value class SponsorBlockSegmentsAPI(@PublishedApi internal val sponsorBlockClient: SponsorBlockClient) {
- public suspend inline fun getSkipSegments(
- videoId: String,
- builder: GetSkipSegementsRequestBuilder.() -> Unit = {}
- ): List =
- sponsorBlockClient.request("skipSegments") {
- parameter("videoID", videoId)
- GetSkipSegementsRequestBuilder().apply(builder).run {
- applyRequestBuilder()
- }
- }
-
- public suspend inline fun getSkipSegmentsByHash(
- sha256HashPrefix: String,
- builder: GetSkipSegementsRequestBuilder.() -> Unit = {}
- ): List =
- sponsorBlockClient.request("skipSegments", sha256HashPrefix) {
- with(GetSkipSegementsRequestBuilder().apply(builder)) {
- applyRequestBuilder()
- }
- }
-
- public suspend inline fun createSegments(
- videoId: String,
- userId: String,
- userAgent: String,
- service: Service? = null,
- videoDuration: Duration? = null,
- builder: CreateSegmentsRequestBuilder.() -> Unit
- ): Unit =
- sponsorBlockClient.request("skipSegments") {
- method = HttpMethod.Post
- contentType(ContentType.Application.Json)
- setBody(CreateSegmentsRequestBuilder(videoId, userId, userAgent, service, videoDuration).apply(builder))
- }
-
- public suspend inline fun normalVote(uuid: String, userId: String, voteType: VoteType): Unit =
- sponsorBlockClient.request("voteOnSponsorTime") {
- method = HttpMethod.Post
- with(NormalVoteRequestBuilder(uuid, userId, voteType)) {
- applyRequestBuilder()
- }
- }
-
- public suspend inline fun categoryVote(uuid: String, userId: String, category: Category): Unit =
- sponsorBlockClient.request("voteOnSponsorTime") {
- method = HttpMethod.Post
- with(CategoryVoteRequestBuilder(uuid, userId, category)) {
- applyRequestBuilder()
- }
- }
-
- public suspend inline fun viewedVideoSegment(uuid: String): Unit =
- sponsorBlockClient.request("viewedVideoSponsorTime") {
- method = HttpMethod.Post
- parameter("UUID", uuid)
- }
-
- public suspend inline fun getUserInfoByLocalId(userId: String): UserInfo =
- sponsorBlockClient.request("userInfo") {
- parameter("userID", userId)
- }
-
- public suspend inline fun getUserInfoByPublicId(userId: String): UserInfo =
- sponsorBlockClient.request("userInfo") {
- parameter("publicUserID", userId)
- }
-}
diff --git a/clients/sponsorblock-kt/src/main/kotlin/serialization/DurationMinutesSerializer.kt b/clients/sponsorblock-kt/src/main/kotlin/serialization/DurationMinutesSerializer.kt
deleted file mode 100644
index 51e1f9878..000000000
--- a/clients/sponsorblock-kt/src/main/kotlin/serialization/DurationMinutesSerializer.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-package dev.nycode.sponsorblock.serialization
-
-import kotlinx.serialization.KSerializer
-import kotlinx.serialization.descriptors.PrimitiveKind
-import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
-import kotlinx.serialization.descriptors.SerialDescriptor
-import kotlinx.serialization.encoding.Decoder
-import kotlinx.serialization.encoding.Encoder
-import kotlin.time.Duration
-import kotlin.time.DurationUnit
-import kotlin.time.toDuration
-
-internal object DurationMinutesSerializer : KSerializer {
- override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("Duration", PrimitiveKind.DOUBLE)
-
- override fun deserialize(decoder: Decoder): Duration {
- return decoder.decodeDouble().toDuration(DurationUnit.MINUTES)
- }
-
- override fun serialize(encoder: Encoder, value: Duration) {
- encoder.encodeDouble(value.toDouble(DurationUnit.MINUTES))
- }
-}
diff --git a/clients/sponsorblock-kt/src/main/kotlin/serialization/DurationSecondsSerializer.kt b/clients/sponsorblock-kt/src/main/kotlin/serialization/DurationSecondsSerializer.kt
deleted file mode 100644
index 0ad6fda7e..000000000
--- a/clients/sponsorblock-kt/src/main/kotlin/serialization/DurationSecondsSerializer.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package dev.nycode.sponsorblock.serialization
-
-import kotlinx.serialization.KSerializer
-import kotlinx.serialization.descriptors.PrimitiveKind
-import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
-import kotlinx.serialization.descriptors.SerialDescriptor
-import kotlinx.serialization.encoding.Decoder
-import kotlinx.serialization.encoding.Encoder
-import kotlin.time.Duration
-import kotlin.time.DurationUnit
-import kotlin.time.toDuration
-
-internal object DurationSecondsSerializer : KSerializer {
- override val descriptor: SerialDescriptor =
- PrimitiveSerialDescriptor("SponsorBlockDuration", PrimitiveKind.DOUBLE)
-
- override fun deserialize(decoder: Decoder): Duration {
- return decoder.decodeDouble().toDuration(DurationUnit.SECONDS)
- }
-
- override fun serialize(encoder: Encoder, value: Duration) {
- encoder.encodeDouble(value.toDouble(DurationUnit.SECONDS))
- }
-}
diff --git a/clients/sponsorblock-kt/src/main/kotlin/serialization/VideoDurationSerializer.kt b/clients/sponsorblock-kt/src/main/kotlin/serialization/VideoDurationSerializer.kt
deleted file mode 100644
index 344fd6657..000000000
--- a/clients/sponsorblock-kt/src/main/kotlin/serialization/VideoDurationSerializer.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-package dev.nycode.sponsorblock.serialization
-
-import dev.nycode.sponsorblock.model.VideoSegment
-import dev.nycode.sponsorblock.util.second
-import kotlinx.serialization.ExperimentalSerializationApi
-import kotlinx.serialization.KSerializer
-import kotlinx.serialization.builtins.FloatArraySerializer
-import kotlinx.serialization.descriptors.SerialDescriptor
-import kotlinx.serialization.encoding.Decoder
-import kotlinx.serialization.encoding.Encoder
-
-internal object VideoDurationSerializer : KSerializer {
-
- private val delegateSerializer = FloatArraySerializer()
- @OptIn(ExperimentalSerializationApi::class)
- override val descriptor: SerialDescriptor = SerialDescriptor("VideoSegment", delegateSerializer.descriptor)
-
- override fun deserialize(decoder: Decoder): VideoSegment {
- val array = decoder.decodeSerializableValue(delegateSerializer)
- return array.first() to array.second()
- }
-
- override fun serialize(encoder: Encoder, value: VideoSegment) {
- encoder.encodeSerializableValue(delegateSerializer, floatArrayOf(value.first, value.second))
- }
-
-}
diff --git a/clients/sponsorblock-kt/src/main/kotlin/util/ArrayUtil.kt b/clients/sponsorblock-kt/src/main/kotlin/util/ArrayUtil.kt
deleted file mode 100644
index 7d42ef781..000000000
--- a/clients/sponsorblock-kt/src/main/kotlin/util/ArrayUtil.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-package dev.nycode.sponsorblock.util
-
-/**
- * Returns the second element.
- */
-internal fun FloatArray.second() = this[1]
diff --git a/clients/sponsorblock-kt/src/test/SponsorBlockTest.kt b/clients/sponsorblock-kt/src/test/SponsorBlockTest.kt
deleted file mode 100644
index 3d1b8e40d..000000000
--- a/clients/sponsorblock-kt/src/test/SponsorBlockTest.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-import dev.nycode.sponsorblock.SponsorBlockClient
-import kotlinx.coroutines.runBlocking
-import kotlin.test.Test
-
-internal class SponsorBlockTest {
-
- private val client = SponsorBlockClient()
-
- @Test
- fun test(): Unit = runBlocking {
- for (segment in client.segments.getSkipSegments("ZNhtLABY-j4")) {
- println("Segment starting at ${segment.segment.first} and ending at ${segment.segment.second}")
- println("Video is ${segment.videoDuration} long")
- println("Segment has category ${segment.category}")
- println("Action type is ${segment.actionType}")
- println()
- }
- }
-
-}
diff --git a/core/database-i18n/src/main/kotlin/dev/schlaubi/mikbot/core/i18n/database/settings/LanguageCommand.kt b/core/database-i18n/src/main/kotlin/dev/schlaubi/mikbot/core/i18n/database/settings/LanguageCommand.kt
index 83c345178..933a22fe4 100644
--- a/core/database-i18n/src/main/kotlin/dev/schlaubi/mikbot/core/i18n/database/settings/LanguageCommand.kt
+++ b/core/database-i18n/src/main/kotlin/dev/schlaubi/mikbot/core/i18n/database/settings/LanguageCommand.kt
@@ -16,7 +16,7 @@ private class LanguageArguments : Arguments() {
choice("German", SupportedLocales.GERMAN.toLanguageTag())
choice("Englisch", SupportedLocales.ENGLISH.toLanguageTag())
- choice("Italian", Locale("it", "IT").toLanguageTag())
+ choice("Italian", Locale.ITALIAN.toLanguageTag())
}
}
diff --git a/core/game-animator/src/main/kotlin/GameAnimatorPlugin.kt b/core/game-animator/src/main/kotlin/GameAnimatorPlugin.kt
index 3c51185a0..b32b2e048 100644
--- a/core/game-animator/src/main/kotlin/GameAnimatorPlugin.kt
+++ b/core/game-animator/src/main/kotlin/GameAnimatorPlugin.kt
@@ -7,7 +7,10 @@ import dev.kord.common.entity.ActivityType
import dev.kord.common.entity.PresenceStatus
import dev.kord.core.Kord
import dev.schlaubi.mikbot.core.game_animator.api.GameAnimatorExtensionPoint
-import dev.schlaubi.mikbot.plugin.api.*
+import dev.schlaubi.mikbot.plugin.api.Plugin
+import dev.schlaubi.mikbot.plugin.api.PluginContext
+import dev.schlaubi.mikbot.plugin.api.PluginMain
+import dev.schlaubi.mikbot.plugin.api.getExtensions
import dev.schlaubi.mikbot.plugin.api.module.MikBotModule
import dev.schlaubi.mikbot.plugin.api.util.AllShardsReadyEvent
import kotlinx.coroutines.Job
@@ -32,7 +35,7 @@ class GameAnimatorPlugin(wrapper: PluginContext) : Plugin(wrapper) {
@OptIn(ObsoleteCoroutinesApi::class)
private val ticker = ticker(30.seconds.inWholeMilliseconds, 0)
- private val extensions = pluginSystem.getExtensions()
+ private val extensions = context.pluginSystem.getExtensions()
private val games: List = Config.GAMES
private lateinit var runner: Job
diff --git a/core/gdpr/src/main/kotlin/dev/schlaubi/mikbot/core/gdpr/InfoCommand.kt b/core/gdpr/src/main/kotlin/dev/schlaubi/mikbot/core/gdpr/InfoCommand.kt
index 50f72e3de..33164018a 100644
--- a/core/gdpr/src/main/kotlin/dev/schlaubi/mikbot/core/gdpr/InfoCommand.kt
+++ b/core/gdpr/src/main/kotlin/dev/schlaubi/mikbot/core/gdpr/InfoCommand.kt
@@ -2,7 +2,7 @@ package dev.schlaubi.mikbot.core.gdpr
import com.kotlindiscord.kord.extensions.commands.CommandContext
import dev.kord.rest.builder.message.EmbedBuilder
-import dev.kord.rest.builder.message.create.embed
+import dev.kord.rest.builder.message.embed
import dev.schlaubi.mikbot.core.gdpr.api.AnonymizedData
import dev.schlaubi.mikbot.core.gdpr.api.DataPoint
import dev.schlaubi.mikbot.core.gdpr.api.PermanentlyStoredDataPoint
diff --git a/gradle.properties b/gradle.properties
index 948f5673e..d65489af8 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -4,4 +4,3 @@ kotlin.code.style=official
org.gradle.parallel=true
kotlin.mpp.stability.nowarn=true
org.gradle.caching=true
-kotlin.experimental.tryK2=true
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 02fd27cc3..fd7760646 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,14 +1,14 @@
[versions]
-kotlin = "1.9.20"
+kotlin = "2.0.0-Beta1"
kordex = "1.6.0-SNAPSHOT"
-kmongo = "4.10.0"
+kmongo = "4.11.0"
coroutines = "1.7.3"
serialization = "1.6.0"
-ktor = "2.3.5"
-kord = "0.11.1"
+ktor = "2.3.6"
+kord = "0.12.0"
jjwt = "0.11.5"
-api = "3.25.1"
-ksp = "1.9.20-1.0.13"
+api = "3.26.0"
+ksp = "2.0.0-Beta1-1.0.14"
lavakord = "feature-new-lavasrc-fields-20230814.202530-2"
[libraries]
diff --git a/music/build.gradle.kts b/music/build.gradle.kts
index d07639b05..d7a364a38 100644
--- a/music/build.gradle.kts
+++ b/music/build.gradle.kts
@@ -1,3 +1,3 @@
subprojects {
- version = "3.2.0-SNAPSHOT"
+ version = "3.3.0-SNAPSHOT"
}
diff --git a/music/commands/src/main/kotlin/dev/schlaubi/mikmusic/commands/FixCommand.kt b/music/commands/src/main/kotlin/dev/schlaubi/mikmusic/commands/FixCommand.kt
index e815056b0..9dfe3949f 100644
--- a/music/commands/src/main/kotlin/dev/schlaubi/mikmusic/commands/FixCommand.kt
+++ b/music/commands/src/main/kotlin/dev/schlaubi/mikmusic/commands/FixCommand.kt
@@ -6,7 +6,7 @@ import dev.kord.common.entity.ButtonStyle
import dev.kord.common.entity.Permission
import dev.kord.core.behavior.channel.edit
import dev.kord.core.event.interaction.GuildComponentInteractionCreateEvent
-import dev.kord.rest.builder.message.modify.actionRow
+import dev.kord.rest.builder.message.actionRow
import dev.schlaubi.lavakord.audio.Link
import dev.schlaubi.lavakord.kord.connectAudio
import dev.schlaubi.mikbot.plugin.api.util.safeGuild
@@ -158,9 +158,9 @@ private object SwitchVoiceServers : RecoveryStep {
val currentRegion = channel.rtcRegion
val availableRegions = (
- safeGuild.regions
- .map { it.id }.toList() - (currentRegion ?: "")
- )
+ safeGuild.regions
+ .map { it.id }.toList() - (currentRegion ?: "")
+ )
val fallbackRegion = availableRegions.random()
channel.edit {
diff --git a/music/commands/src/main/kotlin/dev/schlaubi/mikmusic/commands/NowPlayingCommand.kt b/music/commands/src/main/kotlin/dev/schlaubi/mikmusic/commands/NowPlayingCommand.kt
index 6f24ef9dd..7a82f1f8e 100644
--- a/music/commands/src/main/kotlin/dev/schlaubi/mikmusic/commands/NowPlayingCommand.kt
+++ b/music/commands/src/main/kotlin/dev/schlaubi/mikmusic/commands/NowPlayingCommand.kt
@@ -3,7 +3,7 @@ package dev.schlaubi.mikmusic.commands
import com.kotlindiscord.kord.extensions.commands.Arguments
import com.kotlindiscord.kord.extensions.commands.converters.impl.optionalInt
import com.kotlindiscord.kord.extensions.extensions.publicSlashCommand
-import dev.kord.rest.builder.message.create.embed
+import dev.kord.rest.builder.message.embed
import dev.schlaubi.mikmusic.checks.anyMusicPlaying
import dev.schlaubi.mikmusic.checks.musicQuizAntiCheat
import dev.schlaubi.mikmusic.core.MusicModule
diff --git a/music/commands/src/main/kotlin/dev/schlaubi/mikmusic/playlist/commands/AddCommand.kt b/music/commands/src/main/kotlin/dev/schlaubi/mikmusic/playlist/commands/AddCommand.kt
index 9d6caa0cf..12b41119e 100644
--- a/music/commands/src/main/kotlin/dev/schlaubi/mikmusic/playlist/commands/AddCommand.kt
+++ b/music/commands/src/main/kotlin/dev/schlaubi/mikmusic/playlist/commands/AddCommand.kt
@@ -2,7 +2,7 @@ package dev.schlaubi.mikmusic.playlist.commands
import com.kotlindiscord.kord.extensions.commands.application.slash.converters.impl.optionalEnumChoice
import com.kotlindiscord.kord.extensions.commands.converters.impl.defaultingBoolean
-import dev.kord.rest.builder.message.create.embed
+import dev.kord.rest.builder.message.embed
import dev.schlaubi.mikmusic.autocomplete.autoCompletedYouTubeQuery
import dev.schlaubi.mikmusic.player.queue.QueueOptions
import dev.schlaubi.mikmusic.player.queue.findTracks
diff --git a/music/player/build.gradle.kts b/music/player/build.gradle.kts
index da974d3fb..c1956cf43 100644
--- a/music/player/build.gradle.kts
+++ b/music/player/build.gradle.kts
@@ -18,8 +18,6 @@ dependencies {
// Plattform support
implementation(libs.google.apis.youtube)
- // SponsorBlock Client
- implementation(projects.clients.sponsorblockKt)
// Scheduling
implementation(libs.krontab)
diff --git a/music/player/src/main/kotlin/dev/schlaubi/mikmusic/musicchannel/MusicChannelUI.kt b/music/player/src/main/kotlin/dev/schlaubi/mikmusic/musicchannel/MusicChannelUI.kt
index bf0866e79..c6a21c7d3 100644
--- a/music/player/src/main/kotlin/dev/schlaubi/mikmusic/musicchannel/MusicChannelUI.kt
+++ b/music/player/src/main/kotlin/dev/schlaubi/mikmusic/musicchannel/MusicChannelUI.kt
@@ -11,8 +11,8 @@ import dev.kord.core.behavior.getChannelOfOrNull
import dev.kord.core.entity.Message
import dev.kord.core.entity.channel.TextChannel
import dev.kord.rest.builder.component.ActionRowBuilder
-import dev.kord.rest.builder.message.modify.actionRow
-import dev.kord.rest.builder.message.modify.embed
+import dev.kord.rest.builder.message.actionRow
+import dev.kord.rest.builder.message.embed
import dev.kord.x.emoji.DiscordEmoji
import dev.kord.x.emoji.Emojis
import dev.schlaubi.mikbot.plugin.api.util.convertToISO
diff --git a/music/player/src/main/kotlin/dev/schlaubi/mikmusic/player/queue/TrackFinder.kt b/music/player/src/main/kotlin/dev/schlaubi/mikmusic/player/queue/TrackFinder.kt
index d6b88541d..a9fbf741a 100644
--- a/music/player/src/main/kotlin/dev/schlaubi/mikmusic/player/queue/TrackFinder.kt
+++ b/music/player/src/main/kotlin/dev/schlaubi/mikmusic/player/queue/TrackFinder.kt
@@ -8,7 +8,7 @@ import com.kotlindiscord.kord.extensions.commands.application.slash.converters.i
import com.kotlindiscord.kord.extensions.commands.converters.impl.defaultingBoolean
import dev.arbjerg.lavalink.protocol.v4.Exception
import dev.arbjerg.lavalink.protocol.v4.LoadResult
-import dev.kord.rest.builder.message.create.embed
+import dev.kord.rest.builder.message.embed
import dev.schlaubi.lavakord.rest.loadItem
import dev.schlaubi.mikbot.plugin.api.util.EditableMessageSender
import dev.schlaubi.mikmusic.autocomplete.autoCompletedYouTubeQuery
@@ -55,7 +55,7 @@ abstract class QueueArguments : Arguments(), QueueOptions {
suspend fun EphemeralSlashCommandContext.queueTracks(
musicPlayer: MusicPlayer,
- search: Boolean
+ search: Boolean,
) {
return queueTracks(musicPlayer, search, arguments, {
respond {
@@ -70,9 +70,9 @@ suspend fun EphemeralSlashCommandContext.queueTracks(
suspend fun EphemeralSlashCommandContext.findTracks(
musicPlayer: MusicPlayer,
- search: Boolean
+ search: Boolean,
): QueueSearchResult?
- where T : Arguments, T : QueueOptions {
+ where T : Arguments, T : QueueOptions {
return findTracks(musicPlayer, search, arguments, {
respond {
it()
@@ -89,13 +89,14 @@ internal suspend fun CommandContext.findTracks(
search: Boolean,
arguments: QueueOptions,
respond: EditableMessageSender,
- editingPaginator: EditingPaginatorSender
+ editingPaginator: EditingPaginatorSender,
): QueueSearchResult? {
val rawQuery = arguments.query
val isUrl = urlProtocol.find(rawQuery) != null
val query = if (!isUrl) {
- val searchPrefix = if (arguments.searchProvider != null) "${arguments.searchProvider?.prefix}" else "${Config.DEFAULT_SEARCH_PROVIDER}:"
+ val searchPrefix =
+ if (arguments.searchProvider != null) "${arguments.searchProvider?.prefix}" else "${Config.DEFAULT_SEARCH_PROVIDER}:"
searchPrefix + rawQuery
} else rawQuery
@@ -104,6 +105,7 @@ internal suspend fun CommandContext.findTracks(
is LoadResult.TrackLoaded -> SingleTrack(result.data)
is LoadResult.PlaylistLoaded ->
Playlist(result.data, result.data.tracks)
+
is LoadResult.SearchResult -> {
if (search) {
searchSong(respond, editingPaginator, getUser()!!, result) ?: return null
@@ -112,10 +114,12 @@ internal suspend fun CommandContext.findTracks(
SingleTrack(foundTrack)
}
}
+
is LoadResult.NoMatches -> {
noMatches(respond)
return null
}
+
is LoadResult.LoadFailed -> {
handleError(respond, result)
return null
@@ -130,7 +134,7 @@ suspend fun CommandContext.queueTracks(
search: Boolean,
arguments: QueueOptions,
respond: EditableMessageSender,
- editingPaginator: EditingPaginatorSender
+ editingPaginator: EditingPaginatorSender,
) {
val searchResult = findTracks(musicPlayer, search, arguments, respond, editingPaginator) ?: return
@@ -176,7 +180,7 @@ private suspend fun CommandContext.noMatches(respond: EditableMessageSender) {
private suspend fun CommandContext.handleError(
respond: EditableMessageSender,
- result: LoadResult.LoadFailed
+ result: LoadResult.LoadFailed,
) {
val error = result.data
when (error.severity) {
@@ -185,6 +189,7 @@ private suspend fun CommandContext.handleError(
content = translate("music.queue.load_failed.common", arrayOf(error.message))
}
}
+
else -> {
LOG.error(FriendlyException(error.severity, error.message)) { "An error occurred whilst queueing a song" }
diff --git a/runtime/src/main/kotlin/dev/schlaubi/musicbot/core/Bot.kt b/runtime/src/main/kotlin/dev/schlaubi/musicbot/core/Bot.kt
index c79946301..4e082097c 100644
--- a/runtime/src/main/kotlin/dev/schlaubi/musicbot/core/Bot.kt
+++ b/runtime/src/main/kotlin/dev/schlaubi/musicbot/core/Bot.kt
@@ -13,7 +13,7 @@ import dev.kord.common.entity.PresenceStatus
import dev.kord.core.event.gateway.DisconnectEvent
import dev.kord.core.event.gateway.ReadyEvent
import dev.kord.core.event.gateway.ResumedEvent
-import dev.kord.rest.builder.message.create.allowedMentions
+import dev.kord.rest.builder.message.allowedMentions
import dev.schlaubi.mikbot.plugin.api.MikBotInfo
import dev.schlaubi.mikbot.plugin.api.PluginContext
import dev.schlaubi.mikbot.plugin.api.PluginSystem
diff --git a/settings.gradle.kts b/settings.gradle.kts
index a1edb57cd..52a912810 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -30,7 +30,6 @@ if (System.getenv("BUILD_PLUGIN_CI")?.toBoolean() != true) {
"music:commands",
"clients:discord-oauth",
"clients:haste-client",
- "clients:sponsorblock-kt",
"clients:image-color-client",
"clients:image-color-client-kord"
)