From 790959ea4935198756ec9244e2c985eac542c290 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Thu, 13 Aug 2020 14:55:21 +0600 Subject: [PATCH] add a lot of extension for FlowUpdatesFilter and Flow --- CHANGELOG.md | 13 ++++ .../extensions/utils/FlowsAggregation.kt | 8 +++ .../utils/extensions/FlowsUpdatesFilter.kt | 19 ++++++ .../utils/shortcuts/FlowsUpdatesFilter.kt | 65 ++++++++++++++++++- 4 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/extensions/FlowsUpdatesFilter.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 631a9a8d93..cd0f9d8e5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,6 +52,16 @@ ### 0.27.11 * `TelegramBotAPI-extensions-utils`: + * `Flow>.flatMap` extension was added + * Extensions for `FlowUpdatesFilter` were added: + * `FlowsUpdatesFilter#allSentMessagesFlow` (combination of `messageFlow` and `channelPostFlow`) + * `FlowsUpdatesFilter#allSentMediaGroupsFlow` (combination of `messageMediaGroupFlow` and `channelPostMediaGroupFlow`) + * `FlowsUpdatesFilter#photoMessagesWithMediaGroups` + * `FlowsUpdatesFilter#imageMessagesWithMediaGroups` + * `FlowsUpdatesFilter#videoMessagesWithMediaGroups` + * `FlowsUpdatesFilter#mediaGroupMessages` + * `FlowsUpdatesFilter#mediaGroupPhotosMessages` + * `FlowsUpdatesFilter#mediaGroupVideosMessages` * A lot of extensions like `Flow#textMessages` were added: * `Flow#animationMessages` * `Flow#audioMessages` @@ -70,6 +80,9 @@ * `Flow#videoMessages` * `Flow#videoNoteMessages` * `Flow#voiceMessages` + * `Flow#mediaGroupMessages` + * `Flow#mediaGroupPhotosMessages` + * `Flow#mediaGroupVideosMessages` ### 0.27.10 diff --git a/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/FlowsAggregation.kt b/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/FlowsAggregation.kt index 17c783a215..eba50df519 100644 --- a/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/FlowsAggregation.kt +++ b/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/FlowsAggregation.kt @@ -21,3 +21,11 @@ fun aggregateFlows( } return bc.asFlow() } + +fun Flow>.flatMap(): Flow = flow { + collect { + it.forEach { + emit(it) + } + } +} diff --git a/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/extensions/FlowsUpdatesFilter.kt b/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/extensions/FlowsUpdatesFilter.kt new file mode 100644 index 0000000000..51efd9f2cb --- /dev/null +++ b/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/extensions/FlowsUpdatesFilter.kt @@ -0,0 +1,19 @@ +package com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.extensions + +import com.github.insanusmokrassar.TelegramBotAPI.types.update.MediaGroupUpdates.SentMediaGroupUpdate +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseSentMessageUpdate +import com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.FlowsUpdatesFilter +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.merge + +val FlowsUpdatesFilter.allSentMessagesFlow: Flow + get() = merge( + messageFlow, + channelPostFlow + ) + +val FlowsUpdatesFilter.allSentMediaGroupsFlow: Flow + get() = merge( + messageMediaGroupFlow, + channelPostMediaGroupFlow + ) diff --git a/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/shortcuts/FlowsUpdatesFilter.kt b/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/shortcuts/FlowsUpdatesFilter.kt index 8776b894e8..2f968339d8 100644 --- a/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/shortcuts/FlowsUpdatesFilter.kt +++ b/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/shortcuts/FlowsUpdatesFilter.kt @@ -1,13 +1,16 @@ package com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.shortcuts import com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.aggregateFlows +import com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.flatMap import com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.updates.asContentMessagesFlow +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.CommonMessage import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.ContentMessage -import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaGroupContent import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media.* import com.github.insanusmokrassar.TelegramBotAPI.types.message.payments.InvoiceContent +import com.github.insanusmokrassar.TelegramBotAPI.types.update.MediaGroupUpdates.SentMediaGroupUpdate import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseSentMessageUpdate import com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.FlowsUpdatesFilter import kotlinx.coroutines.CoroutineScope @@ -25,9 +28,20 @@ inline fun filterForContentMessage(): suspend (Cont inline fun Flow.filterContentMessages( ): Flow> = asContentMessagesFlow().mapNotNull(filterForContentMessage()) +inline fun Flow.filterMediaGroupMessages( +): Flow>> = map { + it.data.mapNotNull { message -> + if (message.content is T) { + message as CommonMessage + } else { + null + } + } +} + /** * @param scopeToIncludeChannels This parameter is required when you want to include [textMessages] for channels too. - * In this case will be created new channel which will agregate messages from [FlowsUpdatesFilter.messageFlow] and + * In this case will be created new channel which will aggregate messages from [FlowsUpdatesFilter.messageFlow] and * [FlowsUpdatesFilter.channelPostFlow]. In case it is null will be used [Flow]s mapping */ @Suppress("UNCHECKED_CAST") @@ -43,6 +57,24 @@ inline fun FlowsUpdatesFilter.filterContentMessages( } ?: messageFlow).filterContentMessages() } +/** + * @param scopeToIncludeChannels This parameter is required when you want to include [SentMediaGroupUpdate] for channels + * too. In this case will be created new channel which will aggregate messages from [FlowsUpdatesFilter.messageFlow] and + * [FlowsUpdatesFilter.channelPostFlow]. In case it is null will be used [Flow]s mapping + */ +@Suppress("UNCHECKED_CAST") +inline fun FlowsUpdatesFilter.filterMediaGroupMessages( + scopeToIncludeChannels: CoroutineScope? = null +): Flow>> { + return (scopeToIncludeChannels ?.let { scope -> + aggregateFlows( + scope, + messageMediaGroupFlow, + channelPostMediaGroupFlow + ) + } ?: messageMediaGroupFlow).filterMediaGroupMessages() +} + fun Flow.animationMessages() = filterContentMessages() fun FlowsUpdatesFilter.animationMessages( scopeToIncludeChannels: CoroutineScope? = null @@ -88,6 +120,12 @@ fun Flow.imageMessages() = photoMessages() fun FlowsUpdatesFilter.photoMessages( scopeToIncludeChannels: CoroutineScope? = null ) = filterContentMessages(scopeToIncludeChannels) +fun FlowsUpdatesFilter.photoMessagesWithMediaGroups( + scopeToIncludeChannels: CoroutineScope? = null +) = merge( + filterContentMessages(scopeToIncludeChannels), + mediaGroupPhotosMessages(scopeToIncludeChannels).flatMap() +) /** * Shortcut for [photoMessages] */ @@ -95,6 +133,9 @@ fun FlowsUpdatesFilter.photoMessages( inline fun FlowsUpdatesFilter.imageMessages( scopeToIncludeChannels: CoroutineScope? = null ) = photoMessages(scopeToIncludeChannels) +fun FlowsUpdatesFilter.imageMessagesWithMediaGroups( + scopeToIncludeChannels: CoroutineScope? = null +) = photoMessagesWithMediaGroups(scopeToIncludeChannels) fun Flow.pollMessages() = filterContentMessages() fun FlowsUpdatesFilter.pollMessages( @@ -120,6 +161,12 @@ fun Flow.videoMessages() = filterContentMessages(scopeToIncludeChannels) +fun FlowsUpdatesFilter.videoMessagesWithMediaGroups( + scopeToIncludeChannels: CoroutineScope? = null +) = merge( + filterContentMessages(scopeToIncludeChannels), + mediaGroupVideosMessages(scopeToIncludeChannels).flatMap() +) fun Flow.videoNoteMessages() = filterContentMessages() fun FlowsUpdatesFilter.videoNoteMessages( @@ -132,3 +179,17 @@ fun FlowsUpdatesFilter.voiceMessages( ) = filterContentMessages(scopeToIncludeChannels) +fun Flow.mediaGroupMessages() = filterMediaGroupMessages() +fun FlowsUpdatesFilter.mediaGroupMessages( + scopeToIncludeChannels: CoroutineScope? = null +) = filterMediaGroupMessages(scopeToIncludeChannels) + +fun Flow.mediaGroupPhotosMessages() = filterMediaGroupMessages() +fun FlowsUpdatesFilter.mediaGroupPhotosMessages( + scopeToIncludeChannels: CoroutineScope? = null +) = filterMediaGroupMessages(scopeToIncludeChannels) + +fun Flow.mediaGroupVideosMessages() = filterMediaGroupMessages() +fun FlowsUpdatesFilter.mediaGroupVideosMessages( + scopeToIncludeChannels: CoroutineScope? = null +) = filterMediaGroupMessages(scopeToIncludeChannels)