Unified FriendInfoImpl and MemberInfoImpl

This commit is contained in:
Him188 2020-12-27 15:28:54 +08:00
parent 1152fe9357
commit de4bbafbd4
10 changed files with 56 additions and 62 deletions

View File

@ -18,4 +18,11 @@ public interface FriendInfo {
public val nick: String public val nick: String
public val remark: String public val remark: String
} }
@LowLevelApi
public open class FriendInfoImpl(
override val uin: Long,
override var nick: String,
override var remark: String,
) : FriendInfo

View File

@ -679,11 +679,7 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor {
blackList = blackList blackList = blackList
).sendWithoutExpect() ).sendWithoutExpect()
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
bot.friends.delegate.add(_lowLevelNewFriend(bot, object : FriendInfo { bot.friends.delegate.add(_lowLevelNewFriend(bot, FriendInfoImpl(fromId, fromNick, "")))
override val uin: Long get() = fromId
override val nick: String get() = fromNick
override val remark: String get() = ""
}))
} }
} }

View File

@ -20,6 +20,7 @@ import net.mamoe.mirai.contact.*
import net.mamoe.mirai.data.* import net.mamoe.mirai.data.*
import net.mamoe.mirai.internal.contact.OtherClientImpl import net.mamoe.mirai.internal.contact.OtherClientImpl
import net.mamoe.mirai.internal.contact.checkIsGroupImpl 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.message.*
import net.mamoe.mirai.internal.network.QQAndroidBotNetworkHandler import net.mamoe.mirai.internal.network.QQAndroidBotNetworkHandler
import net.mamoe.mirai.internal.network.QQAndroidClient import net.mamoe.mirai.internal.network.QQAndroidClient
@ -75,11 +76,7 @@ internal class QQAndroidBot constructor(
override val asFriend: Friend by lazy { override val asFriend: Friend by lazy {
@OptIn(LowLevelApi::class) @OptIn(LowLevelApi::class)
Mirai._lowLevelNewFriend(this, object : FriendInfo { Mirai._lowLevelNewFriend(this, FriendInfoImpl(uin, nick, ""))
override val uin: Long get() = this@QQAndroidBot.id
override val nick: String get() = this@QQAndroidBot.nick
override val remark: String get() = ""
})
} }
override val groups: ContactList<Group> = ContactList() override val groups: ContactList<Group> = ContactList()

View File

@ -35,7 +35,7 @@ internal abstract class AbstractUser(
friendInfo: net.mamoe.mirai.data.FriendInfo, friendInfo: net.mamoe.mirai.data.FriendInfo,
) : User, AbstractContact(bot, coroutineContext) { ) : User, AbstractContact(bot, coroutineContext) {
final override val id: Long = friendInfo.uin 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 final override val remark: String = friendInfo.remark
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")

View File

@ -23,6 +23,7 @@ import kotlinx.atomicfu.atomic
import net.mamoe.mirai.LowLevelApi import net.mamoe.mirai.LowLevelApi
import net.mamoe.mirai.contact.Friend import net.mamoe.mirai.contact.Friend
import net.mamoe.mirai.data.FriendInfo import net.mamoe.mirai.data.FriendInfo
import net.mamoe.mirai.data.FriendInfoImpl
import net.mamoe.mirai.internal.QQAndroidBot import net.mamoe.mirai.internal.QQAndroidBot
import net.mamoe.mirai.message.MessageReceipt import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.Message import net.mamoe.mirai.message.data.Message
@ -31,20 +32,19 @@ import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract import kotlin.contracts.contract
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
internal class FriendInfoImpl( internal fun net.mamoe.mirai.internal.network.protocol.data.jce.FriendInfo.toMiraiFriendInfo(): FriendInfoImpl =
@JvmField private val jceFriendInfo: net.mamoe.mirai.internal.network.protocol.data.jce.FriendInfo FriendInfoImpl(
) : FriendInfo { friendUin,
override var nick: String = jceFriendInfo.nick nick,
override val uin: Long get() = jceFriendInfo.friendUin remark
override var remark: String = jceFriendInfo.remark )
}
@OptIn(ExperimentalContracts::class) @OptIn(ExperimentalContracts::class)
internal inline fun FriendInfo.checkIsInfoImpl(): FriendInfoImpl { internal inline fun FriendInfo.checkIsInfoImpl(): FriendInfoImpl {
contract { contract {
returns() implies (this@checkIsInfoImpl is FriendInfoImpl) 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 return this
} }

View File

@ -10,6 +10,7 @@
package net.mamoe.mirai.internal.contact package net.mamoe.mirai.internal.contact
import net.mamoe.mirai.contact.MemberPermission import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.data.FriendInfoImpl
import net.mamoe.mirai.data.MemberInfo import net.mamoe.mirai.data.MemberInfo
import net.mamoe.mirai.internal.network.protocol.data.jce.StTroopMemberInfo import net.mamoe.mirai.internal.network.protocol.data.jce.StTroopMemberInfo
@ -17,12 +18,12 @@ internal class MemberInfoImpl(
override val uin: Long, override val uin: Long,
override var nick: String, override var nick: String,
override val permission: MemberPermission, override val permission: MemberPermission,
override val remark: String, override var remark: String,
override val nameCard: String, override val nameCard: String,
override val specialTitle: String, override val specialTitle: String,
override val muteTimestamp: Int, override val muteTimestamp: Int,
override val anonymousId: String?, override val anonymousId: String?,
) : MemberInfo { ) : MemberInfo, FriendInfoImpl(uin, nick, remark) {
constructor( constructor(
jceInfo: StTroopMemberInfo, jceInfo: StTroopMemberInfo,
groupOwnerId: Long groupOwnerId: Long

View File

@ -308,7 +308,7 @@ internal class QQAndroidBotNetworkHandler(coroutineContext: CoroutineContext, bo
data.friendList.forEach { data.friendList.forEach {
// atomic // atomic
bot.friends.delegate.add( bot.friends.delegate.add(
FriendImpl(bot, bot.coroutineContext, FriendInfoImpl(it)) FriendImpl(bot, bot.coroutineContext, it.toMiraiFriendInfo())
).also { currentFriendCount++ } ).also { currentFriendCount++ }
} }
logger.verbose { "正在加载好友列表 ${currentFriendCount}/${totalFriendCount}" } logger.verbose { "正在加载好友列表 ${currentFriendCount}/${totalFriendCount}" }

View File

@ -228,18 +228,16 @@ private suspend fun QQAndroidBot.createGroupForBot(groupUin: Long): Group? {
} }
private fun MsgComm.Msg.getNewMemberInfo(): MemberInfo { private fun MsgComm.Msg.getNewMemberInfo(): MemberInfo {
return object : MemberInfo { return MemberInfoImpl(
override val nameCard: String nameCard = msgHead.authNick.ifEmpty { msgHead.fromNick },
get() = msgHead.authNick.takeIf { it.isNotEmpty() } permission = MemberPermission.MEMBER,
?: msgHead.fromNick specialTitle = "",
override val permission: MemberPermission get() = MemberPermission.MEMBER muteTimestamp = 0,
override val specialTitle: String get() = "" uin = msgHead.authUin,
override val muteTimestamp: Int get() = 0 nick = msgHead.authNick.ifEmpty { msgHead.fromNick },
override val uin: Long get() = msgHead.authUin remark = "",
override val nick: String = msgHead.authNick.takeIf { it.isNotEmpty() } anonymousId = null
?: msgHead.fromNick )
override val remark: String get() = ""
}
} }
internal suspend fun MsgComm.Msg.transform(bot: QQAndroidBot): Packet? { internal suspend fun MsgComm.Msg.transform(bot: QQAndroidBot): Packet? {

View File

@ -20,13 +20,9 @@ import kotlinx.io.core.readUByte
import kotlinx.io.core.readUInt import kotlinx.io.core.readUInt
import net.mamoe.mirai.JavaFriendlyAPI import net.mamoe.mirai.JavaFriendlyAPI
import net.mamoe.mirai.contact.MemberPermission import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.data.MemberInfo
import net.mamoe.mirai.event.events.* import net.mamoe.mirai.event.events.*
import net.mamoe.mirai.internal.QQAndroidBot import net.mamoe.mirai.internal.QQAndroidBot
import net.mamoe.mirai.internal.contact.GroupImpl import net.mamoe.mirai.internal.contact.*
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.message.contextualBugReportException import net.mamoe.mirai.internal.message.contextualBugReportException
import net.mamoe.mirai.internal.network.MultiPacketByIterable import net.mamoe.mirai.internal.network.MultiPacketByIterable
import net.mamoe.mirai.internal.network.Packet import net.mamoe.mirai.internal.network.Packet
@ -126,22 +122,18 @@ internal object OnlinePushPbPushTransMsg :
) )
} }
} else { } else {
val newOwner = group.get(to) ?: group.newMember(object : MemberInfo { val newOwner = (group[to] ?: group.newMember(
override val nameCard: String MemberInfoImpl(
get() = "" to,
override val permission: MemberPermission "",
get() = MemberPermission.OWNER MemberPermission.OWNER,
override val specialTitle: String "",
get() = "" "",
override val muteTimestamp: Int "",
get() = 0 0,
override val uin: Long null
get() = to )
override val nick: String )).also { owner ->
get() = ""
override val remark: String
get() = ""
}).also { owner ->
owner.checkIsMemberImpl().permission = MemberPermission.OWNER owner.checkIsMemberImpl().permission = MemberPermission.OWNER
group.members.delegate.add(owner) group.members.delegate.add(owner)
results.add(MemberJoinEvent.Retrieve(owner)) results.add(MemberJoinEvent.Retrieve(owner))

View File

@ -24,7 +24,7 @@ import net.mamoe.mirai.JavaFriendlyAPI
import net.mamoe.mirai.Mirai import net.mamoe.mirai.Mirai
import net.mamoe.mirai.contact.Friend import net.mamoe.mirai.contact.Friend
import net.mamoe.mirai.contact.Member 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.event.events.*
import net.mamoe.mirai.internal.QQAndroidBot import net.mamoe.mirai.internal.QQAndroidBot
import net.mamoe.mirai.internal.contact.* import net.mamoe.mirai.internal.contact.*
@ -457,11 +457,13 @@ internal object Transformers528 : Map<Long, Lambda528> by mapOf(
0xB3L to lambda528 { bot -> 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 // 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 body = vProtobuf.loadAs(Submsgtype0xb3.SubMsgType0xb3.MsgBody.serializer())
val new = Mirai._lowLevelNewFriend(bot, object : FriendInfo { val new = Mirai._lowLevelNewFriend(
override val uin: Long get() = body.msgAddFrdNotify.fuin bot, FriendInfoImpl(
override val nick: String get() = body.msgAddFrdNotify.fuinNick uin = body.msgAddFrdNotify.fuin,
override val remark: String get() = "" nick = body.msgAddFrdNotify.fuinNick,
}) remark = "",
)
)
bot.friends.delegate.add(new) bot.friends.delegate.add(new)
return@lambda528 sequenceOf(FriendAddEvent(new)) return@lambda528 sequenceOf(FriendAddEvent(new))
}, },
@ -693,6 +695,7 @@ internal object Transformers528 : Map<Long, Lambda528> by mapOf(
val from = bot.nick val from = bot.nick
if (from != to) { if (from != to) {
bot.nick = to bot.nick = to
bot.asFriend.checkIsFriendImpl().nick = to
add(BotNickChangedEvent(bot, from, to)) add(BotNickChangedEvent(bot, from, to))
} }
} else { } else {