From 5cd3178c3f53ce1e32e60c10a502706dfa58b4ff Mon Sep 17 00:00:00 2001 From: Him188 Date: Wed, 6 May 2020 12:38:30 +0800 Subject: [PATCH] Make `Message.get` returns `M?` instead of `M`; Deprecate `Message.getOrNull` in favor of `Message.get`; Add `Message.getOrFail` --- .../mirai/qqandroid/message/convension.kt | 4 +- .../message/FriendMessageEvent.kt | 2 +- .../message/GroupMessageEvent.kt | 2 +- .../net.mamoe.mirai/message/MessageEvent.kt | 5 --- .../message/TempMessageEvent.kt | 2 +- .../message/data/MessageChain.kt | 38 +++++++++++++------ .../message/data/MessageSource.kt | 20 +++++----- 7 files changed, 41 insertions(+), 32 deletions(-) diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/convension.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/convension.kt index 56867c3ba..c2770bee5 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/convension.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/convension.kt @@ -38,10 +38,10 @@ private val UNSUPPORTED_FLASH_MESSAGE_PLAIN = PlainText("[闪照]请使用新版 @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") @OptIn(MiraiInternalAPI::class, MiraiExperimentalAPI::class) internal fun MessageChain.toRichTextElems(forGroup: Boolean, withGeneralFlags: Boolean): MutableList { - val elements = mutableListOf() + val elements = ArrayList(this.size) if (this.anyIsInstance()) { - when (val source = this[QuoteReply].source) { + when (val source = this[QuoteReply]!!.source) { is MessageSourceInternal -> elements.add(ImMsgBody.Elem(srcMsg = source.toJceData())) else -> error("unsupported MessageSource implementation: ${source::class.simpleName}. Don't implement your own MessageSource.") } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/FriendMessageEvent.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/FriendMessageEvent.kt index 27d0a52d7..e73100916 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/FriendMessageEvent.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/FriendMessageEvent.kt @@ -32,7 +32,7 @@ class FriendMessageEvent constructor( ) : @PlannedRemoval("1.2.0") FriendMessage(), BroadcastControllable { init { val source = - message.getOrNull(MessageSource) ?: throw IllegalArgumentException("Cannot find MessageSource from message") + message[MessageSource] ?: throw IllegalArgumentException("Cannot find MessageSource from message") check(source is OnlineMessageSource.Incoming.FromFriend) { "source provided to a FriendMessage must be an instance of OnlineMessageSource.Incoming.FromFriend" } } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/GroupMessageEvent.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/GroupMessageEvent.kt index 5ff44d665..d73a0ed0c 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/GroupMessageEvent.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/GroupMessageEvent.kt @@ -35,7 +35,7 @@ class GroupMessageEvent( override val time: Int ) : @PlannedRemoval("1.2.0") GroupMessage(), Event { init { - val source = message.getOrNull(MessageSource) ?: error("Cannot find MessageSource from message") + val source = message[MessageSource] ?: error("Cannot find MessageSource from message") check(source is OnlineMessageSource.Incoming.FromGroup) { "source provided to a GroupMessage must be an instance of OnlineMessageSource.Incoming.FromGroup" } } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessageEvent.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessageEvent.kt index 775affd92..707f281ef 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessageEvent.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessageEvent.kt @@ -135,11 +135,6 @@ interface MessageEventExtensions : @JvmSynthetic suspend inline fun quoteReply(plain: String): MessageReceipt = reply(this.message.quote() + plain) - @JvmSynthetic - inline operator fun get(at: Message.Key): M { - return this.message[at] - } - @JvmSynthetic inline fun At.isBot(): Boolean = target == bot.id diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/TempMessageEvent.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/TempMessageEvent.kt index 8455479e1..a68fb329f 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/TempMessageEvent.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/TempMessageEvent.kt @@ -23,7 +23,7 @@ class TempMessageEvent( override val time: Int ) : TempMessage(), BroadcastControllable { init { - val source = message.getOrNull(MessageSource) ?: error("Cannot find MessageSource from message") + val source = message[MessageSource] ?: error("Cannot find MessageSource from message") check(source is OnlineMessageSource.Incoming.FromTemp) { "source provided to a TempMessage must be an instance of OnlineMessageSource.Incoming.FromTemp" } } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt index c92f3868b..50ddacf0b 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt @@ -20,6 +20,7 @@ import net.mamoe.mirai.utils.MiraiInternalAPI import kotlin.js.JsName import kotlin.jvm.JvmMultifileClass import kotlin.jvm.JvmName +import kotlin.jvm.JvmOverloads import kotlin.jvm.JvmSynthetic import kotlin.reflect.KProperty @@ -46,23 +47,13 @@ interface MessageChain : Message, Iterable { val size: Int /** - * 获取第一个类型为 [key] 的 [Message] 实例 + * 获取第一个类型为 [key] 的 [Message] 实例. 若不存在此实例, 返回 `null` * * @param key 由各个类型消息的伴生对象持有. 如 [PlainText.Key] - * @throws NoSuchElementException 当找不到这个类型的 [Message] 时 */ @Suppress("WRONG_MODIFIER_CONTAINING_DECLARATION", "INAPPLICABLE_JVM_NAME") @JvmName("first") - final operator fun get(key: Message.Key): M = first(key) - - /** - * 获取第一个类型为 [key] 的 [Message] 实例, 找不到则返回 `null` - * - * @param key 由各个类型消息的伴生对象持有. 如 [PlainText.Key] - */ - @Suppress("WRONG_MODIFIER_CONTAINING_DECLARATION", "INAPPLICABLE_JVM_NAME") - @JvmName("firstOrNull") - final fun getOrNull(key: Message.Key): M? = firstOrNull(key) + final operator fun get(key: Message.Key): M? = firstOrNull(key) /** * 遍历每一个有内容的消息, 即 [At], [AtAll], [PlainText], [Image], [Face] 等 @@ -87,10 +78,33 @@ interface MessageChain : Message, Iterable { final fun __forEachForJava__(block: (Message) -> Unit) { this.forEach(block) } + + + /** + * 获取第一个类型为 [key] 的 [Message] 实例, 找不到则返回 `null` + * + * @param key 由各个类型消息的伴生对象持有. 如 [PlainText.Key] + */ + @Suppress("WRONG_MODIFIER_CONTAINING_DECLARATION", "INAPPLICABLE_JVM_NAME") + @JvmName("firstOrNull") + @Deprecated("use get", ReplaceWith("get(key)")) + final fun getOrNull(key: Message.Key): M? = get(key) } // region accessors +/** + * 获取第一个类型为 [key] 的 [Message] 实例 + * + * @param key 由各个类型消息的伴生对象持有. 如 [PlainText.Key] + */ +@JvmOverloads +inline fun MessageChain.getOrFail( + key: Message.Key, + crossinline lazyMessage: (key: Message.Key) -> String = { key.typeName } +): M = firstOrNull(key) ?: throw NoSuchElementException(lazyMessage(key)) + + /** * 遍历每一个 [消息内容][MessageContent] */ diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSource.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSource.kt index 1ae2b40df..65a06ee85 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSource.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSource.kt @@ -109,17 +109,17 @@ sealed class MessageSource : Message, MessageMetadata, ConstrainSingle