Fix EventChannel.filter, allow blocking calls correctly

This commit is contained in:
Him188 2021-06-29 22:21:58 +08:00
parent 2ce549e56f
commit 3d0fba2d8f

View File

@ -29,6 +29,7 @@ import net.mamoe.mirai.internal.event.registerEventHandler
import net.mamoe.mirai.utils.MiraiExperimentalApi import net.mamoe.mirai.utils.MiraiExperimentalApi
import net.mamoe.mirai.utils.MiraiLogger import net.mamoe.mirai.utils.MiraiLogger
import net.mamoe.mirai.utils.cast import net.mamoe.mirai.utils.cast
import net.mamoe.mirai.utils.runBIO
import java.util.function.Consumer import java.util.function.Consumer
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext import kotlin.coroutines.EmptyCoroutineContext
@ -62,7 +63,7 @@ public open class EventChannel<out BaseEvent : Event> @JvmOverloads internal con
/** /**
* 此事件通道的默认 [CoroutineScope.coroutineContext]. 将会被添加给所有注册的事件监听器. * 此事件通道的默认 [CoroutineScope.coroutineContext]. 将会被添加给所有注册的事件监听器.
*/ */
public val defaultCoroutineContext: CoroutineContext = EmptyCoroutineContext public val defaultCoroutineContext: CoroutineContext = EmptyCoroutineContext,
) { ) {
/** /**
@ -189,7 +190,7 @@ public open class EventChannel<out BaseEvent : Event> @JvmOverloads internal con
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
@kotlin.internal.LowPriorityInOverloadResolution @kotlin.internal.LowPriorityInOverloadResolution
public fun filter(filter: (event: BaseEvent) -> Boolean): EventChannel<BaseEvent> { public fun filter(filter: (event: BaseEvent) -> Boolean): EventChannel<BaseEvent> {
return filter { runInterruptible { filter(it) } } return filter { runBIO { filter(it) } }
} }
/** /**
@ -371,7 +372,7 @@ public open class EventChannel<out BaseEvent : Event> @JvmOverloads internal con
coroutineContext: CoroutineContext = EmptyCoroutineContext, coroutineContext: CoroutineContext = EmptyCoroutineContext,
concurrency: ConcurrencyKind = LOCKED, concurrency: ConcurrencyKind = LOCKED,
priority: EventPriority = EventPriority.NORMAL, priority: EventPriority = EventPriority.NORMAL,
noinline handler: suspend E.(E) -> ListeningStatus noinline handler: suspend E.(E) -> ListeningStatus,
): Listener<E> = subscribe(E::class, coroutineContext, concurrency, priority, handler) ): Listener<E> = subscribe(E::class, coroutineContext, concurrency, priority, handler)
/** /**
@ -386,7 +387,7 @@ public open class EventChannel<out BaseEvent : Event> @JvmOverloads internal con
coroutineContext: CoroutineContext = EmptyCoroutineContext, coroutineContext: CoroutineContext = EmptyCoroutineContext,
concurrency: ConcurrencyKind = LOCKED, concurrency: ConcurrencyKind = LOCKED,
priority: EventPriority = EventPriority.NORMAL, priority: EventPriority = EventPriority.NORMAL,
handler: suspend E.(E) -> ListeningStatus handler: suspend E.(E) -> ListeningStatus,
): Listener<E> = subscribeInternal( ): Listener<E> = subscribeInternal(
eventClass, eventClass,
createListener(coroutineContext, concurrency, priority) { it.handler(it); } createListener(coroutineContext, concurrency, priority) { it.handler(it); }
@ -411,7 +412,7 @@ public open class EventChannel<out BaseEvent : Event> @JvmOverloads internal con
coroutineContext: CoroutineContext = EmptyCoroutineContext, coroutineContext: CoroutineContext = EmptyCoroutineContext,
concurrency: ConcurrencyKind = CONCURRENT, concurrency: ConcurrencyKind = CONCURRENT,
priority: EventPriority = EventPriority.NORMAL, priority: EventPriority = EventPriority.NORMAL,
noinline handler: suspend E.(E) -> Unit noinline handler: suspend E.(E) -> Unit,
): Listener<E> = subscribeAlways(E::class, coroutineContext, concurrency, priority, handler) ): Listener<E> = subscribeAlways(E::class, coroutineContext, concurrency, priority, handler)
@ -425,7 +426,7 @@ public open class EventChannel<out BaseEvent : Event> @JvmOverloads internal con
coroutineContext: CoroutineContext = EmptyCoroutineContext, coroutineContext: CoroutineContext = EmptyCoroutineContext,
concurrency: ConcurrencyKind = CONCURRENT, concurrency: ConcurrencyKind = CONCURRENT,
priority: EventPriority = EventPriority.NORMAL, priority: EventPriority = EventPriority.NORMAL,
handler: suspend E.(E) -> Unit handler: suspend E.(E) -> Unit,
): Listener<E> = subscribeInternal( ): Listener<E> = subscribeInternal(
eventClass, eventClass,
createListener(coroutineContext, concurrency, priority) { it.handler(it); ListeningStatus.LISTENING } createListener(coroutineContext, concurrency, priority) { it.handler(it); ListeningStatus.LISTENING }
@ -446,7 +447,7 @@ public open class EventChannel<out BaseEvent : Event> @JvmOverloads internal con
public inline fun <reified E : Event> subscribeOnce( public inline fun <reified E : Event> subscribeOnce(
coroutineContext: CoroutineContext = EmptyCoroutineContext, coroutineContext: CoroutineContext = EmptyCoroutineContext,
priority: EventPriority = EventPriority.NORMAL, priority: EventPriority = EventPriority.NORMAL,
noinline handler: suspend E.(E) -> Unit noinline handler: suspend E.(E) -> Unit,
): Listener<E> = subscribeOnce(E::class, coroutineContext, priority, handler) ): Listener<E> = subscribeOnce(E::class, coroutineContext, priority, handler)
/** /**
@ -456,7 +457,7 @@ public open class EventChannel<out BaseEvent : Event> @JvmOverloads internal con
eventClass: KClass<out E>, eventClass: KClass<out E>,
coroutineContext: CoroutineContext = EmptyCoroutineContext, coroutineContext: CoroutineContext = EmptyCoroutineContext,
priority: EventPriority = EventPriority.NORMAL, priority: EventPriority = EventPriority.NORMAL,
handler: suspend E.(E) -> Unit handler: suspend E.(E) -> Unit,
): Listener<E> = subscribeInternal( ): Listener<E> = subscribeInternal(
eventClass, eventClass,
createListener(coroutineContext, LOCKED, priority) { it.handler(it); ListeningStatus.STOPPED } createListener(coroutineContext, LOCKED, priority) { it.handler(it); ListeningStatus.STOPPED }
@ -504,7 +505,7 @@ public open class EventChannel<out BaseEvent : Event> @JvmOverloads internal con
coroutineContext: CoroutineContext = EmptyCoroutineContext, coroutineContext: CoroutineContext = EmptyCoroutineContext,
concurrency: ConcurrencyKind = CONCURRENT, concurrency: ConcurrencyKind = CONCURRENT,
priority: EventPriority = EventPriority.NORMAL, priority: EventPriority = EventPriority.NORMAL,
handler: Consumer<E> handler: Consumer<E>,
): Listener<E> = subscribeInternal( ): Listener<E> = subscribeInternal(
eventClass.kotlin, eventClass.kotlin,
createListener(coroutineContext, concurrency, priority) { event -> createListener(coroutineContext, concurrency, priority) { event ->
@ -531,7 +532,7 @@ public open class EventChannel<out BaseEvent : Event> @JvmOverloads internal con
coroutineContext: CoroutineContext = EmptyCoroutineContext, coroutineContext: CoroutineContext = EmptyCoroutineContext,
concurrency: ConcurrencyKind = CONCURRENT, concurrency: ConcurrencyKind = CONCURRENT,
priority: EventPriority = EventPriority.NORMAL, priority: EventPriority = EventPriority.NORMAL,
handler: java.util.function.Function<E, ListeningStatus> handler: java.util.function.Function<E, ListeningStatus>,
): Listener<E> = subscribeInternal( ): Listener<E> = subscribeInternal(
eventClass.kotlin, eventClass.kotlin,
createListener(coroutineContext, concurrency, priority) { event -> createListener(coroutineContext, concurrency, priority) { event ->
@ -556,7 +557,7 @@ public open class EventChannel<out BaseEvent : Event> @JvmOverloads internal con
coroutineContext: CoroutineContext = EmptyCoroutineContext, coroutineContext: CoroutineContext = EmptyCoroutineContext,
concurrency: ConcurrencyKind = CONCURRENT, concurrency: ConcurrencyKind = CONCURRENT,
priority: EventPriority = EventPriority.NORMAL, priority: EventPriority = EventPriority.NORMAL,
handler: Consumer<E> handler: Consumer<E>,
): Listener<E> = subscribeInternal( ): Listener<E> = subscribeInternal(
eventClass.kotlin, eventClass.kotlin,
createListener(coroutineContext, concurrency, priority) { event -> createListener(coroutineContext, concurrency, priority) { event ->
@ -599,7 +600,7 @@ public open class EventChannel<out BaseEvent : Event> @JvmOverloads internal con
coroutineContext: CoroutineContext, coroutineContext: CoroutineContext,
concurrencyKind: ConcurrencyKind, concurrencyKind: ConcurrencyKind,
priority: EventPriority = EventPriority.NORMAL, priority: EventPriority = EventPriority.NORMAL,
handler: suspend (E) -> ListeningStatus handler: suspend (E) -> ListeningStatus,
): Listener<E> { ): Listener<E> {
val context = this.defaultCoroutineContext + coroutineContext val context = this.defaultCoroutineContext + coroutineContext
return Handler( return Handler(