mirror of
				https://github.com/InsanusMokrassar/TelegramBotApiLibraries.git
				synced 2025-11-04 06:00:24 +00:00 
			
		
		
		
	fixes
This commit is contained in:
		@@ -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<K>(
 | 
			
		||||
    ),
 | 
			
		||||
    private val messagesFilesCache: MessagesFilesCache<K> = InMemoryMessagesFilesCache()
 | 
			
		||||
) : MessageContentCache<K> {
 | 
			
		||||
    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<K>(
 | 
			
		||||
                    )
 | 
			
		||||
                )
 | 
			
		||||
 | 
			
		||||
                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<K>(
 | 
			
		||||
        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
 | 
			
		||||
                    )
 | 
			
		||||
                }
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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<K> {
 | 
			
		||||
    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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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<K> {
 | 
			
		||||
    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<K> {
 | 
			
		||||
 * disks-oriented one
 | 
			
		||||
 */
 | 
			
		||||
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) {
 | 
			
		||||
        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]
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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<K> {
 | 
			
		||||
    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<K> {
 | 
			
		||||
 * start of application creation with usage of [MessageContentCache] with aim to replace this realization by some
 | 
			
		||||
 * disks-oriented one
 | 
			
		||||
 */
 | 
			
		||||
class InMemoryMessagesSimpleCache<K>(
 | 
			
		||||
    private val keyGenerator: () -> K
 | 
			
		||||
) : MessagesSimpleCache<K> {
 | 
			
		||||
class InMemoryMessagesSimpleCache<K> : MessagesSimpleCache<K> {
 | 
			
		||||
    private val map = mutableMapOf<K, MessageContent>()
 | 
			
		||||
 | 
			
		||||
    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<K>(
 | 
			
		||||
    override suspend fun contains(k: K): Boolean {
 | 
			
		||||
        return map.contains(k)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    companion object {
 | 
			
		||||
        operator fun invoke() = InMemoryMessagesSimpleCache {
 | 
			
		||||
            uuid4().toString()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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<K>(
 | 
			
		||||
    private val folderFile: File,
 | 
			
		||||
    private val filePrefixBuilder: (K) -> String
 | 
			
		||||
) : MessagesFilesCache<K> {
 | 
			
		||||
    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<K>(
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user