diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/subscribeMessages.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/subscribeMessages.kt index 7d4e60e19..c61677db1 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/subscribeMessages.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/subscribeMessages.kt @@ -21,6 +21,7 @@ import net.mamoe.mirai.message.FriendMessageEvent import net.mamoe.mirai.message.GroupMessageEvent import net.mamoe.mirai.message.MessageEvent import net.mamoe.mirai.message.TempMessageEvent +import net.mamoe.mirai.utils.PlannedRemoval import kotlin.contracts.ExperimentalContracts import kotlin.contracts.InvocationKind import kotlin.contracts.contract @@ -38,6 +39,7 @@ typealias MessagePacketSubscribersBuilder = MessageSubscribersBuilder CoroutineScope.subscribeMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + priority: Listener.EventPriority = Listener.EventPriority.NORMAL, listeners: MessagePacketSubscribersBuilder.() -> R ): R { // contract 可帮助 IDE 进行类型推断. 无实际代码作用. @@ -49,7 +51,7 @@ fun CoroutineScope.subscribeMessages( { filter, messageListener: MessageListener -> // subscribeAlways 即注册一个监听器. 这个监听器收到消息后就传递给 [messageListener] // messageListener 即为 DSL 里 `contains(...) { }`, `startsWith(...) { }` 的代码块. - subscribeAlways(coroutineContext, concurrencyKind) { + subscribeAlways(coroutineContext, concurrencyKind, priority) { // this.message.contentToString() 即为 messageListener 中 it 接收到的值 val toString = this.message.contentToString() if (filter.invoke(this, toString)) @@ -69,13 +71,14 @@ typealias GroupMessageSubscribersBuilder = MessageSubscribersBuilder CoroutineScope.subscribeGroupMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + priority: Listener.EventPriority = Listener.EventPriority.NORMAL, listeners: GroupMessageSubscribersBuilder.() -> R ): R { contract { callsInPlace(listeners, InvocationKind.EXACTLY_ONCE) } return GroupMessageSubscribersBuilder(Unit) { filter, listener -> - subscribeAlways(coroutineContext, concurrencyKind) { + subscribeAlways(coroutineContext, concurrencyKind, priority) { val toString = this.message.contentToString() if (filter(this, toString)) listener(this, toString) @@ -94,13 +97,14 @@ typealias FriendMessageSubscribersBuilder = MessageSubscribersBuilder CoroutineScope.subscribeFriendMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + priority: Listener.EventPriority = Listener.EventPriority.NORMAL, listeners: FriendMessageSubscribersBuilder.() -> R ): R { contract { callsInPlace(listeners, InvocationKind.EXACTLY_ONCE) } return FriendMessageSubscribersBuilder(Unit) { filter, listener -> - subscribeAlways(coroutineContext, concurrencyKind) { + subscribeAlways(coroutineContext, concurrencyKind, priority) { val toString = this.message.contentToString() if (filter(this, toString)) listener(this, toString) @@ -119,13 +123,14 @@ typealias TempMessageSubscribersBuilder = MessageSubscribersBuilder CoroutineScope.subscribeTempMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + priority: Listener.EventPriority = Listener.EventPriority.NORMAL, listeners: TempMessageSubscribersBuilder.() -> R ): R { contract { callsInPlace(listeners, InvocationKind.EXACTLY_ONCE) } return TempMessageSubscribersBuilder(Unit) { filter, listener -> - subscribeAlways(coroutineContext, concurrencyKind) { + subscribeAlways(coroutineContext, concurrencyKind, priority) { val toString = this.message.contentToString() if (filter(this, toString)) listener(this, toString) @@ -142,13 +147,14 @@ fun CoroutineScope.subscribeTempMessages( fun Bot.subscribeMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + priority: Listener.EventPriority = Listener.EventPriority.NORMAL, listeners: MessagePacketSubscribersBuilder.() -> R ): R { contract { callsInPlace(listeners, InvocationKind.EXACTLY_ONCE) } return MessagePacketSubscribersBuilder(Unit) { filter, listener -> - this.subscribeAlways(coroutineContext, concurrencyKind) { + this.subscribeAlways(coroutineContext, concurrencyKind, priority) { val toString = this.message.contentToString() if (filter(this, toString)) listener(this, toString) @@ -167,13 +173,14 @@ fun Bot.subscribeMessages( fun Bot.subscribeGroupMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + priority: Listener.EventPriority = Listener.EventPriority.NORMAL, listeners: GroupMessageSubscribersBuilder.() -> R ): R { contract { callsInPlace(listeners, InvocationKind.EXACTLY_ONCE) } return GroupMessageSubscribersBuilder(Unit) { filter, listener -> - this.subscribeAlways(coroutineContext, concurrencyKind) { + this.subscribeAlways(coroutineContext, concurrencyKind, priority) { val toString = this.message.contentToString() if (filter(this, toString)) listener(this, toString) @@ -190,13 +197,14 @@ fun Bot.subscribeGroupMessages( fun Bot.subscribeFriendMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + priority: Listener.EventPriority = Listener.EventPriority.NORMAL, listeners: FriendMessageSubscribersBuilder.() -> R ): R { contract { callsInPlace(listeners, InvocationKind.EXACTLY_ONCE) } return FriendMessageSubscribersBuilder(Unit) { filter, listener -> - this.subscribeAlways(coroutineContext, concurrencyKind) { + this.subscribeAlways(coroutineContext, concurrencyKind, priority) { val toString = this.message.contentToString() if (filter(this, toString)) listener(this, toString) @@ -214,13 +222,14 @@ fun Bot.subscribeFriendMessages( fun Bot.subscribeTempMessages( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + priority: Listener.EventPriority = Listener.EventPriority.NORMAL, listeners: TempMessageSubscribersBuilder.() -> R ): R { contract { callsInPlace(listeners, InvocationKind.EXACTLY_ONCE) } return TempMessageSubscribersBuilder(Unit) { filter, listener -> - this.subscribeAlways(coroutineContext, concurrencyKind) { + this.subscribeAlways(coroutineContext, concurrencyKind, priority) { val toString = this.message.contentToString() if (filter(this, toString)) listener(this, toString) @@ -243,10 +252,11 @@ fun Bot.subscribeTempMessages( inline fun CoroutineScope.incoming( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + priority: Listener.EventPriority = Listener.EventPriority.NORMAL, capacity: Int = Channel.UNLIMITED ): ReceiveChannel { return Channel(capacity).apply { - val listener = this@incoming.subscribeAlways(coroutineContext, concurrencyKind) { + val listener = this@incoming.subscribeAlways(coroutineContext, concurrencyKind, priority) { send(this) } this.invokeOnClose { @@ -271,14 +281,80 @@ inline fun CoroutineScope.incoming( inline fun Bot.incoming( coroutineContext: CoroutineContext = EmptyCoroutineContext, concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + priority: Listener.EventPriority = Listener.EventPriority.NORMAL, capacity: Int = Channel.UNLIMITED ): ReceiveChannel { return Channel(capacity).apply { - val listener = this@incoming.subscribeAlways(coroutineContext, concurrencyKind) { + val listener = this@incoming.subscribeAlways(coroutineContext, concurrencyKind, priority) { send(this) } this.invokeOnClose { listener.cancel(CancellationException("ReceiveChannel closed", it)) } } -} \ No newline at end of file +} + + +@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) +@PlannedRemoval("1.2.0") +fun CoroutineScope.subscribeMessages( + coroutineContext: CoroutineContext = EmptyCoroutineContext, + concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + listeners: MessagePacketSubscribersBuilder.() -> R +): R = this.subscribeMessages(coroutineContext, concurrencyKind, Listener.EventPriority.MONITOR, listeners) + +@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) +@PlannedRemoval("1.2.0") +fun CoroutineScope.subscribeGroupMessages( + coroutineContext: CoroutineContext = EmptyCoroutineContext, + concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + listeners: GroupMessageSubscribersBuilder.() -> R +): R = this.subscribeGroupMessages(coroutineContext, concurrencyKind, Listener.EventPriority.MONITOR, listeners) + +@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) +@PlannedRemoval("1.2.0") +fun CoroutineScope.subscribeFriendMessages( + coroutineContext: CoroutineContext = EmptyCoroutineContext, + concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + listeners: FriendMessageSubscribersBuilder.() -> R +): R = this.subscribeFriendMessages(coroutineContext, concurrencyKind, Listener.EventPriority.MONITOR, listeners) + +@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) +@PlannedRemoval("1.2.0") +fun CoroutineScope.subscribeTempMessages( + coroutineContext: CoroutineContext = EmptyCoroutineContext, + concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + listeners: TempMessageSubscribersBuilder.() -> R +): R = this.subscribeTempMessages(coroutineContext, concurrencyKind, Listener.EventPriority.MONITOR, listeners) + +@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) +@PlannedRemoval("1.2.0") +fun Bot.subscribeMessages( + coroutineContext: CoroutineContext = EmptyCoroutineContext, + concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + listeners: MessagePacketSubscribersBuilder.() -> R +): R = this.subscribeMessages(coroutineContext, concurrencyKind, Listener.EventPriority.MONITOR, listeners) + +@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) +@PlannedRemoval("1.2.0") +fun Bot.subscribeGroupMessages( + coroutineContext: CoroutineContext = EmptyCoroutineContext, + concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + listeners: GroupMessageSubscribersBuilder.() -> R +): R = this.subscribeGroupMessages(coroutineContext, concurrencyKind, Listener.EventPriority.MONITOR, listeners) + +@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) +@PlannedRemoval("1.2.0") +fun Bot.subscribeFriendMessages( + coroutineContext: CoroutineContext = EmptyCoroutineContext, + concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + listeners: FriendMessageSubscribersBuilder.() -> R +): R = this.subscribeFriendMessages(coroutineContext, concurrencyKind, Listener.EventPriority.MONITOR, listeners) + +@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN) +@PlannedRemoval("1.2.0") +fun Bot.subscribeTempMessages( + coroutineContext: CoroutineContext = EmptyCoroutineContext, + concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + listeners: TempMessageSubscribersBuilder.() -> R +): R = this.subscribeTempMessages(coroutineContext, concurrencyKind, Listener.EventPriority.MONITOR, listeners) \ No newline at end of file