mirror of
				https://github.com/InsanusMokrassar/TelegramBotApiLibraries.git
				synced 2025-10-30 03:30:08 +00:00 
			
		
		
		
	Compare commits
	
		
			8 Commits
		
	
	
		
			5cb7d30431
			...
			0.2.0
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 866b016e08 | |||
| b67212ec0b | |||
| dc83bbc9aa | |||
| 14b56c659b | |||
| 99218de932 | |||
| ce14a78e09 | |||
| 827d9b43f7 | |||
| 6aaa801fe0 | 
| @@ -2,7 +2,7 @@ package dev.inmo.tgbotapi.libraries.cache.admins | |||||||
|  |  | ||||||
| import dev.inmo.tgbotapi.extensions.utils.asGroupContentMessage | import dev.inmo.tgbotapi.extensions.utils.asGroupContentMessage | ||||||
| import dev.inmo.tgbotapi.types.* | import dev.inmo.tgbotapi.types.* | ||||||
| import dev.inmo.tgbotapi.types.ChatMember.abstracts.AdministratorChatMember | import dev.inmo.tgbotapi.types.chat.member.AdministratorChatMember | ||||||
| import dev.inmo.tgbotapi.types.message.abstracts.GroupContentMessage | import dev.inmo.tgbotapi.types.message.abstracts.GroupContentMessage | ||||||
| import dev.inmo.tgbotapi.types.message.abstracts.Message | import dev.inmo.tgbotapi.types.message.abstracts.Message | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,7 +5,8 @@ import dev.inmo.tgbotapi.bot.TelegramBot | |||||||
| import dev.inmo.tgbotapi.extensions.api.bot.getMe | import dev.inmo.tgbotapi.extensions.api.bot.getMe | ||||||
| import dev.inmo.tgbotapi.extensions.api.chat.get.getChatAdministrators | import dev.inmo.tgbotapi.extensions.api.chat.get.getChatAdministrators | ||||||
| import dev.inmo.tgbotapi.types.* | import dev.inmo.tgbotapi.types.* | ||||||
| import dev.inmo.tgbotapi.types.ChatMember.abstracts.AdministratorChatMember | import dev.inmo.tgbotapi.types.chat.ExtendedBot | ||||||
|  | import dev.inmo.tgbotapi.types.chat.member.AdministratorChatMember | ||||||
| import dev.inmo.tgbotapi.types.message.abstracts.* | import dev.inmo.tgbotapi.types.message.abstracts.* | ||||||
| import kotlinx.serialization.Serializable | import kotlinx.serialization.Serializable | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ import dev.inmo.micro_utils.coroutines.safelyWithoutExceptions | |||||||
| import dev.inmo.micro_utils.repos.* | import dev.inmo.micro_utils.repos.* | ||||||
| import dev.inmo.tgbotapi.libraries.cache.admins.DefaultAdminsCacheAPIRepo | import dev.inmo.tgbotapi.libraries.cache.admins.DefaultAdminsCacheAPIRepo | ||||||
| import dev.inmo.tgbotapi.types.* | import dev.inmo.tgbotapi.types.* | ||||||
| import dev.inmo.tgbotapi.types.ChatMember.abstracts.AdministratorChatMember | import dev.inmo.tgbotapi.types.chat.member.AdministratorChatMember | ||||||
| import kotlinx.coroutines.CoroutineScope | import kotlinx.coroutines.CoroutineScope | ||||||
| import kotlinx.coroutines.channels.Channel | import kotlinx.coroutines.channels.Channel | ||||||
| import kotlin.coroutines.* | import kotlin.coroutines.* | ||||||
|   | |||||||
| @@ -8,9 +8,7 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext | |||||||
| import dev.inmo.tgbotapi.libraries.cache.admins.micro_utils.DefaultAdminsCacheAPIRepo | import dev.inmo.tgbotapi.libraries.cache.admins.micro_utils.DefaultAdminsCacheAPIRepo | ||||||
| import dev.inmo.tgbotapi.libraries.cache.admins.micro_utils.DynamicAdminsCacheSettingsAPI | import dev.inmo.tgbotapi.libraries.cache.admins.micro_utils.DynamicAdminsCacheSettingsAPI | ||||||
| import dev.inmo.tgbotapi.types.* | import dev.inmo.tgbotapi.types.* | ||||||
| import dev.inmo.tgbotapi.types.ChatMember.AdministratorChatMemberImpl | import dev.inmo.tgbotapi.types.chat.member.* | ||||||
| import dev.inmo.tgbotapi.types.ChatMember.CreatorChatMember |  | ||||||
| import dev.inmo.tgbotapi.types.ChatMember.abstracts.AdministratorChatMember |  | ||||||
| import kotlinx.coroutines.CoroutineScope | import kotlinx.coroutines.CoroutineScope | ||||||
| import kotlinx.serialization.* | import kotlinx.serialization.* | ||||||
| import kotlinx.serialization.cbor.Cbor | import kotlinx.serialization.cbor.Cbor | ||||||
|   | |||||||
| @@ -8,10 +8,17 @@ import kotlinx.coroutines.sync.Mutex | |||||||
| import kotlinx.coroutines.sync.withLock | import kotlinx.coroutines.sync.withLock | ||||||
| import kotlinx.serialization.Serializable | import kotlinx.serialization.Serializable | ||||||
| import kotlinx.serialization.Transient | import kotlinx.serialization.Transient | ||||||
|  | import kotlinx.serialization.json.JsonObject | ||||||
| import org.jetbrains.exposed.sql.Database | 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<String, Any>.adminsPlugin: AdminsPlugin? | val Scope.adminsPlugin: AdminsPlugin? | ||||||
|     get() = get("admins") as? AdminsPlugin |     get() = getOrNull() | ||||||
|  |  | ||||||
|  | val Koin.adminsPlugin: AdminsPlugin? | ||||||
|  |     get() = getOrNull() | ||||||
|  |  | ||||||
| @Serializable | @Serializable | ||||||
| class AdminsPlugin( | class AdminsPlugin( | ||||||
| @@ -35,18 +42,24 @@ class AdminsPlugin( | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     override suspend fun BehaviourContext.invoke(database: Database, params: Map<String, Any>) { |     override fun Module.setupDI(database: Database, params: JsonObject) { | ||||||
|  |         single { this@AdminsPlugin } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     override suspend fun BehaviourContext.setupBotPlugin(koin: Koin) { | ||||||
|  |         with(koin) { | ||||||
|             when (chatsSettings) { |             when (chatsSettings) { | ||||||
|                 null -> { |                 null -> { | ||||||
|                     mutex.withLock { |                     mutex.withLock { | ||||||
|                     val flow = databaseToAdminsCacheAPI.getOrPut(database){ MutableStateFlow(null) } |                         val flow = databaseToAdminsCacheAPI.getOrPut(koin.get()){ MutableStateFlow(null) } | ||||||
|                         if (flow.value == null) { |                         if (flow.value == null) { | ||||||
|                         flow.value = AdminsCacheAPI(database) |                             flow.value = AdminsCacheAPI(koin.get()) | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 else -> mutex.withLock { |                 else -> mutex.withLock { | ||||||
|                 globalAdminsCacheAPI.value = AdminsCacheAPI(database) |                     globalAdminsCacheAPI.value = AdminsCacheAPI(koin.get()) | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,15 +1,13 @@ | |||||||
| package dev.inmo.tgbotapi.libraries.cache.media.common | package dev.inmo.tgbotapi.libraries.cache.media.common | ||||||
|  |  | ||||||
| import dev.inmo.tgbotapi.bot.TelegramBot | import dev.inmo.tgbotapi.bot.TelegramBot | ||||||
| import dev.inmo.tgbotapi.requests.DeleteMessage |  | ||||||
| import dev.inmo.tgbotapi.requests.DownloadFileStream | 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.get.GetFile | ||||||
| import dev.inmo.tgbotapi.requests.send.media.* | import dev.inmo.tgbotapi.requests.send.media.* | ||||||
| import dev.inmo.tgbotapi.types.ChatId | import dev.inmo.tgbotapi.types.ChatId | ||||||
| import dev.inmo.tgbotapi.types.InputMedia.* | import dev.inmo.tgbotapi.types.media.* | ||||||
| import dev.inmo.tgbotapi.types.message.content.abstracts.MediaContent | import dev.inmo.tgbotapi.types.message.content.MediaContent | ||||||
| import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent | import dev.inmo.tgbotapi.types.message.content.MessageContent | ||||||
| import dev.inmo.tgbotapi.utils.asInput | import dev.inmo.tgbotapi.utils.asInput | ||||||
| import io.ktor.utils.io.core.Input | import io.ktor.utils.io.core.Input | ||||||
|  |  | ||||||
| @@ -22,8 +20,8 @@ class DefaultMessageContentCache<K>( | |||||||
|     ), |     ), | ||||||
|     private val messagesFilesCache: MessagesFilesCache<K> = InMemoryMessagesFilesCache() |     private val messagesFilesCache: MessagesFilesCache<K> = InMemoryMessagesFilesCache() | ||||||
| ) : MessageContentCache<K> { | ) : MessageContentCache<K> { | ||||||
|     override suspend fun save(content: MessageContent): K { |     override suspend fun save(k: K, content: MessageContent) { | ||||||
|         return when (content) { |         when (content) { | ||||||
|             is MediaContent -> { |             is MediaContent -> { | ||||||
|                 val extendedInfo = bot.execute( |                 val extendedInfo = bot.execute( | ||||||
|                     GetFile(content.media.fileId) |                     GetFile(content.media.fileId) | ||||||
| @@ -34,31 +32,30 @@ class DefaultMessageContentCache<K>( | |||||||
|                     ) |                     ) | ||||||
|                 ) |                 ) | ||||||
|  |  | ||||||
|                 save(content, extendedInfo.fileName) { |                 save(k, content, extendedInfo.fileName) { | ||||||
|                     allocator.invoke().asInput() |                     allocator.invoke().asInput() | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             else -> simpleMessageContentCache.add(content) |             else -> simpleMessageContentCache.set(k, content) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     override suspend fun save( |     override suspend fun save( | ||||||
|  |         k: K, | ||||||
|         content: MediaContent, |         content: MediaContent, | ||||||
|         filename: String, |         filename: String, | ||||||
|         inputAllocator: suspend () -> Input |         inputAllocator: suspend () -> Input | ||||||
|     ): K { |     ) { | ||||||
|         val key = simpleMessageContentCache.add(content) |         simpleMessageContentCache.set(k, content) | ||||||
|         runCatching { |         runCatching { | ||||||
|             messagesFilesCache.set(key, filename, inputAllocator) |             messagesFilesCache.set(k, filename, inputAllocator) | ||||||
|         }.onFailure { |         }.onFailure { | ||||||
|             simpleMessageContentCache.remove(key) |             simpleMessageContentCache.remove(k) | ||||||
|         }.onSuccess { |         }.onSuccess { | ||||||
|             with(mediaFileActualityChecker) { |             with(mediaFileActualityChecker) { | ||||||
|                 bot.saved(content) |                 bot.saved(content) | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return key |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     override suspend fun get(k: K): MessageContent? { |     override suspend fun get(k: K): MessageContent? { | ||||||
| @@ -67,40 +64,30 @@ class DefaultMessageContentCache<K>( | |||||||
|         if (savedSimpleContent is MediaContent && !with(mediaFileActualityChecker) { bot.isActual(savedSimpleContent) }) { |         if (savedSimpleContent is MediaContent && !with(mediaFileActualityChecker) { bot.isActual(savedSimpleContent) }) { | ||||||
|             val savedFileContentAllocator = messagesFilesCache.get(k) ?: error("Unexpected absence of $k file for content ($simpleMessageContentCache)") |             val savedFileContentAllocator = messagesFilesCache.get(k) ?: error("Unexpected absence of $k file for content ($simpleMessageContentCache)") | ||||||
|             val newContent = bot.execute( |             val newContent = bot.execute( | ||||||
|                 when (savedSimpleContent.asInputMedia()) { |                 when (savedSimpleContent.asTelegramMedia()) { | ||||||
|                     is InputMediaAnimation -> SendAnimation( |                     is TelegramMediaAnimation -> SendAnimation( | ||||||
|                         filesRefreshingChatId, |                         filesRefreshingChatId, | ||||||
|                         MultipartFile( |                         savedFileContentAllocator, | ||||||
|                             savedFileContentAllocator |  | ||||||
|                         ), |  | ||||||
|                         disableNotification = true |                         disableNotification = true | ||||||
|                     ) |                     ) | ||||||
|                     is InputMediaAudio -> SendAudio( |                     is TelegramMediaAudio -> SendAudio( | ||||||
|                         filesRefreshingChatId, |                         filesRefreshingChatId, | ||||||
|                         MultipartFile( |                         savedFileContentAllocator, | ||||||
|                             savedFileContentAllocator |  | ||||||
|                         ), |  | ||||||
|                         disableNotification = true |                         disableNotification = true | ||||||
|                     ) |                     ) | ||||||
|                     is InputMediaVideo -> SendVideo( |                     is TelegramMediaVideo -> SendVideo( | ||||||
|                         filesRefreshingChatId, |                         filesRefreshingChatId, | ||||||
|                         MultipartFile( |                         savedFileContentAllocator, | ||||||
|                             savedFileContentAllocator |  | ||||||
|                         ), |  | ||||||
|                         disableNotification = true |                         disableNotification = true | ||||||
|                     ) |                     ) | ||||||
|                     is InputMediaDocument -> SendDocument( |                     is TelegramMediaDocument -> SendDocument( | ||||||
|                         filesRefreshingChatId, |                         filesRefreshingChatId, | ||||||
|                         MultipartFile( |                         savedFileContentAllocator, | ||||||
|                             savedFileContentAllocator |  | ||||||
|                         ), |  | ||||||
|                         disableNotification = true |                         disableNotification = true | ||||||
|                     ) |                     ) | ||||||
|                     is InputMediaPhoto -> SendPhoto( |                     is TelegramMediaPhoto -> SendPhoto( | ||||||
|                         filesRefreshingChatId, |                         filesRefreshingChatId, | ||||||
|                         MultipartFile( |                         savedFileContentAllocator, | ||||||
|                             savedFileContentAllocator |  | ||||||
|                         ), |  | ||||||
|                         disableNotification = true |                         disableNotification = true | ||||||
|                     ) |                     ) | ||||||
|                 } |                 } | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ import dev.inmo.tgbotapi.requests.DeleteMessage | |||||||
| import dev.inmo.tgbotapi.requests.abstracts.FileId | import dev.inmo.tgbotapi.requests.abstracts.FileId | ||||||
| import dev.inmo.tgbotapi.types.ChatId | import dev.inmo.tgbotapi.types.ChatId | ||||||
| import dev.inmo.tgbotapi.types.MilliSeconds | 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 { | fun interface MediaFileActualityChecker { | ||||||
|     suspend fun TelegramBot.isActual(mediaContent: MediaContent): Boolean |     suspend fun TelegramBot.isActual(mediaContent: MediaContent): Boolean | ||||||
|   | |||||||
| @@ -1,16 +1,18 @@ | |||||||
| package dev.inmo.tgbotapi.libraries.cache.media.common | package dev.inmo.tgbotapi.libraries.cache.media.common | ||||||
|  |  | ||||||
| import dev.inmo.tgbotapi.types.message.content.abstracts.MediaContent | import dev.inmo.tgbotapi.types.message.content.MediaContent | ||||||
| import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent | import dev.inmo.tgbotapi.types.message.content.MessageContent | ||||||
| import io.ktor.utils.io.core.Input | import io.ktor.utils.io.core.Input | ||||||
|  |  | ||||||
| interface MessageContentCache<K> { | interface MessageContentCache<K> { | ||||||
|     suspend fun save(content: MessageContent): K |     suspend fun save(k: K, content: MessageContent) | ||||||
|     suspend fun save( |     suspend fun save( | ||||||
|  |         k: K, | ||||||
|         content: MediaContent, |         content: MediaContent, | ||||||
|         filename: String, |         filename: String, | ||||||
|         inputAllocator: suspend () -> Input |         inputAllocator: suspend () -> Input | ||||||
|     ): K |     ) | ||||||
|  |  | ||||||
|     suspend fun get(k: K): MessageContent? |     suspend fun get(k: K): MessageContent? | ||||||
|     suspend fun contains(k: K): Boolean |     suspend fun contains(k: K): Boolean | ||||||
|     suspend fun remove(k: K) |     suspend fun remove(k: K) | ||||||
|   | |||||||
| @@ -1,13 +1,11 @@ | |||||||
| package dev.inmo.tgbotapi.libraries.cache.media.common | package dev.inmo.tgbotapi.libraries.cache.media.common | ||||||
|  |  | ||||||
| import dev.inmo.tgbotapi.types.ChatId | import dev.inmo.tgbotapi.requests.abstracts.MultipartFile | ||||||
| import dev.inmo.tgbotapi.types.MessageIdentifier |  | ||||||
| import dev.inmo.tgbotapi.utils.StorageFile |  | ||||||
| import io.ktor.utils.io.core.* | import io.ktor.utils.io.core.* | ||||||
|  |  | ||||||
| interface MessagesFilesCache<K> { | interface MessagesFilesCache<K> { | ||||||
|     suspend fun set(k: K, filename: String, inputAllocator: suspend () -> Input) |     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 remove(k: K) | ||||||
|     suspend fun contains(k: K): Boolean |     suspend fun contains(k: K): Boolean | ||||||
| } | } | ||||||
| @@ -18,16 +16,18 @@ interface MessagesFilesCache<K> { | |||||||
|  * disks-oriented one |  * disks-oriented one | ||||||
|  */ |  */ | ||||||
| class InMemoryMessagesFilesCache<K> : MessagesFilesCache<K> { | class InMemoryMessagesFilesCache<K> : MessagesFilesCache<K> { | ||||||
|     private val map = mutableMapOf<K, StorageFile>() |     private val map = mutableMapOf<K, MultipartFile>() | ||||||
|  |  | ||||||
|     override suspend fun set(k: K, filename: String, inputAllocator: suspend () -> Input) { |     override suspend fun set(k: K, filename: String, inputAllocator: suspend () -> Input) { | ||||||
|         map[k] = StorageFile( |         val input = inputAllocator() | ||||||
|             filename, |         map[k] = MultipartFile( | ||||||
|             inputAllocator().readBytes() |             filename | ||||||
|         ) |         ) { | ||||||
|  |             input | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     override suspend fun get(k: K): StorageFile? { |     override suspend fun get(k: K): MultipartFile? { | ||||||
|         return map[k] |         return map[k] | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,10 +1,9 @@ | |||||||
| package dev.inmo.tgbotapi.libraries.cache.media.common | package dev.inmo.tgbotapi.libraries.cache.media.common | ||||||
|  |  | ||||||
| import com.benasher44.uuid.uuid4 | import dev.inmo.tgbotapi.types.message.content.MessageContent | ||||||
| import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent |  | ||||||
|  |  | ||||||
| interface MessagesSimpleCache<K> { | interface MessagesSimpleCache<K> { | ||||||
|     suspend fun add(content: MessageContent): K |     suspend fun set(k: K, content: MessageContent) | ||||||
|     suspend fun update(k: K, content: MessageContent): Boolean |     suspend fun update(k: K, content: MessageContent): Boolean | ||||||
|     suspend fun get(k: K): MessageContent? |     suspend fun get(k: K): MessageContent? | ||||||
|     suspend fun remove(k: K) |     suspend fun remove(k: K) | ||||||
| @@ -16,17 +15,14 @@ interface MessagesSimpleCache<K> { | |||||||
|  * start of application creation with usage of [MessageContentCache] with aim to replace this realization by some |  * start of application creation with usage of [MessageContentCache] with aim to replace this realization by some | ||||||
|  * disks-oriented one |  * disks-oriented one | ||||||
|  */ |  */ | ||||||
| class InMemoryMessagesSimpleCache<K>( | class InMemoryMessagesSimpleCache<K> : MessagesSimpleCache<K> { | ||||||
|     private val keyGenerator: () -> K |  | ||||||
| ) : MessagesSimpleCache<K> { |  | ||||||
|     private val map = mutableMapOf<K, MessageContent>() |     private val map = mutableMapOf<K, MessageContent>() | ||||||
|  |  | ||||||
|     override suspend fun add( |     override suspend fun set( | ||||||
|  |         k: K, | ||||||
|         content: MessageContent |         content: MessageContent | ||||||
|     ): K { |     ) { | ||||||
|         val key = keyGenerator() |         map[k] = content | ||||||
|         map[key] = content |  | ||||||
|         return key |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     override suspend fun update( |     override suspend fun update( | ||||||
| @@ -54,10 +50,4 @@ class InMemoryMessagesSimpleCache<K>( | |||||||
|     override suspend fun contains(k: K): Boolean { |     override suspend fun contains(k: K): Boolean { | ||||||
|         return map.contains(k) |         return map.contains(k) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     companion object { |  | ||||||
|         operator fun invoke() = InMemoryMessagesSimpleCache { |  | ||||||
|             uuid4().toString() |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| package dev.inmo.tgbotapi.libraries.cache.media.common | 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.Input | ||||||
| import io.ktor.utils.io.core.copyTo | import io.ktor.utils.io.core.copyTo | ||||||
| import io.ktor.utils.io.streams.asInput | import io.ktor.utils.io.streams.asInput | ||||||
| @@ -11,16 +11,14 @@ class InFilesMessagesFilesCache<K>( | |||||||
|     private val folderFile: File, |     private val folderFile: File, | ||||||
|     private val filePrefixBuilder: (K) -> String |     private val filePrefixBuilder: (K) -> String | ||||||
| ) : MessagesFilesCache<K> { | ) : MessagesFilesCache<K> { | ||||||
|     private val K.storageFile: StorageFile? |     private val K.multipartFile: MultipartFile? | ||||||
|         get() { |         get() { | ||||||
|             val prefix = filePrefix(this) |             val prefix = filePrefix(this) | ||||||
|             val filename = folderFile.list() ?.firstOrNull { it.startsWith(prefix) } ?: return null |             val filename = folderFile.list() ?.firstOrNull { it.startsWith(prefix) } ?: return null | ||||||
|             val file = File(folderFile, filename) |             val file = File(folderFile, filename) | ||||||
|             val storageFileFilename = file.name.removePrefix("$prefix ") |             val storageFileFilename = file.name.removePrefix("$prefix ") | ||||||
|  |  | ||||||
|             return StorageFile( |             return MultipartFile(storageFileFilename) { | ||||||
|                 StorageFileInfo(storageFileFilename) |  | ||||||
|             ) { |  | ||||||
|                 file.inputStream().asInput() |                 file.inputStream().asInput() | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -48,8 +46,8 @@ class InFilesMessagesFilesCache<K>( | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     override suspend fun get(k: K): StorageFile? { |     override suspend fun get(k: K): MultipartFile? { | ||||||
|         return k.storageFile |         return k.multipartFile | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     override suspend fun remove(k: K) { |     override suspend fun remove(k: K) { | ||||||
|   | |||||||
| @@ -1,12 +1,11 @@ | |||||||
| package dev.inmo.tgbotapi.libraries.cache.media.micro_utils | 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.* | ||||||
| import dev.inmo.micro_utils.repos.mappers.withMapper | import dev.inmo.micro_utils.repos.mappers.withMapper | ||||||
| import dev.inmo.tgbotapi.libraries.cache.media.common.MessagesSimpleCache | import dev.inmo.tgbotapi.libraries.cache.media.common.MessagesSimpleCache | ||||||
| import dev.inmo.tgbotapi.types.ChatId | import dev.inmo.tgbotapi.types.ChatId | ||||||
| import dev.inmo.tgbotapi.types.MessageIdentifier | 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.* | ||||||
| import kotlinx.serialization.builtins.PairSerializer | import kotlinx.serialization.builtins.PairSerializer | ||||||
| import kotlinx.serialization.builtins.serializer | import kotlinx.serialization.builtins.serializer | ||||||
| @@ -16,14 +15,10 @@ import kotlin.js.JsName | |||||||
| import kotlin.jvm.JvmName | import kotlin.jvm.JvmName | ||||||
|  |  | ||||||
| class SimpleKeyValueMessageContentCache<K>( | class SimpleKeyValueMessageContentCache<K>( | ||||||
|     private val keyValueRepo: KeyValueRepo<K, MessageContent>, |     private val keyValueRepo: KeyValueRepo<K, MessageContent> | ||||||
|     private val keyGenerator: () -> K |  | ||||||
| ) : MessagesSimpleCache<K> { | ) : MessagesSimpleCache<K> { | ||||||
|     override suspend fun add(content: MessageContent): K { |     override suspend fun set(k: K, content: MessageContent) { | ||||||
|         val key = keyGenerator() |         keyValueRepo.set(k, content) | ||||||
|         keyValueRepo.set(key, content) |  | ||||||
|  |  | ||||||
|         return key |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     override suspend fun update(k: K, content: MessageContent): Boolean { |     override suspend fun update(k: K, content: MessageContent): Boolean { | ||||||
| @@ -48,12 +43,6 @@ class SimpleKeyValueMessageContentCache<K>( | |||||||
|     override suspend fun remove(k: K) { |     override suspend fun remove(k: K) { | ||||||
|         keyValueRepo.unset(k) |         keyValueRepo.unset(k) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     companion object { |  | ||||||
|         operator fun invoke( |  | ||||||
|             keyValueRepo: KeyValueRepo<String, MessageContent> |  | ||||||
|         ) = SimpleKeyValueMessageContentCache(keyValueRepo) { uuid4().toString() } |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  |  | ||||||
| val chatIdToMessageIdentifierSerializer = PairSerializer( | val chatIdToMessageIdentifierSerializer = PairSerializer( | ||||||
|   | |||||||
| @@ -6,32 +6,32 @@ kotlin.incremental.js=true | |||||||
| android.useAndroidX=true | android.useAndroidX=true | ||||||
| android.enableJetifier=true | android.enableJetifier=true | ||||||
|  |  | ||||||
| kotlin_version=1.6.10 | kotlin_version=1.6.21 | ||||||
| kotlin_serialisation_core_version=1.3.2 | kotlin_serialisation_core_version=1.3.3 | ||||||
|  |  | ||||||
| github_release_plugin_version=2.2.12 | github_release_plugin_version=2.3.7 | ||||||
|  |  | ||||||
| tgbotapi_version=0.38.13 | tgbotapi_version=2.0.0 | ||||||
| micro_utils_version=0.9.22 | micro_utils_version=0.10.4 | ||||||
| exposed_version=0.37.3 | exposed_version=0.38.2 | ||||||
| plagubot_version=0.5.1 | plagubot_version=1.1.0 | ||||||
|  |  | ||||||
| # ANDROID | # ANDROID | ||||||
|  |  | ||||||
| android_minSdkVersion=21 | android_minSdkVersion=21 | ||||||
| android_compileSdkVersion=32 | android_compileSdkVersion=32 | ||||||
| android_buildToolsVersion=32.0.0 | android_buildToolsVersion=32.0.0 | ||||||
| dexcount_version=3.0.1 | dexcount_version=3.1.0 | ||||||
| junit_version=4.12 | junit_version=4.12 | ||||||
| test_ext_junit_version=1.1.2 | test_ext_junit_version=1.1.2 | ||||||
| espresso_core=3.3.0 | espresso_core=3.3.0 | ||||||
|  |  | ||||||
| # Dokka | # Dokka | ||||||
|  |  | ||||||
| dokka_version=1.6.10 | dokka_version=1.6.21 | ||||||
|  |  | ||||||
| # Project data | # Project data | ||||||
|  |  | ||||||
| group=dev.inmo | group=dev.inmo | ||||||
| version=0.0.18 | version=0.2.0 | ||||||
| android_code_version=18 | android_code_version=20 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user