From de4bbafbd49fb7a5483ba9d874759ca52d865843 Mon Sep 17 00:00:00 2001 From: Him188 Date: Sun, 27 Dec 2020 15:28:54 +0800 Subject: [PATCH] Unified FriendInfoImpl and MemberInfoImpl --- .../src/commonMain/kotlin/data/FriendInfo.kt | 9 ++++- mirai-core/src/commonMain/kotlin/MiraiImpl.kt | 6 +--- .../src/commonMain/kotlin/QQAndroidBot.kt | 7 ++-- .../commonMain/kotlin/contact/AbstractUser.kt | 2 +- .../commonMain/kotlin/contact/FriendImpl.kt | 16 ++++----- .../kotlin/contact/MemberInfoImpl.kt | 5 +-- .../network/QQAndroidBotNetworkHandler.kt | 2 +- .../chat/receive/MessageSvc.PbGetMsg.kt | 22 ++++++------ .../chat/receive/OnlinePush.PbPushTransMsg.kt | 34 +++++++------------ .../packet/chat/receive/OnlinePush.ReqPush.kt | 15 ++++---- 10 files changed, 56 insertions(+), 62 deletions(-) diff --git a/mirai-core-api/src/commonMain/kotlin/data/FriendInfo.kt b/mirai-core-api/src/commonMain/kotlin/data/FriendInfo.kt index efb98b480..96f4c592b 100644 --- a/mirai-core-api/src/commonMain/kotlin/data/FriendInfo.kt +++ b/mirai-core-api/src/commonMain/kotlin/data/FriendInfo.kt @@ -18,4 +18,11 @@ public interface FriendInfo { public val nick: String public val remark: String -} \ No newline at end of file +} + +@LowLevelApi +public open class FriendInfoImpl( + override val uin: Long, + override var nick: String, + override var remark: String, +) : FriendInfo \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/MiraiImpl.kt b/mirai-core/src/commonMain/kotlin/MiraiImpl.kt index bb0cdc12a..077349df3 100644 --- a/mirai-core/src/commonMain/kotlin/MiraiImpl.kt +++ b/mirai-core/src/commonMain/kotlin/MiraiImpl.kt @@ -679,11 +679,7 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor { blackList = blackList ).sendWithoutExpect() @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") - bot.friends.delegate.add(_lowLevelNewFriend(bot, object : FriendInfo { - override val uin: Long get() = fromId - override val nick: String get() = fromNick - override val remark: String get() = "" - })) + bot.friends.delegate.add(_lowLevelNewFriend(bot, FriendInfoImpl(fromId, fromNick, ""))) } } diff --git a/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt b/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt index a28c93a79..0c571874f 100644 --- a/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt +++ b/mirai-core/src/commonMain/kotlin/QQAndroidBot.kt @@ -20,6 +20,7 @@ import net.mamoe.mirai.contact.* import net.mamoe.mirai.data.* import net.mamoe.mirai.internal.contact.OtherClientImpl import net.mamoe.mirai.internal.contact.checkIsGroupImpl +import net.mamoe.mirai.internal.contact.uin import net.mamoe.mirai.internal.message.* import net.mamoe.mirai.internal.network.QQAndroidBotNetworkHandler import net.mamoe.mirai.internal.network.QQAndroidClient @@ -75,11 +76,7 @@ internal class QQAndroidBot constructor( override val asFriend: Friend by lazy { @OptIn(LowLevelApi::class) - Mirai._lowLevelNewFriend(this, object : FriendInfo { - override val uin: Long get() = this@QQAndroidBot.id - override val nick: String get() = this@QQAndroidBot.nick - override val remark: String get() = "" - }) + Mirai._lowLevelNewFriend(this, FriendInfoImpl(uin, nick, "")) } override val groups: ContactList = ContactList() diff --git a/mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt b/mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt index 80815ce62..8c73523f9 100644 --- a/mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt +++ b/mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt @@ -35,7 +35,7 @@ internal abstract class AbstractUser( friendInfo: net.mamoe.mirai.data.FriendInfo, ) : User, AbstractContact(bot, coroutineContext) { final override val id: Long = friendInfo.uin - final override val nick: String = friendInfo.nick + final override var nick: String = friendInfo.nick final override val remark: String = friendInfo.remark @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") diff --git a/mirai-core/src/commonMain/kotlin/contact/FriendImpl.kt b/mirai-core/src/commonMain/kotlin/contact/FriendImpl.kt index 85e9253cf..e0e77c431 100644 --- a/mirai-core/src/commonMain/kotlin/contact/FriendImpl.kt +++ b/mirai-core/src/commonMain/kotlin/contact/FriendImpl.kt @@ -23,6 +23,7 @@ import kotlinx.atomicfu.atomic import net.mamoe.mirai.LowLevelApi import net.mamoe.mirai.contact.Friend import net.mamoe.mirai.data.FriendInfo +import net.mamoe.mirai.data.FriendInfoImpl import net.mamoe.mirai.internal.QQAndroidBot import net.mamoe.mirai.message.MessageReceipt import net.mamoe.mirai.message.data.Message @@ -31,20 +32,19 @@ import kotlin.contracts.ExperimentalContracts import kotlin.contracts.contract import kotlin.coroutines.CoroutineContext -internal class FriendInfoImpl( - @JvmField private val jceFriendInfo: net.mamoe.mirai.internal.network.protocol.data.jce.FriendInfo -) : FriendInfo { - override var nick: String = jceFriendInfo.nick - override val uin: Long get() = jceFriendInfo.friendUin - override var remark: String = jceFriendInfo.remark -} +internal fun net.mamoe.mirai.internal.network.protocol.data.jce.FriendInfo.toMiraiFriendInfo(): FriendInfoImpl = + FriendInfoImpl( + friendUin, + nick, + remark + ) @OptIn(ExperimentalContracts::class) internal inline fun FriendInfo.checkIsInfoImpl(): FriendInfoImpl { contract { returns() implies (this@checkIsInfoImpl is FriendInfoImpl) } - check(this is FriendInfoImpl) { "A Friend instance is not instance of FriendImpl. Your instance: ${this::class.qualifiedName}" } + check(this is FriendInfoImpl) { "A FriendInfo instance is not instance of checkIsInfoImpl. Your instance: ${this::class.qualifiedName}" } return this } diff --git a/mirai-core/src/commonMain/kotlin/contact/MemberInfoImpl.kt b/mirai-core/src/commonMain/kotlin/contact/MemberInfoImpl.kt index 8f4f917d0..f8b90f5ec 100644 --- a/mirai-core/src/commonMain/kotlin/contact/MemberInfoImpl.kt +++ b/mirai-core/src/commonMain/kotlin/contact/MemberInfoImpl.kt @@ -10,6 +10,7 @@ package net.mamoe.mirai.internal.contact import net.mamoe.mirai.contact.MemberPermission +import net.mamoe.mirai.data.FriendInfoImpl import net.mamoe.mirai.data.MemberInfo import net.mamoe.mirai.internal.network.protocol.data.jce.StTroopMemberInfo @@ -17,12 +18,12 @@ internal class MemberInfoImpl( override val uin: Long, override var nick: String, override val permission: MemberPermission, - override val remark: String, + override var remark: String, override val nameCard: String, override val specialTitle: String, override val muteTimestamp: Int, override val anonymousId: String?, -) : MemberInfo { +) : MemberInfo, FriendInfoImpl(uin, nick, remark) { constructor( jceInfo: StTroopMemberInfo, groupOwnerId: Long diff --git a/mirai-core/src/commonMain/kotlin/network/QQAndroidBotNetworkHandler.kt b/mirai-core/src/commonMain/kotlin/network/QQAndroidBotNetworkHandler.kt index e043c362a..9255a59bd 100644 --- a/mirai-core/src/commonMain/kotlin/network/QQAndroidBotNetworkHandler.kt +++ b/mirai-core/src/commonMain/kotlin/network/QQAndroidBotNetworkHandler.kt @@ -308,7 +308,7 @@ internal class QQAndroidBotNetworkHandler(coroutineContext: CoroutineContext, bo data.friendList.forEach { // atomic bot.friends.delegate.add( - FriendImpl(bot, bot.coroutineContext, FriendInfoImpl(it)) + FriendImpl(bot, bot.coroutineContext, it.toMiraiFriendInfo()) ).also { currentFriendCount++ } } logger.verbose { "正在加载好友列表 ${currentFriendCount}/${totalFriendCount}" } diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt index 8c87318de..3913fc64c 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt @@ -228,18 +228,16 @@ private suspend fun QQAndroidBot.createGroupForBot(groupUin: Long): Group? { } private fun MsgComm.Msg.getNewMemberInfo(): MemberInfo { - return object : MemberInfo { - override val nameCard: String - get() = msgHead.authNick.takeIf { it.isNotEmpty() } - ?: msgHead.fromNick - override val permission: MemberPermission get() = MemberPermission.MEMBER - override val specialTitle: String get() = "" - override val muteTimestamp: Int get() = 0 - override val uin: Long get() = msgHead.authUin - override val nick: String = msgHead.authNick.takeIf { it.isNotEmpty() } - ?: msgHead.fromNick - override val remark: String get() = "" - } + return MemberInfoImpl( + nameCard = msgHead.authNick.ifEmpty { msgHead.fromNick }, + permission = MemberPermission.MEMBER, + specialTitle = "", + muteTimestamp = 0, + uin = msgHead.authUin, + nick = msgHead.authNick.ifEmpty { msgHead.fromNick }, + remark = "", + anonymousId = null + ) } internal suspend fun MsgComm.Msg.transform(bot: QQAndroidBot): Packet? { diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushTransMsg.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushTransMsg.kt index bdf8acfba..9c8712d33 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushTransMsg.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushTransMsg.kt @@ -20,13 +20,9 @@ import kotlinx.io.core.readUByte import kotlinx.io.core.readUInt import net.mamoe.mirai.JavaFriendlyAPI import net.mamoe.mirai.contact.MemberPermission -import net.mamoe.mirai.data.MemberInfo import net.mamoe.mirai.event.events.* import net.mamoe.mirai.internal.QQAndroidBot -import net.mamoe.mirai.internal.contact.GroupImpl -import net.mamoe.mirai.internal.contact.NormalMemberImpl -import net.mamoe.mirai.internal.contact.checkIsMemberImpl -import net.mamoe.mirai.internal.contact.newMember +import net.mamoe.mirai.internal.contact.* import net.mamoe.mirai.internal.message.contextualBugReportException import net.mamoe.mirai.internal.network.MultiPacketByIterable import net.mamoe.mirai.internal.network.Packet @@ -126,22 +122,18 @@ internal object OnlinePushPbPushTransMsg : ) } } else { - val newOwner = group.get(to) ?: group.newMember(object : MemberInfo { - override val nameCard: String - get() = "" - override val permission: MemberPermission - get() = MemberPermission.OWNER - override val specialTitle: String - get() = "" - override val muteTimestamp: Int - get() = 0 - override val uin: Long - get() = to - override val nick: String - get() = "" - override val remark: String - get() = "" - }).also { owner -> + val newOwner = (group[to] ?: group.newMember( + MemberInfoImpl( + to, + "", + MemberPermission.OWNER, + "", + "", + "", + 0, + null + ) + )).also { owner -> owner.checkIsMemberImpl().permission = MemberPermission.OWNER group.members.delegate.add(owner) results.add(MemberJoinEvent.Retrieve(owner)) diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt index 5cb207048..a48e4fbab 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt @@ -24,7 +24,7 @@ import net.mamoe.mirai.JavaFriendlyAPI import net.mamoe.mirai.Mirai import net.mamoe.mirai.contact.Friend import net.mamoe.mirai.contact.Member -import net.mamoe.mirai.data.FriendInfo +import net.mamoe.mirai.data.FriendInfoImpl import net.mamoe.mirai.event.events.* import net.mamoe.mirai.internal.QQAndroidBot import net.mamoe.mirai.internal.contact.* @@ -457,11 +457,13 @@ internal object Transformers528 : Map by mapOf( 0xB3L to lambda528 { bot -> // 08 01 12 52 08 A2 FF 8C F0 03 10 00 1D 15 3D 90 5E 22 2E E6 88 91 E4 BB AC E5 B7 B2 E7 BB 8F E6 98 AF E5 A5 BD E5 8F 8B E5 95 A6 EF BC 8C E4 B8 80 E8 B5 B7 E6 9D A5 E8 81 8A E5 A4 A9 E5 90 A7 21 2A 09 48 69 6D 31 38 38 6D 6F 65 30 07 38 03 48 DD F1 92 B7 07 val body = vProtobuf.loadAs(Submsgtype0xb3.SubMsgType0xb3.MsgBody.serializer()) - val new = Mirai._lowLevelNewFriend(bot, object : FriendInfo { - override val uin: Long get() = body.msgAddFrdNotify.fuin - override val nick: String get() = body.msgAddFrdNotify.fuinNick - override val remark: String get() = "" - }) + val new = Mirai._lowLevelNewFriend( + bot, FriendInfoImpl( + uin = body.msgAddFrdNotify.fuin, + nick = body.msgAddFrdNotify.fuinNick, + remark = "", + ) + ) bot.friends.delegate.add(new) return@lambda528 sequenceOf(FriendAddEvent(new)) }, @@ -693,6 +695,7 @@ internal object Transformers528 : Map by mapOf( val from = bot.nick if (from != to) { bot.nick = to + bot.asFriend.checkIsFriendImpl().nick = to add(BotNickChangedEvent(bot, from, to)) } } else {