From d70c7fdbdff2e51ae3f8b8e73306ffc171c4db19 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Tue, 9 Jan 2024 18:21:20 +0600 Subject: [PATCH] fixes related to UsersShared --- .../expectations/WaitEventAction.kt | 8 ++- .../expectations/WaitEventActionMessages.kt | 8 ++- .../triggers_handling/EventTriggers.kt | 23 +++++- .../types/buttons/ReplyKeyboardBuilder.kt | 72 +++++++++++++++++-- 4 files changed, 101 insertions(+), 10 deletions(-) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt index d65419b704..286e2f3c88 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt @@ -23,6 +23,7 @@ import dev.inmo.tgbotapi.types.request.UsersShared import dev.inmo.tgbotapi.utils.RiskFeature import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.filter typealias EventMessageToEventMapper = suspend ChatEventMessage.() -> T? @@ -199,11 +200,16 @@ suspend fun BehaviourContext.waitChatSharedRequest( errorFactory: NullableRequestBuilder<*> = { null } ) = waitEvents(initRequest, errorFactory) -suspend fun BehaviourContext.waitUserShared( +suspend fun BehaviourContext.waitUsersShared( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } ) = waitEvents(initRequest, errorFactory) +suspend fun BehaviourContext.waitUserShared( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitUsersShared(initRequest, errorFactory).filter { it.userIds.size == 1 } + suspend fun BehaviourContext.waitChatShared( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventActionMessages.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventActionMessages.kt index 9143f2bca6..55d89bbc75 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventActionMessages.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventActionMessages.kt @@ -23,6 +23,7 @@ import dev.inmo.tgbotapi.types.request.UsersShared import dev.inmo.tgbotapi.utils.RiskFeature import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.filter @RiskFeature(lowLevelRiskFeatureMessage) suspend inline fun BehaviourContext.waitEventsMessages( @@ -193,11 +194,16 @@ suspend fun BehaviourContext.waitChatSharedRequestEventsMessages( errorFactory: NullableRequestBuilder<*> = { null } ) = waitEventsMessages(initRequest, errorFactory) -suspend fun BehaviourContext.waitUserSharedEventsMessages( +suspend fun BehaviourContext.waitUsersSharedEventsMessages( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } ) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitUserSharedEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitUsersSharedEventsMessages(initRequest, errorFactory).filter { it.chatEvent.userIds.size == 1 } + suspend fun BehaviourContext.waitChatSharedEventsMessages( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EventTriggers.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EventTriggers.kt index 5826757feb..6fe38413da 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EventTriggers.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EventTriggers.kt @@ -7,6 +7,7 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.filters.MessageFilterByCha import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByChatMessageMarkerFactory import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times import dev.inmo.tgbotapi.extensions.utils.baseSentMessageUpdateOrNull import dev.inmo.tgbotapi.extensions.utils.chatEventMessageOrNull import dev.inmo.tgbotapi.types.message.ChatEvents.* @@ -775,7 +776,7 @@ suspend fun BC.onChatSharedRequest( * @param scenarioReceiver Main callback which will be used to handle incoming data if [initialFilter] will pass that * data */ -suspend fun BC.onUserShared( +suspend fun BC.onUsersShared( initialFilter: SimpleFilter>? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = MessageFilterByChat, markerFactory: MarkerFactory, Any> = ByChatMessageMarkerFactory, @@ -783,6 +784,26 @@ suspend fun BC.onUserShared( ) = onEventWithCustomChatEventMessage(initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) +/** + * @param initialFilter This filter will be called to remove unnecessary data BEFORE [scenarioReceiver] call + * @param subcontextUpdatesFilter This filter will be applied to each update inside of [scenarioReceiver]. For example, + * this filter will be used if you will call [dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitContentMessage]. + * Use [dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContextAndTwoTypesReceiver] function to create your own. + * Use [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.plus] or [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times] + * to combinate several filters + * @param markerFactory Will be used to identify different "stream". [scenarioReceiver] will be called synchronously + * in one "stream". Output of [markerFactory] will be used as a key for "stream" + * @param scenarioReceiver Main callback which will be used to handle incoming data if [initialFilter] will pass that + * data + */ +suspend fun BC.onUserShared( + initialFilter: SimpleFilter>? = null, + subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = MessageFilterByChat, + markerFactory: MarkerFactory, Any> = ByChatMessageMarkerFactory, + scenarioReceiver: CustomBehaviourContextAndTypeReceiver> +) = onUsersShared(initialFilter * { it.chatEvent.userIds.size == 1 }, subcontextUpdatesFilter, markerFactory, scenarioReceiver) + + /** * @param initialFilter This filter will be called to remove unnecessary data BEFORE [scenarioReceiver] call diff --git a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt index 6af5aa3a24..5cf259e63a 100644 --- a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt +++ b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/types/buttons/ReplyKeyboardBuilder.kt @@ -4,6 +4,7 @@ import dev.inmo.tgbotapi.types.buttons.* import dev.inmo.tgbotapi.types.buttons.reply.requestChatReplyButton import dev.inmo.tgbotapi.types.buttons.reply.requestUserReplyButton import dev.inmo.tgbotapi.types.chat.member.ChatCommonAdministratorRights +import dev.inmo.tgbotapi.types.keyboardButtonRequestUserLimit import dev.inmo.tgbotapi.types.request.RequestId import dev.inmo.tgbotapi.types.webapps.WebAppInfo import dev.inmo.tgbotapi.utils.* @@ -137,7 +138,7 @@ inline fun ReplyKeyboardRowBuilder.webAppButton( * @see replyKeyboard * @see ReplyKeyboardBuilder.row */ -inline fun ReplyKeyboardRowBuilder.requestUserButton( +inline fun ReplyKeyboardRowBuilder.requestUsersButton( text: String, requestUser: KeyboardButtonRequestUsers ) = add( @@ -147,6 +148,33 @@ inline fun ReplyKeyboardRowBuilder.requestUserButton( ) ) +/** + * Creates and put [RequestUserKeyboardButton] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +@Deprecated("Renamed", ReplaceWith("requestUsersButton(text, requestUser)", "dev.inmo.tgbotapi.extensions.utils.types.buttons")) +inline fun ReplyKeyboardRowBuilder.requestUserButton( + text: String, + requestUser: KeyboardButtonRequestUsers +) = requestUsersButton(text, requestUser) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUsers.Bot] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun ReplyKeyboardRowBuilder.requestBotsButton( + text: String, + requestId: RequestId, + maxCount: Int +) = requestUsersButton( + text, + KeyboardButtonRequestUsers.Bot(requestId, maxCount) +) + /** * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUsers.Bot] * @@ -156,9 +184,26 @@ inline fun ReplyKeyboardRowBuilder.requestUserButton( inline fun ReplyKeyboardRowBuilder.requestBotButton( text: String, requestId: RequestId -) = requestUserButton( +) = requestBotsButton( text, - KeyboardButtonRequestUsers.Bot(requestId) + requestId, + maxCount = keyboardButtonRequestUserLimit.first +) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUsers.Common] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun ReplyKeyboardRowBuilder.requestUsersButton( + text: String, + requestId: RequestId, + premiumUser: Boolean? = null, + maxCount: Int +) = requestUsersButton( + text, + KeyboardButtonRequestUsers.Common(requestId, premiumUser, maxCount) ) /** @@ -171,9 +216,21 @@ inline fun ReplyKeyboardRowBuilder.requestUserButton( text: String, requestId: RequestId, premiumUser: Boolean? = null -) = requestUserButton( +) = requestUsersButton(text, requestId, premiumUser, maxCount = keyboardButtonRequestUserLimit.first) + +/** + * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUsers.Any] + * + * @see replyKeyboard + * @see ReplyKeyboardBuilder.row + */ +inline fun ReplyKeyboardRowBuilder.requestUsersOrBotsButton( + text: String, + requestId: RequestId, + maxCount: Int +) = requestUsersButton( text, - KeyboardButtonRequestUsers.Common(requestId, premiumUser) + KeyboardButtonRequestUsers.Any(requestId, maxCount) ) /** @@ -185,9 +242,10 @@ inline fun ReplyKeyboardRowBuilder.requestUserButton( inline fun ReplyKeyboardRowBuilder.requestUserOrBotButton( text: String, requestId: RequestId -) = requestUserButton( +) = requestUsersOrBotsButton( text, - KeyboardButtonRequestUsers.Any(requestId) + requestId, + maxCount = keyboardButtonRequestUserLimit.first )