package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext import dev.inmo.tgbotapi.extensions.behaviour_builder.CustomBehaviourContextAndTwoTypesReceiver import dev.inmo.tgbotapi.extensions.behaviour_builder.CustomBehaviourContextAndTypeReceiver import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.isWithMention import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.isWithTextMention import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.AnyMarkerFactory import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times import dev.inmo.tgbotapi.types.UserId 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.AnimationContent import dev.inmo.tgbotapi.types.message.content.AudioContent import dev.inmo.tgbotapi.types.message.content.DocumentContent import dev.inmo.tgbotapi.types.message.content.MediaGroupContent import dev.inmo.tgbotapi.types.message.content.MediaGroupPartContent import dev.inmo.tgbotapi.types.message.content.PhotoContent import dev.inmo.tgbotapi.types.message.content.TextContent import dev.inmo.tgbotapi.types.message.content.TextedContent import dev.inmo.tgbotapi.types.message.content.VideoContent import dev.inmo.tgbotapi.types.message.content.VisualMediaGroupPartContent import dev.inmo.tgbotapi.types.message.content.VoiceContent import dev.inmo.tgbotapi.types.update.abstracts.Update internal suspend inline fun BC.onMention( username: Username, initialFilter: CommonMessageFilter? = null, noinline subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), noinline scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onContentMessageWithType( initialFilter * { it.content.isWithMention(username) }, subcontextUpdatesFilter, markerFactory, scenarioReceiver ) internal suspend inline fun BC.onTextMention( userId: UserId, initialFilter: CommonMessageFilter? = null, noinline subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), noinline scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onContentMessageWithType( initialFilter * { it.content.isWithTextMention(userId) }, subcontextUpdatesFilter, markerFactory, scenarioReceiver ) internal suspend inline fun BC.onMention( user: User, initialFilter: CommonMessageFilter? = null, noinline subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), noinline scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onContentMessageWithType( initialFilter * { it.content.isWithMention(user) }, subcontextUpdatesFilter, markerFactory, scenarioReceiver ) suspend fun BC.onMentionWithAnyContent( username: Username, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(username, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onTextMentionWithAnyContent( userId: UserId, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onTextMention(userId, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithAnyContent( user: User, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(user, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithVoiceContent( username: Username, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(username, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onTextMentionWithVoiceContent( userId: UserId, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onTextMention(userId, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithVoiceContent( user: User, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(user, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithMediaGroupContent( username: Username, initialFilter: CommonMessageFilter>? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver>, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver>> ) = onMention(username, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onTextMentionWithMediaGroupContent( userId: UserId, initialFilter: CommonMessageFilter>? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver>, Update>? = null, markerFactory: MarkerFactory>, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver>> ) = onTextMention(userId, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithMediaGroupContent( user: User, initialFilter: CommonMessageFilter>? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver>, Update>? = null, markerFactory: MarkerFactory>, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver>> ) = onMention(user, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithMediaGroupPartContent( username: Username, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(username, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onTextMentionWithMediaGroupPartContent( userId: UserId, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onTextMention(userId, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithMediaGroupPartContent( user: User, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(user, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithAudioContent( username: Username, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(username, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onTextMentionWithAudioContent( userId: UserId, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onTextMention(userId, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithAudioContent( user: User, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(user, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithDocumentContent( username: Username, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(username, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onTextMentionWithDocumentContent( userId: UserId, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onTextMention(userId, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithDocumentContent( user: User, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(user, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithVisualMediaGroupPartContent( username: Username, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(username, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onTextMentionWithVisualMediaGroupPartContent( userId: UserId, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onTextMention(userId, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithVisualMediaGroupPartContent( user: User, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(user, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithVideoContent( username: Username, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(username, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onTextMentionWithVideoContent( userId: UserId, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onTextMention(userId, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithVideoContent( user: User, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(user, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithPhotoContent( username: Username, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(username, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onTextMentionWithPhotoContent( userId: UserId, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onTextMention(userId, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithPhotoContent( user: User, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(user, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithAnimationContent( username: Username, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(username, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onTextMentionWithAnimationContent( userId: UserId, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onTextMention(userId, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithAnimationContent( user: User, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(user, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithTextContent( username: Username, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(username, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onTextMentionWithTextContent( userId: UserId, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onTextMention(userId, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) suspend fun BC.onMentionWithTextContent( user: User, initialFilter: CommonMessageFilter? = null, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver, Update>? = null, markerFactory: MarkerFactory, Any> = AnyMarkerFactory(), scenarioReceiver: CustomBehaviourContextAndTypeReceiver> ) = onMention(user, initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver)