tgbotapi/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/MainTrigger.kt

32 lines
1.4 KiB
Kotlin
Raw Normal View History

package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptionsAsync
import dev.inmo.tgbotapi.extensions.behaviour_builder.*
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
import dev.inmo.tgbotapi.types.update.abstracts.Update
2021-10-13 08:22:01 +00:00
internal suspend inline fun <BC : BehaviourContext, reified T> BC.on(
markerFactory: MarkerFactory<in T, Any>,
2022-04-21 09:42:32 +00:00
initialFilter: SimpleFilter<T>? = null,
2021-10-13 08:22:01 +00:00
noinline subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, T, Update>? = null,
noinline scenarioReceiver: CustomBehaviourContextAndTypeReceiver<BC, Unit, T>,
noinline updateToData: (Update) -> List<T>?
) = flowsUpdatesFilter.expectFlow(bot) {
updateToData(it) ?.mapNotNull { data ->
if (initialFilter ?.invoke(data) != false) it to data else null
} ?: emptyList()
}.subscribeSafelyWithoutExceptionsAsync(
scope,
{ markerFactory(it.second) }
) { (update, triggerData) ->
2022-05-11 04:56:31 +00:00
createSubContextAndDoWithUpdatesFilter(
stopOnCompletion = false
) {
if (subcontextUpdatesFilter ?.invoke(this, triggerData, update) != false) {
scenarioReceiver(triggerData)
}
}
}