diff --git a/mirai-core-api/compatibility-validation/android/api/android.api b/mirai-core-api/compatibility-validation/android/api/android.api index 1ccd73be6..1cbb1f9fc 100644 --- a/mirai-core-api/compatibility-validation/android/api/android.api +++ b/mirai-core-api/compatibility-validation/android/api/android.api @@ -4817,10 +4817,9 @@ public abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming public abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromFriend : net/mamoe/mirai/message/data/OnlineMessageSource$Incoming { public static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromFriend$Key; public abstract fun getSender ()Lnet/mamoe/mirai/contact/Friend; - public synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact; - public final fun getSubject ()Lnet/mamoe/mirai/contact/Friend; - public final fun getTarget ()Lnet/mamoe/mirai/Bot; - public synthetic fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot; + public abstract fun getSubject ()Lnet/mamoe/mirai/contact/Friend; + public final synthetic fun getTarget ()Lnet/mamoe/mirai/Bot; + public abstract fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot; public final fun toString ()Ljava/lang/String; } @@ -4844,10 +4843,9 @@ public final class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$Fro public abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromStranger : net/mamoe/mirai/message/data/OnlineMessageSource$Incoming { public static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromStranger$Key; public abstract fun getSender ()Lnet/mamoe/mirai/contact/Stranger; - public synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact; - public final fun getSubject ()Lnet/mamoe/mirai/contact/Stranger; - public final fun getTarget ()Lnet/mamoe/mirai/Bot; - public synthetic fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot; + public abstract fun getSubject ()Lnet/mamoe/mirai/contact/Stranger; + public final synthetic fun getTarget ()Lnet/mamoe/mirai/Bot; + public abstract fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot; public final fun toString ()Ljava/lang/String; } @@ -4858,10 +4856,9 @@ public abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$ public static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromTemp$Key; public final fun getGroup ()Lnet/mamoe/mirai/contact/Group; public abstract fun getSender ()Lnet/mamoe/mirai/contact/Member; - public synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact; - public final fun getSubject ()Lnet/mamoe/mirai/contact/Member; - public final fun getTarget ()Lnet/mamoe/mirai/Bot; - public synthetic fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot; + public abstract fun getSubject ()Lnet/mamoe/mirai/contact/Member; + public final synthetic fun getTarget ()Lnet/mamoe/mirai/Bot; + public abstract fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot; public final fun toString ()Ljava/lang/String; } diff --git a/mirai-core-api/compatibility-validation/jvm/api/jvm.api b/mirai-core-api/compatibility-validation/jvm/api/jvm.api index 9b3723b40..60293e0b7 100644 --- a/mirai-core-api/compatibility-validation/jvm/api/jvm.api +++ b/mirai-core-api/compatibility-validation/jvm/api/jvm.api @@ -4817,10 +4817,9 @@ public abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming public abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromFriend : net/mamoe/mirai/message/data/OnlineMessageSource$Incoming { public static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromFriend$Key; public abstract fun getSender ()Lnet/mamoe/mirai/contact/Friend; - public synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact; - public final fun getSubject ()Lnet/mamoe/mirai/contact/Friend; - public final fun getTarget ()Lnet/mamoe/mirai/Bot; - public synthetic fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot; + public abstract fun getSubject ()Lnet/mamoe/mirai/contact/Friend; + public final synthetic fun getTarget ()Lnet/mamoe/mirai/Bot; + public abstract fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot; public final fun toString ()Ljava/lang/String; } @@ -4844,10 +4843,9 @@ public final class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$Fro public abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromStranger : net/mamoe/mirai/message/data/OnlineMessageSource$Incoming { public static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromStranger$Key; public abstract fun getSender ()Lnet/mamoe/mirai/contact/Stranger; - public synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact; - public final fun getSubject ()Lnet/mamoe/mirai/contact/Stranger; - public final fun getTarget ()Lnet/mamoe/mirai/Bot; - public synthetic fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot; + public abstract fun getSubject ()Lnet/mamoe/mirai/contact/Stranger; + public final synthetic fun getTarget ()Lnet/mamoe/mirai/Bot; + public abstract fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot; public final fun toString ()Ljava/lang/String; } @@ -4858,10 +4856,9 @@ public abstract class net/mamoe/mirai/message/data/OnlineMessageSource$Incoming$ public static final field Key Lnet/mamoe/mirai/message/data/OnlineMessageSource$Incoming$FromTemp$Key; public final fun getGroup ()Lnet/mamoe/mirai/contact/Group; public abstract fun getSender ()Lnet/mamoe/mirai/contact/Member; - public synthetic fun getSubject ()Lnet/mamoe/mirai/contact/Contact; - public final fun getSubject ()Lnet/mamoe/mirai/contact/Member; - public final fun getTarget ()Lnet/mamoe/mirai/Bot; - public synthetic fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot; + public abstract fun getSubject ()Lnet/mamoe/mirai/contact/Member; + public final synthetic fun getTarget ()Lnet/mamoe/mirai/Bot; + public abstract fun getTarget ()Lnet/mamoe/mirai/contact/ContactOrBot; public final fun toString ()Ljava/lang/String; } diff --git a/mirai-core-api/src/commonMain/kotlin/message/data/OnlineMessageSource.kt b/mirai-core-api/src/commonMain/kotlin/message/data/OnlineMessageSource.kt index 95e3eb8e3..3dc0502e0 100644 --- a/mirai-core-api/src/commonMain/kotlin/message/data/OnlineMessageSource.kt +++ b/mirai-core-api/src/commonMain/kotlin/message/data/OnlineMessageSource.kt @@ -149,6 +149,9 @@ public sealed class OnlineMessageSource : MessageSource() { * 接收到的一条消息的 [MessageSource] */ public sealed class Incoming : OnlineMessageSource() { + /** + * 当 [sender] 为 [bot] 自身时为 bot 的对应表示 (如: [Bot.asFriend], [Bot.asStranger], [Group.botAsMember]) + */ public abstract override val sender: User /// NOTE: DONT use final to avoid contact not available @@ -160,9 +163,21 @@ public sealed class OnlineMessageSource : MessageSource() { public companion object Key : AbstractPolymorphicMessageKey(Incoming, { it.safeCast() }) + public abstract override val subject: Friend + + /** + * 当 [sender] 为 [bot] 自身时为 [Bot.asFriend] + */ public abstract override val sender: Friend - public final override val subject: Friend get() = sender - public final override val target: Bot get() = sender.bot + public abstract override val target: ContactOrBot + + @JvmName("getTarget") + @Deprecated("For ABI compatibility", level = DeprecationLevel.HIDDEN) + public fun getTargetLegacy(): Bot { + if (targetId == bot.id) return subject.bot + + error("Message target isn't bot; $this") + } final override fun toString(): String { return "[mirai:source:ids=${ids.contentToString()}, internalIds=${internalIds.contentToString()}, from friend $fromId to $targetId at $time]" @@ -174,10 +189,23 @@ public sealed class OnlineMessageSource : MessageSource() { public companion object Key : AbstractPolymorphicMessageKey(Incoming, { it.safeCast() }) + /** + * 当 [sender] 为 [bot] 自身时为 [Group.botAsMember] + */ public abstract override val sender: Member - public inline val group: Group get() = sender.group - public final override val subject: Member get() = sender - public final override val target: Bot get() = sender.bot + public abstract override val subject: Member + public abstract override val target: ContactOrBot + + public inline val group: Group get() = subject.group + + @JvmName("getTarget") + @Deprecated("For ABI compatibility", level = DeprecationLevel.HIDDEN) + public fun getTargetLegacy(): Bot { + if (targetId == bot.id) return subject.bot + + error("Message target isn't bot; $this") + } + final override fun toString(): String { return "[mirai:source:ids=${ids.contentToString()}, internalIds=${internalIds.contentToString()}, from group temp $fromId to $targetId at $time]" } @@ -188,9 +216,21 @@ public sealed class OnlineMessageSource : MessageSource() { public companion object Key : AbstractPolymorphicMessageKey(Incoming, { it.safeCast() }) + /** + * 当 [sender] 为 [bot] 自身时为 [Bot.asStranger] + */ public abstract override val sender: Stranger - public final override val subject: Stranger get() = sender - public final override val target: Bot get() = sender.bot + + public abstract override val subject: Stranger + public abstract override val target: ContactOrBot + + @JvmName("getTarget") + @Deprecated("For ABI compatibility", level = DeprecationLevel.HIDDEN) + public fun getTargetLegacy(): Bot { + if (targetId == bot.id) return subject.bot + + error("Message target isn't bot; $this") + } final override fun toString(): String { return "[mirai:source:ids=${ids.contentToString()}, internalIds=${internalIds.contentToString()}, from stranger $fromId to $targetId at $time]" @@ -202,6 +242,9 @@ public sealed class OnlineMessageSource : MessageSource() { public companion object Key : AbstractPolymorphicMessageKey(Incoming, { it.safeCast() }) + /** + * 当 [sender] 为 [bot] 自身时为 [Group.botAsMember] + */ public abstract override val sender: Member public override val subject: Group get() = sender.group public final override val target: Group get() = subject diff --git a/mirai-core/src/commonMain/kotlin/message/source/incomingSourceImpl.kt b/mirai-core/src/commonMain/kotlin/message/source/incomingSourceImpl.kt index 378204765..1f34a3f77 100644 --- a/mirai-core/src/commonMain/kotlin/message/source/incomingSourceImpl.kt +++ b/mirai-core/src/commonMain/kotlin/message/source/incomingSourceImpl.kt @@ -16,6 +16,7 @@ import kotlinx.serialization.KSerializer import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import net.mamoe.mirai.Bot +import net.mamoe.mirai.contact.ContactOrBot import net.mamoe.mirai.contact.Friend import net.mamoe.mirai.contact.Member import net.mamoe.mirai.contact.Stranger @@ -44,7 +45,7 @@ import net.mamoe.mirai.utils.structureToString @Serializable(OnlineMessageSourceFromFriendImpl.Serializer::class) internal class OnlineMessageSourceFromFriendImpl( override val bot: Bot, - msg: List, + private val msg: List, ) : OnlineMessageSource.Incoming.FromFriend(), IncomingMessageSourceInternal { object Serializer : KSerializer by MessageSourceSerializerImpl("OnlineMessageSourceFromFriend") @@ -65,7 +66,35 @@ internal class OnlineMessageSourceFromFriendImpl( override val isOriginalMessageInitialized: Boolean get() = originalMessageLazy.isInitialized() - override val sender: Friend = bot.getFriendOrFail(msg.first().msgHead.fromUin) + override val sender: Friend by lazy { + if (fromId == bot.id) { + bot.asFriend + } else { + bot.getFriendOrFail(fromId) + } + } + + override val subject: Friend by lazy { + if (fromId == bot.id) { + bot.getFriendOrFail(targetId) + } else { + bot.getFriendOrFail(fromId) + } + } + override val fromId: Long + get() = msg.first().msgHead.fromUin + + override val targetId: Long + get() = msg.first().msgHead.toUin + + override val target: ContactOrBot by lazy { + if (fromId == bot.id) { + bot.getFriendOrFail(targetId) + } else { + bot + } + } + private val jceData: ImMsgBody.SourceMsg by lazy { msg.toJceDataPrivate(internalIds) } @@ -80,7 +109,7 @@ internal class OnlineMessageSourceFromFriendImpl( @Serializable(OnlineMessageSourceFromStrangerImpl.Serializer::class) internal class OnlineMessageSourceFromStrangerImpl( override val bot: Bot, - msg: List, + private val msg: List, ) : OnlineMessageSource.Incoming.FromStranger(), IncomingMessageSourceInternal { object Serializer : KSerializer by MessageSourceSerializerImpl("OnlineMessageSourceFromStranger") @@ -102,7 +131,35 @@ internal class OnlineMessageSourceFromStrangerImpl( override val isOriginalMessageInitialized: Boolean get() = originalMessageLazy.isInitialized() - override val sender: Stranger = bot.getStrangerOrFail(msg.first().msgHead.fromUin) + override val sender: Stranger by lazy { + if (fromId == bot.id) { + bot.asStranger + } else { + bot.getStrangerOrFail(fromId) + } + } + + override val subject: Stranger by lazy { + if (fromId == bot.id) { + bot.getStrangerOrFail(targetId) + } else { + bot.getStrangerOrFail(fromId) + } + } + + override val fromId: Long + get() = msg.first().msgHead.fromUin + + override val targetId: Long + get() = msg.first().msgHead.toUin + + override val target: ContactOrBot by lazy { + if (fromId == bot.id) { + bot.getStrangerOrFail(targetId) + } else { + bot + } + } private val jceData: ImMsgBody.SourceMsg by lazy { msg.toJceDataPrivate(internalIds) } @@ -166,7 +223,7 @@ internal fun MsgComm.Msg.decodeRandom(): Int { @Serializable(OnlineMessageSourceFromTempImpl.Serializer::class) internal class OnlineMessageSourceFromTempImpl( override val bot: Bot, - msg: List, + private val msg: List, ) : OnlineMessageSource.Incoming.FromTemp(), IncomingMessageSourceInternal { object Serializer : KSerializer by MessageSourceSerializerImpl("OnlineMessageSourceFromTemp") @@ -188,15 +245,40 @@ internal class OnlineMessageSourceFromTempImpl( override val isOriginalMessageInitialized: Boolean get() = originalMessageLazy.isInitialized() - override val sender: Member = with(msg.first().msgHead) { + @Suppress("PropertyName") + private val _group = with(msg.first().msgHead) { // it must be uin, see #1410 // corresponding test: net.mamoe.mirai.internal.notice.processors.MessageTest.group temp message test 2 // search for group code also is for tests. code may be passed as uin in tests. // clashing is unlikely possible in real time, so it would not be a problem. - bot.asQQAndroidBot().getGroupByUinOrCodeOrFail(c2cTmpMsgHead!!.groupUin).getOrFail(fromUin) + bot.asQQAndroidBot().getGroupByUinOrCodeOrFail(c2cTmpMsgHead!!.groupUin) } + override val sender: Member by lazy { + _group.getOrFail(fromId) + } + + override val target: ContactOrBot by lazy { + if (fromId == botId) { + _group.getOrFail(targetId) + } else bot + } + + override val subject: Member by lazy { + if (fromId == botId) { + _group.getOrFail(targetId) + } else { + _group.getOrFail(fromId) + } + } + + override val fromId: Long + get() = msg.first().msgHead.fromUin + override val targetId: Long + get() = msg.first().msgHead.toUin + + private val jceData: ImMsgBody.SourceMsg by lazy { msg.toJceDataPrivate(internalIds) } override fun toJceData(): ImMsgBody.SourceMsg = jceData