diff --git a/CHANGELOG.md b/CHANGELOG.md index e7ea38cb3e..adbefeb070 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,6 +52,17 @@ * `TelegramBotAPI-core`: * All `InlineQueryResult` has changed their type of id for more obvious relation between `InlineQueryResult#id` and `ChosenInlineResult#resultId`: `String` -> `InlineQueryIdentifier` +* `TelegramBotAPI-extensions-utils`: + * Several extensions for updates flows based on `InlineQueryUpdate` has been added: + * `Flow#onlyBaseInlineQueriesWithUpdates` + * `Flow#onlyBaseInlineQueries` + * `Flow#onlyLocationInlineQueriesWithUpdates` + * `Flow#onlyLocationInlineQueries` + * Several extensions for updates flows based on `ChosenInlineResultUpdate` has been added: + * `Flow.onlyBaseChosenInlineResultsWithUpdates` + * `Flow.onlyBaseChosenInlineResults` + * `Flow.onlyLocationChosenInlineResultsWithUpdates` + * `Flow.onlyLocationChosenInlineResults` ### 0.28.2 diff --git a/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/internal_utils/UpdatesFiltering.kt b/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/internal_utils/UpdatesFiltering.kt new file mode 100644 index 0000000000..86ef6b60b2 --- /dev/null +++ b/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/internal_utils/UpdatesFiltering.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.internal_utils + +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.mapNotNull + +internal inline fun Flow.onlySpecifiedTypeOfDataWithUpdates(): Flow> { + return mapNotNull { + it.updateId to (it.data as? T ?: return@mapNotNull null) + } +} + +internal inline fun Flow.onlySpecifiedTypeOfData(): Flow { + return mapNotNull { it as? T } +} diff --git a/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/updates/ChosenInlineResultUpdatesConversations.kt b/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/updates/ChosenInlineResultUpdatesConversations.kt new file mode 100644 index 0000000000..ccd53fd7b9 --- /dev/null +++ b/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/updates/ChosenInlineResultUpdatesConversations.kt @@ -0,0 +1,36 @@ +package com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.updates + +import com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.internal_utils.onlySpecifiedTypeOfData +import com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.internal_utils.onlySpecifiedTypeOfDataWithUpdates +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.ChosenInlineResult.BaseChosenInlineResult +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.ChosenInlineResult.LocationChosenInlineResult +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.update.ChosenInlineResultUpdate +import com.github.insanusmokrassar.TelegramBotAPI.types.update.InlineQueryUpdate +import kotlinx.coroutines.flow.Flow + +/** + * @return Mapped [Flow] with [Pair]s. [Pair.first] in this pair will be [UpdateIdentifier]. It could be useful in + * cases you are using [InlineQueryUpdate.updateId] for some reasons. [Pair.second] will always be [BaseChosenInlineResult]. + */ +fun Flow.onlyBaseChosenInlineResultsWithUpdates(): Flow> = onlySpecifiedTypeOfDataWithUpdates() + +/** + * @return Filter updates only with [BaseChosenInlineResult] and map it to a [Flow] with values [BaseChosenInlineResult] + * + * @see onlyBaseChosenInlineResultsWithUpdates + */ +fun Flow.onlyBaseChosenInlineResults(): Flow = onlySpecifiedTypeOfData() + +/** + * @return Mapped [Flow] with [Pair]s. [Pair.first] in this pair will be [UpdateIdentifier]. It could be useful in + * cases you are using [InlineQueryUpdate.updateId] for some reasons. [Pair.second] will always be [LocationChosenInlineResult]. + */ +fun Flow.onlyLocationChosenInlineResultsWithUpdates(): Flow> = onlySpecifiedTypeOfDataWithUpdates() + +/** + * @return Filter updates only with [LocationChosenInlineResult] and map it to a [Flow] with values [LocationChosenInlineResult] + * + * @see onlyLocationChosenInlineResultsWithUpdates + */ +fun Flow.onlyLocationChosenInlineResults(): Flow = onlySpecifiedTypeOfData() diff --git a/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/updates/InlineQueryUpdatesConversations.kt b/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/updates/InlineQueryUpdatesConversations.kt new file mode 100644 index 0000000000..8f9a230fc9 --- /dev/null +++ b/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/updates/InlineQueryUpdatesConversations.kt @@ -0,0 +1,35 @@ +package com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.updates + +import com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.internal_utils.onlySpecifiedTypeOfData +import com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.internal_utils.onlySpecifiedTypeOfDataWithUpdates +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.query.BaseInlineQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.query.LocationInlineQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.update.InlineQueryUpdate +import kotlinx.coroutines.flow.* + +/** + * @return Mapped [Flow] with [Pair]s. [Pair.first] in this pair will be [UpdateIdentifier]. It could be useful in + * cases you are using [InlineQueryUpdate.updateId] for some reasons. [Pair.second] will always be [BaseInlineQuery]. + */ +fun Flow.onlyBaseInlineQueriesWithUpdates(): Flow> = onlySpecifiedTypeOfDataWithUpdates() + +/** + * @return Filter updates only with [BaseInlineQuery] and map it to a [Flow] with values [BaseInlineQuery] + * + * @see onlyBaseInlineQueriesWithUpdates + */ +fun Flow.onlyBaseInlineQueries(): Flow = onlySpecifiedTypeOfData() + +/** + * @return Mapped [Flow] with [Pair]s. [Pair.first] in this pair will be [UpdateIdentifier]. It could be useful in + * cases you are using [InlineQueryUpdate.updateId] for some reasons. [Pair.second] will always be [LocationInlineQuery]. + */ +fun Flow.onlyLocationInlineQueriesWithUpdates(): Flow> = onlySpecifiedTypeOfDataWithUpdates() + +/** + * @return Filter updates only with [LocationInlineQuery] and map it to a [Flow] with values [LocationInlineQuery] + * + * @see onlyLocationInlineQueriesWithUpdates + */ +fun Flow.onlyLocationInlineQueries(): Flow = onlySpecifiedTypeOfData()