mirai-core / net.mamoe.mirai.event / kotlinx.coroutines.CoroutineScope / subscribe

subscribe

inline fun <reified E : Event> CoroutineScope.subscribe(coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrency: ConcurrencyKind = Listener.ConcurrencyKind.LOCKED, noinline handler: suspend E.(E) -> ListeningStatus): Listener<E>

在指定的 CoroutineScope 下订阅所有 E 及其子类事件. 每当 事件广播 时, handler 都会被执行.

handler 返回 ListeningStatus.STOPPED 时停止监听. 或 Listener.complete 后结束.

这个函数返回 Listener, 它是一个 CompletableJob. 请注意它除非被 Listener.completeListener.cancel, 则不会完成. 例:

runBlocking { // this: CoroutineScope
  subscribe<Event> { /* 一些处理 */} // 返回 Listener, 即 CompletableJob
}
foo()

runBlocking 不会结束, 也就是下一行 foo() 不会被执行. 直到监听时创建的 Listener 被停止.

要创建一个仅在某个机器人在线时的监听, 请在 Bot 下调用本函数 (因为 Bot 也实现 CoroutineScope). 这种方式创建的监听会自动筛选 Bot.

bot1.subscribe<BotEvent> { /* 只会处理来自 bot1 的事件 */}

要创建一个全局都存在的监听(不推荐), 即守护协程, 请在 GlobalScope 下调用本函数:

GlobalScope.subscribe<Event> { /* 会收到来自全部 Bot 的事件和与 Bot 不相关的事件 */}

事件处理时的 CoroutineContext 为调用本函数时的 receiverCoroutineScope.coroutineContext. 因此:

注意: 事件处理是 suspend 的, 请规范处理 JVM 阻塞方法.

Parameters

coroutineContext - 给事件监听协程的额外的 CoroutineContext.

concurrency - 并发类型. 查看 Listener.ConcurrencyKind

See Also

syncFromEvent

asyncFromEvent

selectMessages

whileSelectMessages

subscribeAlways

subscribeOnce

subscribeMessages

subscribeGroupMessages

subscribeFriendMessages

@SinceMirai("0.38.0") fun <E : Event> CoroutineScope.subscribe(eventClass: KClass<E>, coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrency: ConcurrencyKind = Listener.ConcurrencyKind.LOCKED, handler: suspend E.(E) -> ListeningStatus): Listener<E>

See Also

CoroutineScope.subscribe