1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2024-06-01 07:25:23 +00:00
tgbotapi/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/updates/UpdatesUtils.kt

58 lines
2.2 KiB
Kotlin
Raw Normal View History

package dev.inmo.tgbotapi.extensions.utils.updates
2020-05-13 17:22:35 +00:00
2022-11-07 19:51:27 +00:00
import dev.inmo.tgbotapi.extensions.utils.withContentOrNull
2020-10-04 11:06:30 +00:00
import dev.inmo.tgbotapi.types.MediaGroupIdentifier
2024-03-16 14:32:18 +00:00
import dev.inmo.tgbotapi.types.UpdateId
2022-11-07 19:51:27 +00:00
import dev.inmo.tgbotapi.types.message.abstracts.PossiblySentViaBotCommonMessage
import dev.inmo.tgbotapi.types.message.content.MediaGroupPartContent
2020-10-04 11:06:30 +00:00
import dev.inmo.tgbotapi.types.update.*
import dev.inmo.tgbotapi.types.update.abstracts.*
2023-09-02 13:02:30 +00:00
import dev.inmo.tgbotapi.utils.RiskFeature
2022-11-07 19:51:27 +00:00
import dev.inmo.tgbotapi.utils.extensions.asMediaGroupMessage
2020-05-13 17:22:35 +00:00
/**
2024-03-16 14:32:18 +00:00
* @return The biggest [UpdateId] OR null
2020-05-13 17:22:35 +00:00
*
* @see [Update.lastUpdateIdentifier]
*/
2024-03-16 14:32:18 +00:00
fun List<Update>.lastUpdateIdentifier(): UpdateId? {
return maxByOrNull { it.updateId } ?.updateId ?.takeIf { it.long > -1 }
2020-05-13 17:22:35 +00:00
}
/**
* Will convert incoming list of [Update]s to list with [Update]s, which include [dev.inmo.tgbotapi.types.message.abstracts.ContentMessage]s
* with [dev.inmo.tgbotapi.types.message.content.MediaGroupContent]
2020-05-13 17:22:35 +00:00
*/
2023-09-02 13:02:30 +00:00
@OptIn(RiskFeature::class)
2020-05-13 17:22:35 +00:00
fun List<Update>.convertWithMediaGroupUpdates(): List<Update> {
val resultUpdates = mutableListOf<Update>()
2022-11-07 19:51:27 +00:00
val mediaGroups = mutableMapOf<MediaGroupIdentifier, MutableList<Pair<BaseSentMessageUpdate, PossiblySentViaBotCommonMessage<MediaGroupPartContent>>>>()
2020-05-13 17:22:35 +00:00
for (update in this) {
2022-11-07 19:51:27 +00:00
val message = (update.data as? PossiblySentViaBotCommonMessage<*>) ?.withContentOrNull<MediaGroupPartContent>()
val mediaGroupId = message ?.mediaGroupId
if (message == null || mediaGroupId == null) {
2020-05-13 17:22:35 +00:00
resultUpdates.add(update)
continue
}
when (update) {
is BaseSentMessageUpdate -> {
2022-11-07 19:51:27 +00:00
mediaGroups.getOrPut(mediaGroupId) {
2020-05-13 17:22:35 +00:00
mutableListOf()
2022-11-07 19:51:27 +00:00
}.add(update to message)
2020-05-13 17:22:35 +00:00
}
else -> resultUpdates.add(update)
}
}
2022-11-07 19:51:27 +00:00
mediaGroups.map { (_, updatesWithMessages) ->
val update = updatesWithMessages.maxBy { it.first.updateId }.first
resultUpdates.add(
update.copy(updatesWithMessages.map { it.second }.asMediaGroupMessage())
)
2020-05-13 17:22:35 +00:00
}
2022-11-07 19:51:27 +00:00
2020-05-13 17:22:35 +00:00
resultUpdates.sortBy { it.updateId }
return resultUpdates
}