diff --git a/mirai-core/src/commonMain/kotlin/contact/AbstractMember.kt b/mirai-core/src/commonMain/kotlin/contact/AbstractMember.kt new file mode 100644 index 000000000..0e9075df6 --- /dev/null +++ b/mirai-core/src/commonMain/kotlin/contact/AbstractMember.kt @@ -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 +} \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt b/mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt index b6ddb9299..c3a8024dc 100644 --- a/mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt +++ b/mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt @@ -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()?.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) { diff --git a/mirai-core/src/commonMain/kotlin/contact/AnonymousMemberImpl.kt b/mirai-core/src/commonMain/kotlin/contact/AnonymousMemberImpl.kt index c2d6f71db..888ce81b7 100644 --- a/mirai-core/src/commonMain/kotlin/contact/AnonymousMemberImpl.kt +++ b/mirai-core/src/commonMain/kotlin/contact/AnonymousMemberImpl.kt @@ -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") } diff --git a/mirai-core/src/commonMain/kotlin/contact/MemberInfoImpl.kt b/mirai-core/src/commonMain/kotlin/contact/MemberInfoImpl.kt index f80514b42..a3cbbefd8 100644 --- a/mirai-core/src/commonMain/kotlin/contact/MemberInfoImpl.kt +++ b/mirai-core/src/commonMain/kotlin/contact/MemberInfoImpl.kt @@ -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, diff --git a/mirai-core/src/commonMain/kotlin/contact/NormalMemberImpl.kt b/mirai-core/src/commonMain/kotlin/contact/NormalMemberImpl.kt index 7734af435..e33310b7f 100644 --- a/mirai-core/src/commonMain/kotlin/contact/NormalMemberImpl.kt +++ b/mirai-core/src/commonMain/kotlin/contact/NormalMemberImpl.kt @@ -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 diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt index 4a8a2d152..26ad43240 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt @@ -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