diff --git a/CHANGELOG.md b/CHANGELOG.md index 7380bee314..aabf659514 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,7 +48,7 @@ * `TelegramBotAPI-extensions-utils`: * Subproject was added * `filterBaseMessageUpdates`, `filterSentMediaGroupUpdates` and `filterEditMediaGroupUpdates` extensions was added - * `filterExactCommands` and `filterCommandsInsideTextMessages` extensions was added + * `filterCommandsWithArgs`, `filterExactCommands` and `filterCommandsInsideTextMessages` extensions was added * `asContentMessagesFlow`, `asChatEventsFlow` and `asUnknownMessagesFlow` extensions was added * `withContentType` extension was added * `onlyAnimationContentMessages` extension was added diff --git a/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/updates/CommandsFilters.kt b/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/updates/CommandsFilters.kt index 08d6fa9fc2..1d991b0c0d 100644 --- a/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/updates/CommandsFilters.kt +++ b/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/updates/CommandsFilters.kt @@ -1,11 +1,12 @@ package com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.updates +import com.github.insanusmokrassar.TelegramBotAPI.CommonAbstracts.TextSource import com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.onlyTextContentMessages import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.textsources.BotCommandTextSource +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.textsources.RegularTextSource import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.fullEntitiesList import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseSentMessageUpdate -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.* fun Flow.filterExactCommands( commandRegex: Regex @@ -20,3 +21,33 @@ fun Flow.filterCommandsInsideTextMessages( (it as? BotCommandTextSource) ?.let { commandRegex.matches(it.command) } == true } } + +/** + * @return Result [Flow] will emit all [TextSource]s to the collector ONLY IN CASE if first [TextSource] is + * [BotCommandTextSource] and its [BotCommandTextSource.command] is [Regex.matches] to incoming [commandRegex]. Internal + * behaviour contains next rules: all incoming text sources will be passed as is, [RegularTextSource] will be divided + * by " " for several [RegularTextSource] which will contains not empty args without spaces + */ +fun Flow.filterCommandsWithArgs( + commandRegex: Regex +): Flow> = asContentMessagesFlow().onlyTextContentMessages().mapNotNull { contentMessage -> + val allEntities = contentMessage.content.fullEntitiesList() + (allEntities.firstOrNull() as? BotCommandTextSource) ?.let { + if (commandRegex.matches(it.command)) { + allEntities.flatMap { + when (it) { + is RegularTextSource -> it.source.split(" ").mapNotNull { regularTextSourcePart -> + if (regularTextSourcePart.isNotBlank()) { + RegularTextSource(regularTextSourcePart) + } else { + null + } + } + else -> listOf(it) + } + } + } else { + null + } + } +}