Procházet zdrojové kódy

Implement event priority for selectMessages

Him188 před 5 roky
rodič
revize
3255e330c0

+ 21 - 12
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/select.kt

@@ -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