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.packet.chat.image.LongConn
import net.mamoe.mirai.message.data.Image
import net.mamoe.mirai.utils.ExternalResource
import net.mamoe.mirai.utils.generateImageIdFromResourceId
import net.mamoe.mirai.utils.toUHexString
import net.mamoe.mirai.utils.verbose
import net.mamoe.mirai.utils.*
import kotlin.coroutines.CoroutineContext
import kotlin.math.roundToInt
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 = "") :
UserInfo
@ -47,6 +46,8 @@ internal abstract class AbstractUser(
final override var nick: String = userInfo.nick
final override val remark: String = userInfo.remark
open val info: UserInfo = userInfo
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
override suspend fun uploadImage(resource: ExternalResource): Image {
if (BeforeImageUploadEvent(this, resource).broadcast().isCancelled) {

View File

@ -9,31 +9,25 @@
package net.mamoe.mirai.internal.contact
import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.AnonymousMember
import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.data.MemberInfo
import net.mamoe.mirai.internal.MiraiImpl
import net.mamoe.mirai.message.data.Image
import net.mamoe.mirai.utils.ExternalResource
import kotlin.coroutines.CoroutineContext
internal class AnonymousMemberImpl(
override val group: GroupImpl,
override val coroutineContext: CoroutineContext,
private val memberInfo: MemberInfo,
group: GroupImpl,
coroutineContext: CoroutineContext,
memberInfo: MemberInfo,
override val anonymousId: String
) : AnonymousMember {
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
) : AnonymousMember, AbstractMember(group, coroutineContext, memberInfo) {
override suspend fun mute(durationSeconds: Int) {
checkBotPermissionHigherThanThis("mute")
MiraiImpl.muteAnonymousMember(bot, anonymousId, nameCard, group.uin, durationSeconds)
}
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(
override val uin: Long,
override var nick: String,
override val permission: MemberPermission,
override var permission: MemberPermission,
override var remark: String,
override val nameCard: 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.data.*
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.contract
import kotlin.coroutines.CoroutineContext
@ -40,8 +38,7 @@ internal class NormalMemberImpl constructor(
group: GroupImpl,
coroutineContext: CoroutineContext,
memberInfo: MemberInfo
) : NormalMember, AbstractUser(group.bot, coroutineContext, memberInfo) {
override val group: GroupImpl by group.unsafeWeakRef()
) : NormalMember, AbstractMember(group, coroutineContext, memberInfo) {
@Suppress("unused") // false positive
val lastMessageSequence: AtomicInt = atomic(-1)
@ -108,8 +105,6 @@ internal class NormalMemberImpl constructor(
return result.getOrThrow()
}
override var permission: MemberPermission = memberInfo.permission
@Suppress("PropertyName")
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.MemberCardChangeEvent
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.newAnonymous
import net.mamoe.mirai.internal.contact.*
import net.mamoe.mirai.internal.message.toMessageChain
import net.mamoe.mirai.internal.network.Packet
import net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody