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.complete 或 Listener.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 为调用本函数时的 receiver 的 CoroutineScope.coroutineContext. 因此:
注意: 事件处理是 suspend
的, 请规范处理 JVM 阻塞方法.
coroutineContext
- 给事件监听协程的额外的 CoroutineContext.
concurrency
- 并发类型. 查看 Listener.ConcurrencyKind
See Also
@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