mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-13 06:30:13 +08:00
Implement event priority for selectMessages
This commit is contained in:
parent
42ceb38020
commit
3255e330c0
@ -62,8 +62,9 @@ import kotlin.jvm.JvmSynthetic
|
||||
suspend inline fun <reified T : MessageEvent> T.whileSelectMessages(
|
||||
timeoutMillis: Long = -1,
|
||||
filterContext: Boolean = true,
|
||||
priority: Listener.EventPriority = Listener.EventPriority.MONITOR,
|
||||
crossinline selectBuilder: @MessageDsl MessageSelectBuilder<T, Boolean>.() -> Unit
|
||||
) = whileSelectMessagesImpl(timeoutMillis, filterContext, selectBuilder)
|
||||
) = whileSelectMessagesImpl(timeoutMillis, filterContext, priority, selectBuilder)
|
||||
|
||||
/**
|
||||
* [selectMessages] 的 [Unit] 返回值捷径 (由于 Kotlin 无法推断 [Unit] 类型)
|
||||
@ -74,8 +75,9 @@ suspend inline fun <reified T : MessageEvent> T.whileSelectMessages(
|
||||
suspend inline fun <reified T : MessageEvent> T.selectMessagesUnit(
|
||||
timeoutMillis: Long = -1,
|
||||
filterContext: Boolean = true,
|
||||
priority: Listener.EventPriority = Listener.EventPriority.MONITOR,
|
||||
crossinline selectBuilder: @MessageDsl MessageSelectBuilderUnit<T, Unit>.() -> Unit
|
||||
) = selectMessagesImpl(timeoutMillis, true, filterContext, selectBuilder)
|
||||
) = selectMessagesImpl(timeoutMillis, true, filterContext, priority, selectBuilder)
|
||||
|
||||
|
||||
/**
|
||||
@ -103,10 +105,14 @@ suspend inline fun <reified T : MessageEvent> T.selectMessagesUnit(
|
||||
suspend inline fun <reified T : MessageEvent, R> T.selectMessages(
|
||||
timeoutMillis: Long = -1,
|
||||
filterContext: Boolean = true,
|
||||
priority: Listener.EventPriority = Listener.EventPriority.MONITOR,
|
||||
// @BuilderInference
|
||||
crossinline selectBuilder: @MessageDsl MessageSelectBuilder<T, R>.() -> Unit
|
||||
): R =
|
||||
selectMessagesImpl(timeoutMillis, false, filterContext) { selectBuilder.invoke(this as MessageSelectBuilder<T, R>) }
|
||||
selectMessagesImpl(timeoutMillis,
|
||||
false,
|
||||
filterContext,
|
||||
priority) { selectBuilder.invoke(this as MessageSelectBuilder<T, R>) }
|
||||
|
||||
/**
|
||||
* [selectMessages] 时的 DSL 构建器.
|
||||
@ -434,16 +440,11 @@ inline class MessageSelectionTimeoutChecker internal constructor(val timeoutMill
|
||||
class MessageSelectionTimeoutException : RuntimeException()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/////////////////////////
|
||||
//// implementations ////
|
||||
/////////////////////////
|
||||
|
||||
|
||||
|
||||
|
||||
@JvmSynthetic
|
||||
@PublishedApi
|
||||
internal suspend inline fun <R> withSilentTimeoutOrCoroutineScope(
|
||||
@ -478,6 +479,7 @@ internal suspend inline fun <reified T : MessageEvent, R> T.selectMessagesImpl(
|
||||
timeoutMillis: Long = -1,
|
||||
isUnit: Boolean,
|
||||
filterContext: Boolean = true,
|
||||
priority: Listener.EventPriority,
|
||||
@BuilderInference
|
||||
crossinline selectBuilder: @MessageDsl MessageSelectBuilderUnit<T, R>.() -> Unit
|
||||
): R = withSilentTimeoutOrCoroutineScope(timeoutMillis) {
|
||||
@ -526,7 +528,10 @@ internal suspend inline fun <reified T : MessageEvent, R> T.selectMessagesImpl(
|
||||
|
||||
// we don't have any way to reduce duplication yet,
|
||||
// until local functions are supported in inline functions
|
||||
@Suppress("DuplicatedCode") val subscribeAlways = subscribeAlways<T> { event ->
|
||||
@Suppress("DuplicatedCode") val subscribeAlways = subscribeAlways<T>(
|
||||
concurrency = Listener.ConcurrencyKind.LOCKED,
|
||||
priority = priority
|
||||
) { event ->
|
||||
if (filterContext && !this.isContextIdenticalWith(this@selectMessagesImpl))
|
||||
return@subscribeAlways
|
||||
|
||||
@ -574,8 +579,9 @@ internal suspend inline fun <reified T : MessageEvent, R> T.selectMessagesImpl(
|
||||
@Suppress("unused")
|
||||
@PublishedApi
|
||||
internal suspend inline fun <reified T : MessageEvent> T.whileSelectMessagesImpl(
|
||||
timeoutMillis: Long = -1,
|
||||
filterContext: Boolean = true,
|
||||
timeoutMillis: Long,
|
||||
filterContext: Boolean,
|
||||
priority: Listener.EventPriority,
|
||||
crossinline selectBuilder: @MessageDsl MessageSelectBuilder<T, Boolean>.() -> Unit
|
||||
) = withSilentTimeoutOrCoroutineScope(timeoutMillis) {
|
||||
var deferred: CompletableDeferred<Boolean>? = CompletableDeferred()
|
||||
@ -604,7 +610,10 @@ internal suspend inline fun <reified T : MessageEvent> T.whileSelectMessagesImpl
|
||||
}.apply(selectBuilder)
|
||||
|
||||
// ensure atomic completing
|
||||
val subscribeAlways = subscribeAlways<T>(concurrency = Listener.ConcurrencyKind.LOCKED) { event ->
|
||||
val subscribeAlways = subscribeAlways<T>(
|
||||
concurrency = Listener.ConcurrencyKind.LOCKED,
|
||||
priority = priority
|
||||
) { event ->
|
||||
if (filterContext && !this.isContextIdenticalWith(this@whileSelectMessagesImpl))
|
||||
return@subscribeAlways
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user