@file:Suppress("unused") package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext import dev.inmo.tgbotapi.extensions.utils.commonMessageOrNull import dev.inmo.tgbotapi.extensions.utils.withContent import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage import dev.inmo.tgbotapi.types.message.abstracts.MediaGroupMessage import dev.inmo.tgbotapi.types.message.content.* import dev.inmo.tgbotapi.types.update.abstracts.BaseEditMessageUpdate import dev.inmo.tgbotapi.utils.RiskFeature import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage import kotlinx.coroutines.flow.Flow @RiskFeature(lowLevelRiskFeatureMessage) suspend inline fun BehaviourContext.waitEditedContentMessage( initRequest: Request<*>? = null, includeMediaGroups: Boolean = true, noinline errorFactory: NullableRequestBuilder<*> = { null } ): Flow> = expectFlow( initRequest, errorFactory ) { val messages = when (it) { is BaseEditMessageUpdate -> { val commonMessage = it.data.commonMessageOrNull() ?: return@expectFlow emptyList() if (commonMessage !is MediaGroupMessage<*> || includeMediaGroups) { listOf(commonMessage) } else { emptyList() } } else -> return@expectFlow emptyList() } messages.mapNotNull { message -> (message as CommonMessage<*>).withContent() } } suspend fun BehaviourContext.waitEditedMessageContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, includeMediaGroups: Boolean = true ) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedContactMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } ) = waitEditedContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedDiceMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } ) = waitEditedContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedGameMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } ) = waitEditedContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedLocationMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } ) = waitEditedContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedLiveLocationMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } ) = waitEditedContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedStaticLocationMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } ) = waitEditedContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedTextMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } ) = waitEditedContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedVenueMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } ) = waitEditedContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedAudioMediaGroupContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, includeMediaGroups: Boolean = true ) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedDocumentMediaGroupContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, includeMediaGroups: Boolean = true ) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedMediaMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, includeMediaGroups: Boolean = false ) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedAnyMediaGroupContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, includeMediaGroups: Boolean = true ) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedVisualMediaGroupContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, includeMediaGroups: Boolean = true ) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedTextedMediaContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, includeMediaGroups: Boolean = true ) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedAnimationMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } ) = waitEditedContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedAudioMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, includeMediaGroups: Boolean = false ) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedDocumentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, includeMediaGroups: Boolean = false ) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedPhotoMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, includeMediaGroups: Boolean = false ) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedStickerMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } ) = waitEditedContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedVideoMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, includeMediaGroups: Boolean = false ) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedVideoNoteMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } ) = waitEditedContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedVoiceMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } ) = waitEditedContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedInvoiceMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null } ) = waitEditedContentMessage(initRequest, false, errorFactory)