2021-01-07 12:17:50 +00:00
|
|
|
package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling
|
2021-01-07 11:24:58 +00:00
|
|
|
|
|
|
|
|
|
|
|
import dev.inmo.micro_utils.coroutines.safelyWithoutExceptions
|
|
|
|
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
|
2021-01-07 12:17:50 +00:00
|
|
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
|
|
|
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContextAndTypeReceiver
|
|
|
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow
|
2021-01-07 11:24:58 +00:00
|
|
|
import dev.inmo.tgbotapi.extensions.utils.*
|
2021-01-07 11:57:08 +00:00
|
|
|
import dev.inmo.tgbotapi.extensions.utils.extensions.sourceChat
|
2021-01-07 11:24:58 +00:00
|
|
|
import dev.inmo.tgbotapi.types.message.ChatEvents.*
|
|
|
|
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.*
|
|
|
|
import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage
|
|
|
|
import dev.inmo.tgbotapi.types.message.content.*
|
|
|
|
import dev.inmo.tgbotapi.types.message.content.abstracts.*
|
|
|
|
import dev.inmo.tgbotapi.types.message.content.media.*
|
|
|
|
import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter
|
|
|
|
import kotlinx.coroutines.flow.filter
|
|
|
|
|
2021-01-07 12:11:01 +00:00
|
|
|
internal suspend inline fun <reified T : ChatEvent> BehaviourContext.onEvent(
|
|
|
|
includeFilterByChatInBehaviourSubContext: Boolean = true,
|
2021-01-07 11:24:58 +00:00
|
|
|
noinline additionalFilter: (suspend (ChatEventMessage<T>) -> Boolean)? = null,
|
2021-01-07 12:11:01 +00:00
|
|
|
noinline scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<T>>
|
2021-01-07 11:24:58 +00:00
|
|
|
) = flowsUpdatesFilter.expectFlow(bot) {
|
|
|
|
it.asMessageUpdate() ?.data ?.asChatEventMessage() ?.let { message ->
|
|
|
|
if (message.chatEvent is T) {
|
|
|
|
val adaptedMessage = message as ChatEventMessage<T>
|
|
|
|
if (additionalFilter == null || additionalFilter(adaptedMessage)) adaptedMessage else null
|
|
|
|
} else {
|
|
|
|
null
|
|
|
|
}
|
2021-01-07 18:22:19 +00:00
|
|
|
}.let(::listOfNotNull)
|
2021-01-07 11:24:58 +00:00
|
|
|
}.subscribeSafelyWithoutExceptions(scope) { triggerMessage ->
|
2021-01-07 12:11:01 +00:00
|
|
|
val (jobToCancel, scenario) = if (includeFilterByChatInBehaviourSubContext) {
|
2021-01-07 11:24:58 +00:00
|
|
|
val subFilter = FlowsUpdatesFilter()
|
2021-01-07 12:11:01 +00:00
|
|
|
val subBehaviourContext = copy(flowsUpdatesFilter = subFilter)
|
2021-01-07 11:24:58 +00:00
|
|
|
|
|
|
|
flowsUpdatesFilter.allUpdatesFlow.filter {
|
2021-01-07 11:57:08 +00:00
|
|
|
val chat = it.sourceChat() ?: return@filter false
|
|
|
|
chat.id.chatId == triggerMessage.chat.id.chatId
|
2021-01-07 12:11:01 +00:00
|
|
|
}.subscribeSafelyWithoutExceptions(scope, subFilter.asUpdateReceiver) to subBehaviourContext
|
2021-01-07 11:24:58 +00:00
|
|
|
} else {
|
|
|
|
null to this
|
|
|
|
}
|
|
|
|
safelyWithoutExceptions { scenario.scenarioReceiver(triggerMessage) }
|
|
|
|
jobToCancel ?.cancel()
|
|
|
|
}
|
|
|
|
|
2021-01-07 12:11:01 +00:00
|
|
|
suspend fun BehaviourContext.onChannelEvent(
|
|
|
|
includeFilterByChatInBehaviourSubContext: Boolean = true,
|
2021-01-07 11:24:58 +00:00
|
|
|
additionalFilter: (suspend (ChatEventMessage<ChannelEvent>) -> Boolean)? = null,
|
2021-01-07 12:11:01 +00:00
|
|
|
scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<ChannelEvent>>
|
|
|
|
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
|
|
|
|
suspend fun BehaviourContext.onChatEvent(
|
|
|
|
includeFilterByChatInBehaviourSubContext: Boolean = true,
|
2021-01-07 11:24:58 +00:00
|
|
|
additionalFilter: (suspend (ChatEventMessage<ChatEvent>) -> Boolean)? = null,
|
2021-01-07 12:11:01 +00:00
|
|
|
scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<ChatEvent>>
|
|
|
|
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
|
|
|
|
suspend fun BehaviourContext.onCommonEvent(
|
|
|
|
includeFilterByChatInBehaviourSubContext: Boolean = true,
|
2021-01-07 11:24:58 +00:00
|
|
|
additionalFilter: (suspend (ChatEventMessage<CommonEvent>) -> Boolean)? = null,
|
2021-01-07 12:11:01 +00:00
|
|
|
scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<CommonEvent>>
|
|
|
|
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
|
|
|
|
suspend fun BehaviourContext.onGroupEvent(
|
|
|
|
includeFilterByChatInBehaviourSubContext: Boolean = true,
|
2021-01-07 11:24:58 +00:00
|
|
|
additionalFilter: (suspend (ChatEventMessage<GroupEvent>) -> Boolean)? = null,
|
2021-01-07 12:11:01 +00:00
|
|
|
scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<GroupEvent>>
|
|
|
|
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
|
|
|
|
suspend fun BehaviourContext.onSupergroupEvent(
|
|
|
|
includeFilterByChatInBehaviourSubContext: Boolean = true,
|
2021-01-07 11:24:58 +00:00
|
|
|
additionalFilter: (suspend (ChatEventMessage<SupergroupEvent>) -> Boolean)? = null,
|
2021-01-07 12:11:01 +00:00
|
|
|
scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<SupergroupEvent>>
|
|
|
|
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
|
2021-01-07 11:24:58 +00:00
|
|
|
|
2021-01-07 12:11:01 +00:00
|
|
|
suspend fun BehaviourContext.onChannelChatCreated(
|
|
|
|
includeFilterByChatInBehaviourSubContext: Boolean = true,
|
2021-01-07 11:24:58 +00:00
|
|
|
additionalFilter: (suspend (ChatEventMessage<ChannelChatCreated>) -> Boolean)? = null,
|
2021-01-07 12:11:01 +00:00
|
|
|
scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<ChannelChatCreated>>
|
|
|
|
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
|
|
|
|
suspend fun BehaviourContext.onDeleteChatPhoto(
|
|
|
|
includeFilterByChatInBehaviourSubContext: Boolean = true,
|
2021-01-07 11:24:58 +00:00
|
|
|
additionalFilter: (suspend (ChatEventMessage<DeleteChatPhoto>) -> Boolean)? = null,
|
2021-01-07 12:11:01 +00:00
|
|
|
scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<DeleteChatPhoto>>
|
|
|
|
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
|
|
|
|
suspend fun BehaviourContext.onGroupChatCreated(
|
|
|
|
includeFilterByChatInBehaviourSubContext: Boolean = true,
|
2021-01-07 11:24:58 +00:00
|
|
|
additionalFilter: (suspend (ChatEventMessage<GroupChatCreated>) -> Boolean)? = null,
|
2021-01-07 12:11:01 +00:00
|
|
|
scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<GroupChatCreated>>
|
|
|
|
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
|
|
|
|
suspend fun BehaviourContext.onLeftChatMember(
|
|
|
|
includeFilterByChatInBehaviourSubContext: Boolean = true,
|
2021-01-07 11:24:58 +00:00
|
|
|
additionalFilter: (suspend (ChatEventMessage<LeftChatMember>) -> Boolean)? = null,
|
2021-01-07 12:11:01 +00:00
|
|
|
scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<LeftChatMember>>
|
|
|
|
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
|
|
|
|
suspend fun BehaviourContext.onNewChatMembers(
|
|
|
|
includeFilterByChatInBehaviourSubContext: Boolean = true,
|
2021-01-07 11:24:58 +00:00
|
|
|
additionalFilter: (suspend (ChatEventMessage<NewChatMembers>) -> Boolean)? = null,
|
2021-01-07 12:11:01 +00:00
|
|
|
scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<NewChatMembers>>
|
|
|
|
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
|
|
|
|
suspend fun BehaviourContext.onNewChatPhoto(
|
|
|
|
includeFilterByChatInBehaviourSubContext: Boolean = true,
|
2021-01-07 11:24:58 +00:00
|
|
|
additionalFilter: (suspend (ChatEventMessage<NewChatPhoto>) -> Boolean)? = null,
|
2021-01-07 12:11:01 +00:00
|
|
|
scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<NewChatPhoto>>
|
|
|
|
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
|
|
|
|
suspend fun BehaviourContext.onNewChatTitle(
|
|
|
|
includeFilterByChatInBehaviourSubContext: Boolean = true,
|
2021-01-07 11:24:58 +00:00
|
|
|
additionalFilter: (suspend (ChatEventMessage<NewChatTitle>) -> Boolean)? = null,
|
2021-01-07 12:11:01 +00:00
|
|
|
scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<NewChatTitle>>
|
|
|
|
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
|
|
|
|
suspend fun BehaviourContext.onPinnedMessage(
|
|
|
|
includeFilterByChatInBehaviourSubContext: Boolean = true,
|
2021-01-07 11:24:58 +00:00
|
|
|
additionalFilter: (suspend (ChatEventMessage<PinnedMessage>) -> Boolean)? = null,
|
2021-01-07 12:11:01 +00:00
|
|
|
scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<PinnedMessage>>
|
|
|
|
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
|
|
|
|
suspend fun BehaviourContext.onProximityAlertTriggered(
|
|
|
|
includeFilterByChatInBehaviourSubContext: Boolean = true,
|
2021-01-07 11:24:58 +00:00
|
|
|
additionalFilter: (suspend (ChatEventMessage<ProximityAlertTriggered>) -> Boolean)? = null,
|
2021-01-07 12:11:01 +00:00
|
|
|
scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<ProximityAlertTriggered>>
|
|
|
|
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
|
|
|
|
suspend fun BehaviourContext.onSupergroupChatCreated(
|
|
|
|
includeFilterByChatInBehaviourSubContext: Boolean = true,
|
2021-01-07 11:24:58 +00:00
|
|
|
additionalFilter: (suspend (ChatEventMessage<SupergroupChatCreated>) -> Boolean)? = null,
|
2021-01-07 12:11:01 +00:00
|
|
|
scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<SupergroupChatCreated>>
|
|
|
|
) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
|