Improve member impls

This commit is contained in:
Him188 2021-01-17 19:34:40 +08:00
parent 08badca2af
commit 4467f69110
6 changed files with 48 additions and 28 deletions

View File

@ -0,0 +1,32 @@
/*
* Copyright 2020 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
*
* https://github.com/mamoe/mirai/blob/master/LICENSE
*/
package net.mamoe.mirai.internal.contact
import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.data.MemberInfo
import net.mamoe.mirai.utils.cast
import net.mamoe.mirai.utils.getValue
import net.mamoe.mirai.utils.unsafeWeakRef
import kotlin.coroutines.CoroutineContext
internal abstract class AbstractMember(
group: GroupImpl,
coroutineContext: CoroutineContext,
memberInfo: MemberInfo
) : AbstractUser(group.bot, coroutineContext, memberInfo), Member {
final override val group: GroupImpl by group.unsafeWeakRef()
final override val info: MemberInfoImpl = memberInfo.cast()
override val nameCard: String get() = info.nameCard
override val specialTitle: String get() = info.specialTitle
override var permission: MemberPermission by info::permission
}

View File

@ -27,14 +27,13 @@ import net.mamoe.mirai.internal.network.highway.sizeToString
import net.mamoe.mirai.internal.network.protocol.data.proto.Cmd0x352 import net.mamoe.mirai.internal.network.protocol.data.proto.Cmd0x352
import net.mamoe.mirai.internal.network.protocol.packet.chat.image.LongConn import net.mamoe.mirai.internal.network.protocol.packet.chat.image.LongConn
import net.mamoe.mirai.message.data.Image import net.mamoe.mirai.message.data.Image
import net.mamoe.mirai.utils.ExternalResource import net.mamoe.mirai.utils.*
import net.mamoe.mirai.utils.generateImageIdFromResourceId
import net.mamoe.mirai.utils.toUHexString
import net.mamoe.mirai.utils.verbose
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
import kotlin.math.roundToInt import kotlin.math.roundToInt
import kotlin.time.measureTime import kotlin.time.measureTime
internal val User.info: UserInfo? get() = this.castOrNull<AbstractUser>()?.info
internal open class UserInfoImpl(override val uin: Long, override val nick: String, override val remark: String = "") : internal open class UserInfoImpl(override val uin: Long, override val nick: String, override val remark: String = "") :
UserInfo UserInfo
@ -47,6 +46,8 @@ internal abstract class AbstractUser(
final override var nick: String = userInfo.nick final override var nick: String = userInfo.nick
final override val remark: String = userInfo.remark final override val remark: String = userInfo.remark
open val info: UserInfo = userInfo
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
override suspend fun uploadImage(resource: ExternalResource): Image { override suspend fun uploadImage(resource: ExternalResource): Image {
if (BeforeImageUploadEvent(this, resource).broadcast().isCancelled) { if (BeforeImageUploadEvent(this, resource).broadcast().isCancelled) {

View File

@ -9,31 +9,25 @@
package net.mamoe.mirai.internal.contact package net.mamoe.mirai.internal.contact
import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.AnonymousMember import net.mamoe.mirai.contact.AnonymousMember
import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.data.MemberInfo import net.mamoe.mirai.data.MemberInfo
import net.mamoe.mirai.internal.MiraiImpl import net.mamoe.mirai.internal.MiraiImpl
import net.mamoe.mirai.message.data.Image
import net.mamoe.mirai.utils.ExternalResource
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
internal class AnonymousMemberImpl( internal class AnonymousMemberImpl(
override val group: GroupImpl, group: GroupImpl,
override val coroutineContext: CoroutineContext, coroutineContext: CoroutineContext,
private val memberInfo: MemberInfo, memberInfo: MemberInfo,
override val anonymousId: String override val anonymousId: String
) : AnonymousMember { ) : AnonymousMember, AbstractMember(group, coroutineContext, memberInfo) {
override val nameCard: String get() = memberInfo.nameCard
override val specialTitle: String get() = memberInfo.specialTitle
override val permission: MemberPermission get() = memberInfo.permission
override val bot: Bot get() = group.bot
override val id: Long get() = memberInfo.uin
override val nick: String get() = memberInfo.nick
override val remark: String get() = memberInfo.remark
override suspend fun mute(durationSeconds: Int) { override suspend fun mute(durationSeconds: Int) {
checkBotPermissionHigherThanThis("mute") checkBotPermissionHigherThanThis("mute")
MiraiImpl.muteAnonymousMember(bot, anonymousId, nameCard, group.uin, durationSeconds) MiraiImpl.muteAnonymousMember(bot, anonymousId, nameCard, group.uin, durationSeconds)
} }
override fun toString(): String = "AnonymousMember($nameCard, $anonymousId)" override fun toString(): String = "AnonymousMember($nameCard, $anonymousId)"
override suspend fun uploadImage(resource: ExternalResource): Image =
throw UnsupportedOperationException("Cannot upload image to AnonymousMember")
} }

View File

@ -16,7 +16,7 @@ import net.mamoe.mirai.internal.network.protocol.data.jce.StTroopMemberInfo
internal class MemberInfoImpl( internal class MemberInfoImpl(
override val uin: Long, override val uin: Long,
override var nick: String, override var nick: String,
override val permission: MemberPermission, override var permission: MemberPermission,
override var remark: String, override var remark: String,
override val nameCard: String, override val nameCard: String,
override val specialTitle: String, override val specialTitle: String,

View File

@ -28,8 +28,6 @@ import net.mamoe.mirai.internal.network.protocol.packet.chat.receive.createToTem
import net.mamoe.mirai.message.MessageReceipt import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.* import net.mamoe.mirai.message.data.*
import net.mamoe.mirai.utils.currentTimeSeconds import net.mamoe.mirai.utils.currentTimeSeconds
import net.mamoe.mirai.utils.getValue
import net.mamoe.mirai.utils.unsafeWeakRef
import kotlin.contracts.ExperimentalContracts import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract import kotlin.contracts.contract
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
@ -40,8 +38,7 @@ internal class NormalMemberImpl constructor(
group: GroupImpl, group: GroupImpl,
coroutineContext: CoroutineContext, coroutineContext: CoroutineContext,
memberInfo: MemberInfo memberInfo: MemberInfo
) : NormalMember, AbstractUser(group.bot, coroutineContext, memberInfo) { ) : NormalMember, AbstractMember(group, coroutineContext, memberInfo) {
override val group: GroupImpl by group.unsafeWeakRef()
@Suppress("unused") // false positive @Suppress("unused") // false positive
val lastMessageSequence: AtomicInt = atomic(-1) val lastMessageSequence: AtomicInt = atomic(-1)
@ -108,8 +105,6 @@ internal class NormalMemberImpl constructor(
return result.getOrThrow() return result.getOrThrow()
} }
override var permission: MemberPermission = memberInfo.permission
@Suppress("PropertyName") @Suppress("PropertyName")
internal var _nameCard: String = memberInfo.nameCard internal var _nameCard: String = memberInfo.nameCard

View File

@ -22,9 +22,7 @@ import net.mamoe.mirai.event.events.GroupMessageEvent
import net.mamoe.mirai.event.events.GroupMessageSyncEvent import net.mamoe.mirai.event.events.GroupMessageSyncEvent
import net.mamoe.mirai.event.events.MemberCardChangeEvent import net.mamoe.mirai.event.events.MemberCardChangeEvent
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.newAnonymous
import net.mamoe.mirai.internal.message.toMessageChain import net.mamoe.mirai.internal.message.toMessageChain
import net.mamoe.mirai.internal.network.Packet import net.mamoe.mirai.internal.network.Packet
import net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody import net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody