TelegramBotApiLibraries/cache/content/common/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/common/DefaultMessageContentCache.kt

123 lines
4.8 KiB
Kotlin
Raw Normal View History

2022-03-22 12:52:23 +00:00
package dev.inmo.tgbotapi.libraries.cache.media.common
import dev.inmo.tgbotapi.bot.TelegramBot
import dev.inmo.tgbotapi.requests.DownloadFileStream
import dev.inmo.tgbotapi.requests.get.GetFile
import dev.inmo.tgbotapi.requests.send.media.*
import dev.inmo.tgbotapi.types.ChatId
2022-05-17 14:05:53 +00:00
import dev.inmo.tgbotapi.types.media.*
import dev.inmo.tgbotapi.types.message.content.MediaContent
import dev.inmo.tgbotapi.types.message.content.MessageContent
2022-04-11 15:28:53 +00:00
import dev.inmo.tgbotapi.utils.asInput
import io.ktor.utils.io.core.Input
2022-03-22 12:52:23 +00:00
2022-04-11 17:32:06 +00:00
class DefaultMessageContentCache<K>(
2022-03-22 12:52:23 +00:00
private val bot: TelegramBot,
2022-04-11 15:28:53 +00:00
private val filesRefreshingChatId: ChatId,
2022-04-11 17:32:06 +00:00
private val simpleMessageContentCache: MessagesSimpleCache<K>,
2022-04-19 18:11:03 +00:00
private val mediaFileActualityChecker: MediaFileActualityChecker = MediaFileActualityChecker.WithDelay(
MediaFileActualityChecker.Default(filesRefreshingChatId)
),
2022-04-11 17:32:06 +00:00
private val messagesFilesCache: MessagesFilesCache<K> = InMemoryMessagesFilesCache()
) : MessageContentCache<K> {
2022-05-17 14:05:53 +00:00
override suspend fun save(k: K, content: MessageContent) {
when (content) {
2022-04-11 15:28:53 +00:00
is MediaContent -> {
2022-03-22 12:52:23 +00:00
val extendedInfo = bot.execute(
GetFile(content.media.fileId)
)
val allocator = bot.execute(
DownloadFileStream(
extendedInfo.filePath
)
)
2022-04-11 15:28:53 +00:00
2022-05-17 14:05:53 +00:00
save(k, content, extendedInfo.fileName) {
2022-04-11 15:28:53 +00:00
allocator.invoke().asInput()
}
2022-03-22 12:52:23 +00:00
}
2022-05-17 14:05:53 +00:00
else -> simpleMessageContentCache.set(k, content)
2022-04-11 15:28:53 +00:00
}
}
override suspend fun save(
2022-05-17 14:05:53 +00:00
k: K,
2022-04-11 15:28:53 +00:00
content: MediaContent,
filename: String,
inputAllocator: suspend () -> Input
2022-05-17 14:05:53 +00:00
) {
simpleMessageContentCache.set(k, content)
2022-04-11 15:28:53 +00:00
runCatching {
2022-05-17 14:05:53 +00:00
messagesFilesCache.set(k, filename, inputAllocator)
2022-03-22 12:52:23 +00:00
}.onFailure {
2022-05-17 14:05:53 +00:00
simpleMessageContentCache.remove(k)
2022-04-19 18:19:25 +00:00
}.onSuccess {
with(mediaFileActualityChecker) {
bot.saved(content)
}
2022-03-22 12:52:23 +00:00
}
}
2022-04-11 17:32:06 +00:00
override suspend fun get(k: K): MessageContent? {
val savedSimpleContent = simpleMessageContentCache.get(k) ?: return null
2022-03-22 12:52:23 +00:00
2022-04-19 18:11:03 +00:00
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(
2022-05-17 14:05:53 +00:00
when (savedSimpleContent.asTelegramMedia()) {
is TelegramMediaAnimation -> SendAnimation(
2022-04-19 18:11:03 +00:00
filesRefreshingChatId,
2022-05-17 14:05:53 +00:00
savedFileContentAllocator,
2022-04-19 18:11:03 +00:00
disableNotification = true
)
2022-05-17 14:05:53 +00:00
is TelegramMediaAudio -> SendAudio(
2022-04-19 18:11:03 +00:00
filesRefreshingChatId,
2022-05-17 14:05:53 +00:00
savedFileContentAllocator,
2022-04-19 18:11:03 +00:00
disableNotification = true
)
2022-05-17 14:05:53 +00:00
is TelegramMediaVideo -> SendVideo(
2022-04-19 18:11:03 +00:00
filesRefreshingChatId,
2022-05-17 14:05:53 +00:00
savedFileContentAllocator,
2022-04-19 18:11:03 +00:00
disableNotification = true
)
2022-05-17 14:05:53 +00:00
is TelegramMediaDocument -> SendDocument(
2022-04-19 18:11:03 +00:00
filesRefreshingChatId,
2022-05-17 14:05:53 +00:00
savedFileContentAllocator,
2022-04-19 18:11:03 +00:00
disableNotification = true
)
2022-05-17 14:05:53 +00:00
is TelegramMediaPhoto -> SendPhoto(
2022-04-19 18:11:03 +00:00
filesRefreshingChatId,
2022-05-17 14:05:53 +00:00
savedFileContentAllocator,
2022-04-19 18:11:03 +00:00
disableNotification = true
)
}
)
2022-03-22 12:52:23 +00:00
2022-04-19 18:11:03 +00:00
simpleMessageContentCache.update(k, newContent.content)
return newContent.content
2022-03-22 12:52:23 +00:00
}
return savedSimpleContent
}
2022-04-11 17:32:06 +00:00
override suspend fun contains(k: K): Boolean {
return simpleMessageContentCache.contains(k)
2022-03-22 12:52:23 +00:00
}
2022-04-11 17:32:06 +00:00
override suspend fun remove(k: K) {
simpleMessageContentCache.remove(k)
messagesFilesCache.remove(k)
}
companion object {
operator fun invoke(
bot: TelegramBot,
filesRefreshingChatId: ChatId,
simpleMessageContentCache: MessagesSimpleCache<String> = InMemoryMessagesSimpleCache(),
2022-04-19 18:11:03 +00:00
mediaFileActualityChecker: MediaFileActualityChecker = MediaFileActualityChecker.WithDelay(
MediaFileActualityChecker.Default(filesRefreshingChatId)
),
2022-04-11 17:32:06 +00:00
messagesFilesCache: MessagesFilesCache<String> = InMemoryMessagesFilesCache()
2022-04-19 18:11:03 +00:00
) = DefaultMessageContentCache(bot, filesRefreshingChatId, simpleMessageContentCache, mediaFileActualityChecker, messagesFilesCache)
2022-03-22 12:52:23 +00:00
}
}