diff --git a/CHANGELOG.md b/CHANGELOG.md index 298760a7f9..7a62d3b1a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,6 +59,11 @@ * Expected class `MimeType` was added * Field `MimeTyped#mimeType` now typed by `MimeType` instead of `String` * `MediaGroupMemberInputMedia` children now can be deserialized (but only those ones who are declared inside library) +* `TelegramBotAPI-extensions-utils`: + * Chat events splitters added: + * Extension `Flow#channelEvents` was added + * Extension `Flow#groupEvents` was added + * Extension `Flow#supergroupEvents` was added ### 0.27.1 diff --git a/TelegramBotAPI-extensions-utils/README.md b/TelegramBotAPI-extensions-utils/README.md index 3723aec991..b1c088c032 100644 --- a/TelegramBotAPI-extensions-utils/README.md +++ b/TelegramBotAPI-extensions-utils/README.md @@ -67,18 +67,64 @@ val filter = bot.startGettingUpdates( } ``` -### Getting of only text incoming messages +### Filters + +There are several filters for flows. + +#### Sent messages + +All sent messages can be filtered for three types: + +| Type | Description | Flow extension | +|:---- |:----------- |:-------------- | +| Common messages | Simple messages with text, media, location, etc. | `asContentMessagesFlow` | +| Chat actions | New chat member, rename of chat, etc. | `asChatEventsFlow` | +| Unknown events | Any other messages, that contain unsupported data | `asUnknownMessagesFlow` | + +##### Common messages + +Unfortunately, due to the erasing of generic types, when you are using `asContentMessagesFlow` you will retrieve +data with type `ContentMessage<*>`. For correct filtering of content type for retrieved objects, was created special +filters: + +| Type | Result type | Flow extension | +|:---- |:----------- |:-------------- | +| Animation | `ContentMessage`| `onlyAnimationContentMessages` | +| Audio | `ContentMessage` | `onlyAudioContentMessages` | +| Contact | `ContentMessage` | `onlyContactContentMessages` | +| Dice | `ContentMessage` | `onlyDiceContentMessages` | +| Document | `ContentMessage` | `onlyDocumentContentMessages` | +| Game | `ContentMessage` | `onlyGameContentMessages` | +| Invoice | `ContentMessage` | `onlyInvoiceContentMessages` | +| Location | `ContentMessage` | `onlyLocationContentMessages` | +| Photo | `ContentMessage` | `onlyPhotoContentMessages` | +| Poll | `ContentMessage` | `onlyPollContentMessages` | +| Sticker | `ContentMessage` | `onlyStickerContentMessages` | +| Text | `ContentMessage` | `onlyTextContentMessages` | +| Venue | `ContentMessage` | `onlyVenueContentMessages` | +| Video | `ContentMessage` | `onlyVideoContentMessages` | +| VideoNote | `ContentMessage` | `onlyVideoNoteContentMessages` | +| Voice | `ContentMessage` | `onlyVoiceContentMessages` | + +For example, if you wish to get only photo messages from private chats of groups, you should call next code: ```kotlin -filter.asContentMessagesFlow().onlyTextContentMessages().onEach { +filter.messageFlow.asContentMessagesFlow().onlyPhotoContentMessages().onEach { println(it.content) - println(it.fullEntitiesList()) }.launchIn( CoroutineScope(Dispatchers.Default) ) ``` -As a result, each received message which will be just text message will be printed out with full list of its internal entities +##### Chat actions + +Chat actions can be divided for three types of events source: + +| Type | Flow extension | +|:---- |:-------------- | +| Channel events | `channelEvents` | +| Group events | `groupEvents` | +| Supergroup events | `supergroupEvents` | ## Shortcuts diff --git a/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/ChatEventsConversations.kt b/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/ChatEventsConversations.kt new file mode 100644 index 0000000000..cef6db9ef4 --- /dev/null +++ b/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/ChatEventsConversations.kt @@ -0,0 +1,21 @@ +package com.github.insanusmokrassar.TelegramBotAPI.extensions.utils + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.ChatEventMessage +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.mapNotNull +import kotlin.reflect.KClass + + +fun Flow.divideBySource(contentType: KClass) = mapNotNull { + if (contentType.isInstance(it)) { + @Suppress("UNCHECKED_CAST") + it as T + } else { + null + } +} + +fun Flow.channelEvents() = divideBySource(ChannelEventMessage::class) +fun Flow.groupEvents() = divideBySource(GroupEventMessage::class) +fun Flow.supergroupEvents() = divideBySource(SupergroupEventMessage::class)