From 3dafb8ea9098e20e6a716c18303d8022f2f4b7ec Mon Sep 17 00:00:00 2001 From: Him188 Date: Thu, 9 Apr 2020 08:46:10 +0800 Subject: [PATCH] Add subscribers for TempMessage --- .../event/subscribeMessages.kt | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) 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 50dd37c9f..44ac0ba08 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 @@ -23,6 +23,7 @@ import net.mamoe.mirai.event.events.BotEvent import net.mamoe.mirai.message.ContactMessage import net.mamoe.mirai.message.FriendMessage import net.mamoe.mirai.message.GroupMessage +import net.mamoe.mirai.message.TempMessage import net.mamoe.mirai.message.data.Message import net.mamoe.mirai.message.data.firstIsInstance import net.mamoe.mirai.utils.SinceMirai @@ -115,6 +116,31 @@ fun CoroutineScope.subscribeFriendMessages( }.run(listeners) } +typealias TempMessageSubscribersBuilder = MessageSubscribersBuilder, Unit, Unit> + +/** + * 订阅来自所有 [Bot] 的所有临时会话消息事件 + * + * @see CoroutineScope.incoming 打开一个指定事件的接收通道 + */ +@OptIn(ExperimentalContracts::class) +fun CoroutineScope.subscribeTempMessages( + coroutineContext: CoroutineContext = EmptyCoroutineContext, + concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + listeners: TempMessageSubscribersBuilder.() -> R +): R { + contract { + callsInPlace(listeners, InvocationKind.EXACTLY_ONCE) + } + return TempMessageSubscribersBuilder(Unit) { filter, listener -> + subscribeAlways(coroutineContext, concurrencyKind) { + val toString = this.message.contentToString() + if (filter(this, toString)) + listener(this, toString) + } + }.run(listeners) +} + /** * 订阅来自这个 [Bot] 的所有联系人的消息事件. 联系人可以是任意群或任意好友或临时会话. * @@ -186,6 +212,31 @@ fun Bot.subscribeFriendMessages( }.run(listeners) } + +/** + * 订阅来自这个 [Bot] 的所有临时会话消息事件. + * + * @see CoroutineScope.incoming 打开一个指定事件的接收通道 + */ +@SinceMirai("0.35.0") +@OptIn(ExperimentalContracts::class) +fun Bot.subscribeTempMessages( + coroutineContext: CoroutineContext = EmptyCoroutineContext, + concurrencyKind: Listener.ConcurrencyKind = Listener.ConcurrencyKind.CONCURRENT, + listeners: TempMessageSubscribersBuilder.() -> R +): R { + contract { + callsInPlace(listeners, InvocationKind.EXACTLY_ONCE) + } + return TempMessageSubscribersBuilder(Unit) { filter, listener -> + this.subscribeAlways(coroutineContext, concurrencyKind) { + val toString = this.message.contentToString() + if (filter(this, toString)) + listener(this, toString) + } + }.run(listeners) +} + /** * 打开一个指定事件的接收通道 * @@ -582,6 +633,10 @@ open class MessageSubscribersBuilder( @MessageDsl fun sentByFriend(): ListeningFilter = newListeningFilter { this is FriendMessage } + /** 如果是好友发来的消息 */ + @MessageDsl + fun sentByTemp(): ListeningFilter = newListeningFilter { this is TempMessage } + /** 如果是管理员或群主发的消息 */ @MessageDsl fun sentByOperator(): ListeningFilter =