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

@ -19,3 +19,10 @@ public interface FriendInfo {
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
).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, "")))
}
}

View File

@ -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<Group> = ContactList()

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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<Long, Lambda528> 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<Long, Lambda528> by mapOf(
val from = bot.nick
if (from != to) {
bot.nick = to
bot.asFriend.checkIsFriendImpl().nick = to
add(BotNickChangedEvent(bot, from, to))
}
} else {