From 766b7ca205f03b102600188a080d1f7145655773 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Tue, 23 Aug 2022 13:12:22 +0600 Subject: [PATCH] add waiters for mentions --- .../expectations/WaitMention.kt | 35 ++++++++++++++ .../expectations/WaitMentionMessage.kt | 48 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitMention.kt create mode 100644 tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitMentionMessage.kt diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitMention.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitMention.kt new file mode 100644 index 0000000000..2aecf53855 --- /dev/null +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitMention.kt @@ -0,0 +1,35 @@ +package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations + +import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext +import dev.inmo.tgbotapi.requests.abstracts.Request +import dev.inmo.tgbotapi.requests.bot.GetMe +import dev.inmo.tgbotapi.types.ChatId +import dev.inmo.tgbotapi.types.Username +import dev.inmo.tgbotapi.types.chat.User +import dev.inmo.tgbotapi.types.message.content.MessageContent +import kotlinx.coroutines.flow.* + +suspend fun BehaviourContext.waitMentionContents( + chatId: ChatId? = null, + username: Username? = null, + initRequest: Request<*>? = null, + includeMediaGroups: Boolean = true, + errorFactory: NullableRequestBuilder<*> = { null } +): Flow = waitMentionMessages(chatId, username, initRequest, includeMediaGroups, errorFactory).map { it.content } + +suspend fun BehaviourContext.waitMentionContents( + user: User, + initRequest: Request<*>? = null, + includeMediaGroups: Boolean = true, + errorFactory: NullableRequestBuilder<*> = { null } +): Flow = waitMentionContents(user.id, user.username, initRequest, includeMediaGroups, errorFactory) + +/** + * This expectation will get bot info and then + * Currently it is expected that the bot username will not be changed in runtime + */ +suspend fun BehaviourContext.waitBotMentions( + initRequest: Request<*>? = null, + includeMediaGroups: Boolean = true, + errorFactory: NullableRequestBuilder<*> = { null } +): Flow = waitMentionContents(execute(GetMe), initRequest, includeMediaGroups, errorFactory) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitMentionMessage.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitMentionMessage.kt new file mode 100644 index 0000000000..6c4fd23407 --- /dev/null +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitMentionMessage.kt @@ -0,0 +1,48 @@ +package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations + +import dev.inmo.tgbotapi.abstracts.TextedInput +import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext +import dev.inmo.tgbotapi.requests.abstracts.Request +import dev.inmo.tgbotapi.requests.bot.GetMe +import dev.inmo.tgbotapi.types.ChatId +import dev.inmo.tgbotapi.types.Username +import dev.inmo.tgbotapi.types.chat.User +import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage +import dev.inmo.tgbotapi.types.message.content.MessageContent +import dev.inmo.tgbotapi.types.message.textsources.MentionTextSource +import dev.inmo.tgbotapi.types.message.textsources.TextMentionTextSource +import kotlinx.coroutines.flow.* + +suspend fun BehaviourContext.waitMentionMessages( + chatId: ChatId? = null, + username: Username? = null, + initRequest: Request<*>? = null, + includeMediaGroups: Boolean = true, + errorFactory: NullableRequestBuilder<*> = { null } +): Flow> { + return waitContentMessage(initRequest, includeMediaGroups, errorFactory).filter { + val content = (it.content as? TextedInput) ?: return@filter false + + content.textSources.any { + (it is MentionTextSource && (username == null || it.username == username)) + || (it is TextMentionTextSource && (chatId == null || it.user.id == chatId)) + } + } +} + +suspend fun BehaviourContext.waitMentionMessages( + user: User, + initRequest: Request<*>? = null, + includeMediaGroups: Boolean = true, + errorFactory: NullableRequestBuilder<*> = { null } +): Flow> = waitMentionMessages(user.id, user.username, initRequest, includeMediaGroups, errorFactory) + +/** + * This expectation will get bot info and then + * Currently it is expected that the bot username will not be changed in runtime + */ +suspend fun BehaviourContext.waitBotMentionMessages( + initRequest: Request<*>? = null, + includeMediaGroups: Boolean = true, + errorFactory: NullableRequestBuilder<*> = { null } +): Flow> = waitMentionMessages(execute(GetMe), initRequest, includeMediaGroups, errorFactory)