1
0
mirror of https://github.com/mamoe/mirai.git synced 2025-04-24 20:43:33 +08:00

[core] Fix private message source target

This commit is contained in:
Karlatemp 2023-03-24 00:33:09 +08:00
parent b8321870aa
commit 89fa2f7ffb
No known key found for this signature in database
GPG Key ID: BA173CA2B9956C59
4 changed files with 157 additions and 38 deletions
mirai-core-api
compatibility-validation
android/api
jvm/api
src/commonMain/kotlin/message/data
mirai-core/src/commonMain/kotlin/message/source

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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

View File

@ -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