mirror of
https://github.com/InsanusMokrassar/TelegramBotAPI.git
synced 2024-11-24 19:18:44 +00:00
rewrite MainTrigger as noinline
This commit is contained in:
parent
60fdbb8ac4
commit
46c5c62e15
@ -38,7 +38,9 @@ suspend fun <T> FlowsUpdatesFilter.expectFlow(
|
||||
filter: suspend (Update) -> List<T>
|
||||
): Flow<T> {
|
||||
val flow = allUpdatesFlow.map {
|
||||
val result = safelyWithResult { filter(it) }
|
||||
val result = runCatching {
|
||||
filter(it)
|
||||
}
|
||||
if (result.isFailure || result.getOrThrow().isEmpty()) {
|
||||
if (cancelTrigger(it)) {
|
||||
cancelRequestFactory(it) ?.also {
|
||||
@ -47,14 +49,20 @@ suspend fun <T> FlowsUpdatesFilter.expectFlow(
|
||||
}
|
||||
}
|
||||
errorFactory(it) ?.also { errorRequest ->
|
||||
safelyWithoutExceptions { bot.execute(errorRequest) }
|
||||
runCatching {
|
||||
bot.execute(errorRequest)
|
||||
}
|
||||
}
|
||||
emptyList()
|
||||
} else {
|
||||
result.getOrThrow()
|
||||
}
|
||||
}.flatten()
|
||||
initRequest ?.also { safelyWithoutExceptions { bot.execute(initRequest) } }
|
||||
initRequest ?.also {
|
||||
runCatching {
|
||||
bot.execute(initRequest)
|
||||
}
|
||||
}
|
||||
return flow
|
||||
}
|
||||
|
||||
|
@ -9,6 +9,7 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
|
||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByChatMessageMarkerFactory
|
||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
|
||||
import dev.inmo.tgbotapi.extensions.utils.whenCommonMessage
|
||||
import dev.inmo.tgbotapi.extensions.utils.withContentOrNull
|
||||
import dev.inmo.tgbotapi.types.files.TelegramMediaFile
|
||||
import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage
|
||||
import dev.inmo.tgbotapi.types.message.content.*
|
||||
@ -27,7 +28,7 @@ internal suspend inline fun <BC : BehaviourContext, reified T : MessageContent>
|
||||
is BaseSentMessageUpdate -> it.data.whenCommonMessage(::listOfNotNull)
|
||||
else -> null
|
||||
} ?.mapNotNull { message ->
|
||||
if (message.content is T) message as CommonMessage<T> else null
|
||||
message.withContentOrNull<T>()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -9,12 +9,12 @@ 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
|
||||
|
||||
internal suspend inline fun <BC : BehaviourContext, reified T> BC.on(
|
||||
internal suspend fun <BC : BehaviourContext, T> BC.on(
|
||||
markerFactory: MarkerFactory<in T, Any>?,
|
||||
initialFilter: SimpleFilter<T>? = null,
|
||||
noinline subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, T, Update>? = null,
|
||||
noinline scenarioReceiver: CustomBehaviourContextAndTypeReceiver<BC, Unit, T>,
|
||||
noinline updateToData: (Update) -> List<T>?
|
||||
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, T, Update>? = null,
|
||||
scenarioReceiver: CustomBehaviourContextAndTypeReceiver<BC, Unit, T>,
|
||||
updateToData: (Update) -> List<T>?
|
||||
) = flowsUpdatesFilter.expectFlow(
|
||||
bot,
|
||||
filter = initialFilter ?.let {
|
||||
@ -24,18 +24,22 @@ internal suspend inline fun <BC : BehaviourContext, reified T> BC.on(
|
||||
} ?: emptyList()
|
||||
}
|
||||
} ?: {
|
||||
updateToData(it) ?.mapNotNull { data ->
|
||||
updateToData(it) ?.map { data ->
|
||||
it to data
|
||||
} ?: emptyList()
|
||||
}
|
||||
).run {
|
||||
val handler: suspend (Pair<Update, T>) -> Unit = { (update, triggerData) ->
|
||||
val handler: suspend (Pair<Update, T>) -> Unit = subcontextUpdatesFilter ?.let {
|
||||
{ (update, triggerData) ->
|
||||
createSubContextAndDoWithUpdatesFilter {
|
||||
if (subcontextUpdatesFilter ?.invoke(this, triggerData, update) != false) {
|
||||
if (subcontextUpdatesFilter(this, triggerData, update)) {
|
||||
scenarioReceiver(triggerData)
|
||||
}
|
||||
}
|
||||
}
|
||||
} ?: { (_, triggerData) ->
|
||||
createSubContextAndDoWithUpdatesFilter(behaviourContextReceiver = { scenarioReceiver(triggerData) })
|
||||
}
|
||||
markerFactory ?.let {
|
||||
subscribeSafelyWithoutExceptionsAsync(
|
||||
scope,
|
||||
|
Loading…
Reference in New Issue
Block a user