Bläddra i källkod

[core] Fix private message source target

Karlatemp 3 år sedan
förälder
incheckning
89fa2f7ffb

+ 9 - 12
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;
 }
 

+ 9 - 12
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;
 }
 

+ 50 - 7
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, FromFriend>(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, FromTemp>(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, FromStranger>(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, FromGroup>(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

+ 89 - 7
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<MsgComm.Msg>,
+    private val msg: List<MsgComm.Msg>,
 ) : OnlineMessageSource.Incoming.FromFriend(), IncomingMessageSourceInternal {
     object Serializer : KSerializer<MessageSource> 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<MsgComm.Msg>,
+    private val msg: List<MsgComm.Msg>,
 ) : OnlineMessageSource.Incoming.FromStranger(), IncomingMessageSourceInternal {
     object Serializer : KSerializer<MessageSource> 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<MsgComm.Msg>,
+    private val msg: List<MsgComm.Msg>,
 ) : OnlineMessageSource.Incoming.FromTemp(), IncomingMessageSourceInternal {
     object Serializer : KSerializer<MessageSource> 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