1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2024-06-26 03:28:10 +00:00
tgbotapi/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/updates/retrieving/MediaGroupsIncluder.kt

64 lines
2.4 KiB
Kotlin
Raw Normal View History

package dev.inmo.tgbotapi.extensions.utils.updates.retrieving
2020-05-13 17:22:35 +00:00
import dev.inmo.micro_utils.coroutines.launchSafelyWithoutExceptions
2020-10-04 11:06:30 +00:00
import dev.inmo.tgbotapi.extensions.utils.updates.convertWithMediaGroupUpdates
2022-11-07 19:51:27 +00:00
import dev.inmo.tgbotapi.types.message.abstracts.PossiblyMediaGroupMessage
2020-10-04 11:06:30 +00:00
import dev.inmo.tgbotapi.types.update.abstracts.BaseMessageUpdate
import dev.inmo.tgbotapi.types.update.abstracts.Update
import dev.inmo.tgbotapi.updateshandlers.UpdateReceiver
import dev.inmo.tgbotapi.utils.extensions.accumulateByKey
2020-05-13 17:22:35 +00:00
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.launch
/**
* Create [UpdateReceiver] object which will correctly accumulate updates and send into output updates which INCLUDE
2020-10-04 11:06:30 +00:00
* [dev.inmo.tgbotapi.types.update.MediaGroupUpdates.MediaGroupUpdate]s.
2020-05-13 17:22:35 +00:00
*
* @see UpdateReceiver
*/
fun CoroutineScope.updateHandlerWithMediaGroupsAdaptation(
output: UpdateReceiver<Update>,
debounceTimeMillis: Long = 1000L
): UpdateReceiver<Update> {
val updatesChannel = Channel<Update>(Channel.UNLIMITED)
val mediaGroupChannel = Channel<Pair<String, BaseMessageUpdate>>(Channel.UNLIMITED)
val mediaGroupAccumulatedChannel = mediaGroupChannel.accumulateByKey(
debounceTimeMillis,
scope = this
)
launch {
launchSafelyWithoutExceptions {
2020-05-13 17:22:35 +00:00
for (update in updatesChannel) {
val data = update.data
when {
data is PossiblyMediaGroupMessage<*> && data.mediaGroupId != null -> {
mediaGroupChannel.send("${data.mediaGroupId}${update::class.simpleName}" to update as BaseMessageUpdate)
}
2020-05-13 17:22:35 +00:00
else -> output(update)
}
}
}
launchSafelyWithoutExceptions {
2020-05-13 17:22:35 +00:00
for ((_, mediaGroup) in mediaGroupAccumulatedChannel) {
mediaGroup.convertWithMediaGroupUpdates().forEach {
output(it)
}
}
}
}
return { updatesChannel.send(it) }
}
/**
* Create [UpdateReceiver] object which will correctly accumulate updates and send into output updates which INCLUDE
2020-10-04 11:06:30 +00:00
* [dev.inmo.tgbotapi.types.update.MediaGroupUpdates.MediaGroupUpdate]s.
2020-05-13 17:22:35 +00:00
*
* @see UpdateReceiver
*/
fun CoroutineScope.updateHandlerWithMediaGroupsAdaptation(
output: UpdateReceiver<Update>
2022-11-07 19:51:27 +00:00
) = updateHandlerWithMediaGroupsAdaptation(output, 1000L)