Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[core] Fix message source logic #2513

Merged
merged 13 commits into from
Mar 29, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
[core] Fix private message source target
  • Loading branch information
Karlatemp committed Mar 29, 2023
commit 89fa2f7ffb406ea2e7ea9d3465fe13e4f55c7dcf
21 changes: 9 additions & 12 deletions mirai-core-api/compatibility-validation/android/api/android.api
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

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

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

Expand Down
21 changes: 9 additions & 12 deletions mirai-core-api/compatibility-validation/jvm/api/jvm.api
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

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

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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]"
Expand All @@ -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]"
}
Expand All @@ -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]"
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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")

Expand All @@ -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) }

Expand All @@ -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")

Expand All @@ -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) }

Expand Down Expand Up @@ -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")

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

Expand Down