@file:Suppress("unused") package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter import dev.inmo.tgbotapi.extensions.utils.* import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.message.ChatEvents.* import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.* import dev.inmo.tgbotapi.types.message.ChatEvents.voice.* import dev.inmo.tgbotapi.types.message.PrivateEventMessage import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage import dev.inmo.tgbotapi.types.message.payments.SuccessfulPaymentEvent import kotlinx.coroutines.flow.toList typealias EventMessageToEventMapper = suspend ChatEventMessage.() -> T? private suspend inline fun BehaviourContext.waitEvents( initRequest: Request<*>? = null, noinline errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ): List = expectFlow( initRequest, count, errorFactory ) { val data = it.asBaseSentMessageUpdate() ?.data ?.asChatEventMessage() ?.withEvent() ?: return@expectFlow emptyList() if (filter == null || filter(data)) { listOf(data.chatEvent) } else { emptyList() } }.toList().toList() suspend fun BehaviourContext.waitChannelEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitPrivateEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitChatEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) @Deprecated("Renamed as Video instead of Voice") suspend fun BehaviourContext.waitVoiceChatEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) @Deprecated("Renamed as Video instead of Voice") suspend fun BehaviourContext.waitVoiceChatStartedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) @Deprecated("Renamed as Video instead of Voice") suspend fun BehaviourContext.waitVoiceChatEndedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) @Deprecated("Renamed as Video instead of Voice") suspend fun BehaviourContext.waitVoiceChatParticipantsInvitedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitVideoChatEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitVideoChatStartedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitVideoChatEndedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitVideoChatParticipantsInvitedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitMessageAutoDeleteTimerChangedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitPublicChatEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitCommonEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitGroupEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitSupergroupEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitChannelChatCreatedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitDeleteChatPhotoEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitGroupChatCreatedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitLeftChatMemberEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitNewChatPhotoEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitNewChatMembersEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitNewChatTitleEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitPinnedMessageEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitProximityAlertTriggeredEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitSupergroupChatCreatedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitSuccessfulPaymentEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitUserLoggedInEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitWebAppDataEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, filter: SimpleFilter>? = null ) = waitEvents(initRequest, errorFactory, count, filter ?.let { SimpleFilter> { it is PrivateEventMessage && filter(it) } })