From 0be36f71b8741046474a87f9d56c8676a636bc36 Mon Sep 17 00:00:00 2001 From: Him188 Date: Mon, 17 Feb 2020 14:13:18 +0800 Subject: [PATCH 1/3] More useful `.incoming` --- .../kotlin/net.mamoe.mirai/event/MessageSubscribers.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/MessageSubscribers.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/MessageSubscribers.kt index 1c32ad94b..052e5ebe3 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/MessageSubscribers.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/MessageSubscribers.kt @@ -129,9 +129,11 @@ inline fun Bot.subscribeFriendMessages(crossinline listeners: MessageSubscri /** * 返回一个指定事件的接收通道 + * + * @param capacity 同 [Channel] 的参数, 参见 [Channel.Factory] 中的常量. */ -inline fun Bot.incoming(): ReceiveChannel { - return Channel(8).apply { +inline fun CoroutineScope.incoming(capacity: Int = Channel.RENDEZVOUS): ReceiveChannel { + return Channel(capacity).apply { subscribeAlways { send(this) } From 69ff37765458c89fa77998e6052687cdaa346c92 Mon Sep 17 00:00:00 2001 From: Him188 Date: Mon, 17 Feb 2020 14:14:16 +0800 Subject: [PATCH 2/3] Add references --- .../net.mamoe.mirai/event/MessageSubscribers.kt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/MessageSubscribers.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/MessageSubscribers.kt index 052e5ebe3..5cb5489c0 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/MessageSubscribers.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/MessageSubscribers.kt @@ -28,6 +28,8 @@ import kotlin.contracts.contract /** * 订阅来自所有 [Bot] 的所有联系人的消息事件. 联系人可以是任意群或任意好友或临时会话. + * + * @see CoroutineScope.incoming */ @UseExperimental(ExperimentalContracts::class) @MessageDsl @@ -49,6 +51,8 @@ inline fun CoroutineScope.subscribeMessages(crossinline listeners: MessageSu /** * 订阅来自所有 [Bot] 的所有群消息事件 + * + * @see CoroutineScope.incoming */ @UseExperimental(ExperimentalContracts::class) @MessageDsl @@ -65,6 +69,8 @@ inline fun CoroutineScope.subscribeGroupMessages(crossinline listeners: Mess /** * 订阅来自所有 [Bot] 的所有好友消息事件 + * + * @see CoroutineScope.incoming */ @UseExperimental(ExperimentalContracts::class) @MessageDsl @@ -81,6 +87,8 @@ inline fun CoroutineScope.subscribeFriendMessages(crossinline listeners: Mes /** * 订阅来自这个 [Bot] 的所有联系人的消息事件. 联系人可以是任意群或任意好友或临时会话. + * + * @see CoroutineScope.incoming */ @UseExperimental(ExperimentalContracts::class) @MessageDsl @@ -97,6 +105,8 @@ inline fun Bot.subscribeMessages(crossinline listeners: MessageSubscribersBu /** * 订阅来自这个 [Bot] 的所有群消息事件 + * + * @see CoroutineScope.incoming */ @UseExperimental(ExperimentalContracts::class) @MessageDsl @@ -113,6 +123,8 @@ inline fun Bot.subscribeGroupMessages(crossinline listeners: MessageSubscrib /** * 订阅来自这个 [Bot] 的所有好友消息事件. + * + * @see CoroutineScope.incoming */ @UseExperimental(ExperimentalContracts::class) @MessageDsl @@ -131,6 +143,10 @@ inline fun Bot.subscribeFriendMessages(crossinline listeners: MessageSubscri * 返回一个指定事件的接收通道 * * @param capacity 同 [Channel] 的参数, 参见 [Channel.Factory] 中的常量. + * + * @see subscribeFriendMessages + * @see subscribeMessages + * @see subscribeGroupMessages */ inline fun CoroutineScope.incoming(capacity: Int = Channel.RENDEZVOUS): ReceiveChannel { return Channel(capacity).apply { From efa404d0d3c5b186c5874e611a2363044c85df07 Mon Sep 17 00:00:00 2001 From: Him188 Date: Mon, 17 Feb 2020 18:36:08 +0800 Subject: [PATCH 3/3] Try fix compilation bug --- .../event/internal/InternalEventListeners.kt | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/internal/InternalEventListeners.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/internal/InternalEventListeners.kt index c72941469..e439a0974 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/internal/InternalEventListeners.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/internal/InternalEventListeners.kt @@ -90,6 +90,15 @@ internal object EventListenerManager { private val lock = atomic(false) + private fun setLockValue(value: Boolean) { + lock.value = value + } + + @Suppress("BooleanLiteralArgument") + private fun trySetLockTrue(): Boolean { + return lock.compareAndSet(false, true) + } + @Suppress("UNCHECKED_CAST", "BooleanLiteralArgument") internal tailrec fun get(clazz: KClass): EventListeners { registries.forEach { @@ -97,10 +106,10 @@ internal object EventListenerManager { return it.listeners as EventListeners } } - if (lock.compareAndSet(false, true)) { + if (trySetLockTrue()) { val registry = Registry(clazz, EventListeners()) registries.addLast(registry) - lock.value = false + setLockValue(false) return registry.listeners as EventListeners } return get(clazz)