diff --git a/cache/admins/plagubot/src/jvmMain/kotlin/dev/inmo/tgbotapi/libraries/cache/admins/AdminsPlugin.kt b/cache/admins/plagubot/src/jvmMain/kotlin/dev/inmo/tgbotapi/libraries/cache/admins/AdminsPlugin.kt index 2eb434e..049421b 100644 --- a/cache/admins/plagubot/src/jvmMain/kotlin/dev/inmo/tgbotapi/libraries/cache/admins/AdminsPlugin.kt +++ b/cache/admins/plagubot/src/jvmMain/kotlin/dev/inmo/tgbotapi/libraries/cache/admins/AdminsPlugin.kt @@ -8,10 +8,17 @@ import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.serialization.Serializable import kotlinx.serialization.Transient +import kotlinx.serialization.json.JsonObject import org.jetbrains.exposed.sql.Database +import org.koin.core.Koin +import org.koin.core.module.Module +import org.koin.core.scope.Scope -val Map.adminsPlugin: AdminsPlugin? - get() = get("admins") as? AdminsPlugin +val Scope.adminsPlugin: AdminsPlugin? + get() = getOrNull() + +val Koin.adminsPlugin: AdminsPlugin? + get() = getOrNull() @Serializable class AdminsPlugin( @@ -35,18 +42,24 @@ class AdminsPlugin( } } - override suspend fun BehaviourContext.invoke(database: Database, params: Map) { - when (chatsSettings) { - null -> { - mutex.withLock { - val flow = databaseToAdminsCacheAPI.getOrPut(database){ MutableStateFlow(null) } - if (flow.value == null) { - flow.value = AdminsCacheAPI(database) + override fun Module.setupDI(database: Database, params: JsonObject) { + single { this@AdminsPlugin } + } + + override suspend fun BehaviourContext.setupBotPlugin(koin: Koin) { + with(koin) { + when (chatsSettings) { + null -> { + mutex.withLock { + val flow = databaseToAdminsCacheAPI.getOrPut(koin.get()){ MutableStateFlow(null) } + if (flow.value == null) { + flow.value = AdminsCacheAPI(koin.get()) + } } } - } - else -> mutex.withLock { - globalAdminsCacheAPI.value = AdminsCacheAPI(database) + else -> mutex.withLock { + globalAdminsCacheAPI.value = AdminsCacheAPI(koin.get()) + } } } } diff --git a/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/DefaultMessageContentCache.kt b/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/DefaultMessageContentCache.kt index 817cc92..9ea614e 100644 --- a/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/DefaultMessageContentCache.kt +++ b/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/DefaultMessageContentCache.kt @@ -1,15 +1,13 @@ package dev.inmo.tgbotapi.libraries.cache.media.common import dev.inmo.tgbotapi.bot.TelegramBot -import dev.inmo.tgbotapi.requests.DeleteMessage import dev.inmo.tgbotapi.requests.DownloadFileStream -import dev.inmo.tgbotapi.requests.abstracts.MultipartFile import dev.inmo.tgbotapi.requests.get.GetFile import dev.inmo.tgbotapi.requests.send.media.* import dev.inmo.tgbotapi.types.ChatId -import dev.inmo.tgbotapi.types.InputMedia.* -import dev.inmo.tgbotapi.types.message.content.abstracts.MediaContent -import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent +import dev.inmo.tgbotapi.types.media.* +import dev.inmo.tgbotapi.types.message.content.MediaContent +import dev.inmo.tgbotapi.types.message.content.MessageContent import dev.inmo.tgbotapi.utils.asInput import io.ktor.utils.io.core.Input @@ -22,8 +20,8 @@ class DefaultMessageContentCache( ), private val messagesFilesCache: MessagesFilesCache = InMemoryMessagesFilesCache() ) : MessageContentCache { - override suspend fun save(content: MessageContent): K { - return when (content) { + override suspend fun save(k: K, content: MessageContent) { + when (content) { is MediaContent -> { val extendedInfo = bot.execute( GetFile(content.media.fileId) @@ -34,31 +32,30 @@ class DefaultMessageContentCache( ) ) - save(content, extendedInfo.fileName) { + save(k, content, extendedInfo.fileName) { allocator.invoke().asInput() } } - else -> simpleMessageContentCache.add(content) + else -> simpleMessageContentCache.set(k, content) } } override suspend fun save( + k: K, content: MediaContent, filename: String, inputAllocator: suspend () -> Input - ): K { - val key = simpleMessageContentCache.add(content) + ) { + simpleMessageContentCache.set(k, content) runCatching { - messagesFilesCache.set(key, filename, inputAllocator) + messagesFilesCache.set(k, filename, inputAllocator) }.onFailure { - simpleMessageContentCache.remove(key) + simpleMessageContentCache.remove(k) }.onSuccess { with(mediaFileActualityChecker) { bot.saved(content) } } - - return key } override suspend fun get(k: K): MessageContent? { @@ -67,40 +64,30 @@ class DefaultMessageContentCache( if (savedSimpleContent is MediaContent && !with(mediaFileActualityChecker) { bot.isActual(savedSimpleContent) }) { val savedFileContentAllocator = messagesFilesCache.get(k) ?: error("Unexpected absence of $k file for content ($simpleMessageContentCache)") val newContent = bot.execute( - when (savedSimpleContent.asInputMedia()) { - is InputMediaAnimation -> SendAnimation( + when (savedSimpleContent.asTelegramMedia()) { + is TelegramMediaAnimation -> SendAnimation( filesRefreshingChatId, - MultipartFile( - savedFileContentAllocator - ), + savedFileContentAllocator, disableNotification = true ) - is InputMediaAudio -> SendAudio( + is TelegramMediaAudio -> SendAudio( filesRefreshingChatId, - MultipartFile( - savedFileContentAllocator - ), + savedFileContentAllocator, disableNotification = true ) - is InputMediaVideo -> SendVideo( + is TelegramMediaVideo -> SendVideo( filesRefreshingChatId, - MultipartFile( - savedFileContentAllocator - ), + savedFileContentAllocator, disableNotification = true ) - is InputMediaDocument -> SendDocument( + is TelegramMediaDocument -> SendDocument( filesRefreshingChatId, - MultipartFile( - savedFileContentAllocator - ), + savedFileContentAllocator, disableNotification = true ) - is InputMediaPhoto -> SendPhoto( + is TelegramMediaPhoto -> SendPhoto( filesRefreshingChatId, - MultipartFile( - savedFileContentAllocator - ), + savedFileContentAllocator, disableNotification = true ) } diff --git a/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/MediaFileActualityChecker.kt b/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/MediaFileActualityChecker.kt index a82127f..941ed37 100644 --- a/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/MediaFileActualityChecker.kt +++ b/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/MediaFileActualityChecker.kt @@ -7,7 +7,7 @@ import dev.inmo.tgbotapi.requests.DeleteMessage import dev.inmo.tgbotapi.requests.abstracts.FileId import dev.inmo.tgbotapi.types.ChatId import dev.inmo.tgbotapi.types.MilliSeconds -import dev.inmo.tgbotapi.types.message.content.abstracts.MediaContent +import dev.inmo.tgbotapi.types.message.content.MediaContent fun interface MediaFileActualityChecker { suspend fun TelegramBot.isActual(mediaContent: MediaContent): Boolean diff --git a/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/MessageContentCache.kt b/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/MessageContentCache.kt index baec180..9250c81 100644 --- a/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/MessageContentCache.kt +++ b/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/MessageContentCache.kt @@ -1,16 +1,18 @@ package dev.inmo.tgbotapi.libraries.cache.media.common -import dev.inmo.tgbotapi.types.message.content.abstracts.MediaContent -import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent +import dev.inmo.tgbotapi.types.message.content.MediaContent +import dev.inmo.tgbotapi.types.message.content.MessageContent import io.ktor.utils.io.core.Input interface MessageContentCache { - suspend fun save(content: MessageContent): K + suspend fun save(k: K, content: MessageContent) suspend fun save( + k: K, content: MediaContent, filename: String, inputAllocator: suspend () -> Input - ): K + ) + suspend fun get(k: K): MessageContent? suspend fun contains(k: K): Boolean suspend fun remove(k: K) diff --git a/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/MessagesFilesCache.kt b/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/MessagesFilesCache.kt index 796fca9..d745f57 100644 --- a/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/MessagesFilesCache.kt +++ b/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/MessagesFilesCache.kt @@ -1,13 +1,12 @@ package dev.inmo.tgbotapi.libraries.cache.media.common -import dev.inmo.tgbotapi.types.ChatId -import dev.inmo.tgbotapi.types.MessageIdentifier +import dev.inmo.tgbotapi.requests.abstracts.MultipartFile import dev.inmo.tgbotapi.utils.StorageFile import io.ktor.utils.io.core.* interface MessagesFilesCache { suspend fun set(k: K, filename: String, inputAllocator: suspend () -> Input) - suspend fun get(k: K): StorageFile? + suspend fun get(k: K): MultipartFile? suspend fun remove(k: K) suspend fun contains(k: K): Boolean } @@ -18,16 +17,18 @@ interface MessagesFilesCache { * disks-oriented one */ class InMemoryMessagesFilesCache : MessagesFilesCache { - private val map = mutableMapOf() + private val map = mutableMapOf() override suspend fun set(k: K, filename: String, inputAllocator: suspend () -> Input) { - map[k] = StorageFile( - filename, - inputAllocator().readBytes() - ) + val input = inputAllocator() + map[k] = MultipartFile( + filename + ) { + input + } } - override suspend fun get(k: K): StorageFile? { + override suspend fun get(k: K): MultipartFile? { return map[k] } diff --git a/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/MessagesSimpleCache.kt b/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/MessagesSimpleCache.kt index ffc08b1..7b23aa1 100644 --- a/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/MessagesSimpleCache.kt +++ b/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/MessagesSimpleCache.kt @@ -1,10 +1,9 @@ package dev.inmo.tgbotapi.libraries.cache.media.common -import com.benasher44.uuid.uuid4 -import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent +import dev.inmo.tgbotapi.types.message.content.MessageContent interface MessagesSimpleCache { - suspend fun add(content: MessageContent): K + suspend fun set(k: K, content: MessageContent) suspend fun update(k: K, content: MessageContent): Boolean suspend fun get(k: K): MessageContent? suspend fun remove(k: K) @@ -16,17 +15,14 @@ interface MessagesSimpleCache { * start of application creation with usage of [MessageContentCache] with aim to replace this realization by some * disks-oriented one */ -class InMemoryMessagesSimpleCache( - private val keyGenerator: () -> K -) : MessagesSimpleCache { +class InMemoryMessagesSimpleCache : MessagesSimpleCache { private val map = mutableMapOf() - override suspend fun add( + override suspend fun set( + k: K, content: MessageContent - ): K { - val key = keyGenerator() - map[key] = content - return key + ) { + map[k] = content } override suspend fun update( @@ -54,10 +50,4 @@ class InMemoryMessagesSimpleCache( override suspend fun contains(k: K): Boolean { return map.contains(k) } - - companion object { - operator fun invoke() = InMemoryMessagesSimpleCache { - uuid4().toString() - } - } } diff --git a/cache/content/common/src/jvmMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/InFilesMessagesFilesCache.kt b/cache/content/common/src/jvmMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/InFilesMessagesFilesCache.kt index 53aed1c..04f01dc 100644 --- a/cache/content/common/src/jvmMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/InFilesMessagesFilesCache.kt +++ b/cache/content/common/src/jvmMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/InFilesMessagesFilesCache.kt @@ -1,6 +1,6 @@ package dev.inmo.tgbotapi.libraries.cache.media.common -import dev.inmo.tgbotapi.utils.* +import dev.inmo.tgbotapi.requests.abstracts.MultipartFile import io.ktor.utils.io.core.Input import io.ktor.utils.io.core.copyTo import io.ktor.utils.io.streams.asInput @@ -11,16 +11,14 @@ class InFilesMessagesFilesCache( private val folderFile: File, private val filePrefixBuilder: (K) -> String ) : MessagesFilesCache { - private val K.storageFile: StorageFile? + private val K.multipartFile: MultipartFile? get() { val prefix = filePrefix(this) val filename = folderFile.list() ?.firstOrNull { it.startsWith(prefix) } ?: return null val file = File(folderFile, filename) val storageFileFilename = file.name.removePrefix("$prefix ") - return StorageFile( - StorageFileInfo(storageFileFilename) - ) { + return MultipartFile(storageFileFilename) { file.inputStream().asInput() } } @@ -48,8 +46,8 @@ class InFilesMessagesFilesCache( } } - override suspend fun get(k: K): StorageFile? { - return k.storageFile + override suspend fun get(k: K): MultipartFile? { + return k.multipartFile } override suspend fun remove(k: K) { diff --git a/cache/content/micro_utils/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/micro_utils/SimpleKeyValueMessageContentCache.kt b/cache/content/micro_utils/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/micro_utils/SimpleKeyValueMessageContentCache.kt index e77a7db..d259277 100644 --- a/cache/content/micro_utils/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/micro_utils/SimpleKeyValueMessageContentCache.kt +++ b/cache/content/micro_utils/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/micro_utils/SimpleKeyValueMessageContentCache.kt @@ -1,12 +1,11 @@ package dev.inmo.tgbotapi.libraries.cache.media.micro_utils -import com.benasher44.uuid.uuid4 import dev.inmo.micro_utils.repos.* import dev.inmo.micro_utils.repos.mappers.withMapper import dev.inmo.tgbotapi.libraries.cache.media.common.MessagesSimpleCache import dev.inmo.tgbotapi.types.ChatId import dev.inmo.tgbotapi.types.MessageIdentifier -import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent +import dev.inmo.tgbotapi.types.message.content.MessageContent import kotlinx.serialization.* import kotlinx.serialization.builtins.PairSerializer import kotlinx.serialization.builtins.serializer @@ -16,14 +15,10 @@ import kotlin.js.JsName import kotlin.jvm.JvmName class SimpleKeyValueMessageContentCache( - private val keyValueRepo: KeyValueRepo, - private val keyGenerator: () -> K + private val keyValueRepo: KeyValueRepo ) : MessagesSimpleCache { - override suspend fun add(content: MessageContent): K { - val key = keyGenerator() - keyValueRepo.set(key, content) - - return key + override suspend fun set(k: K, content: MessageContent) { + keyValueRepo.set(k, content) } override suspend fun update(k: K, content: MessageContent): Boolean { @@ -48,12 +43,6 @@ class SimpleKeyValueMessageContentCache( override suspend fun remove(k: K) { keyValueRepo.unset(k) } - - companion object { - operator fun invoke( - keyValueRepo: KeyValueRepo - ) = SimpleKeyValueMessageContentCache(keyValueRepo) { uuid4().toString() } - } } val chatIdToMessageIdentifierSerializer = PairSerializer(