Commit 0e30d3d6 authored by Him188's avatar Him188

Better memory management

parent da2b279a
...@@ -306,20 +306,19 @@ internal class MemberImpl( ...@@ -306,20 +306,19 @@ internal class MemberImpl(
} }
internal class MemberInfoImpl( internal class MemberInfoImpl(
private val jceInfo: StTroopMemberInfo, jceInfo: StTroopMemberInfo,
private val groupOwnerId: Long groupOwnerId: Long
) : MemberInfo { ) : MemberInfo {
override val uin: Long get() = jceInfo.memberUin override val uin: Long = jceInfo.memberUin
override val nameCard: String get() = jceInfo.sName ?: "" override val nameCard: String = jceInfo.sName ?: ""
override val nick: String get() = jceInfo.nick override val nick: String = jceInfo.nick
override val permission: MemberPermission override val permission: MemberPermission = when {
get() = when { jceInfo.memberUin == groupOwnerId -> MemberPermission.OWNER
jceInfo.memberUin == groupOwnerId -> MemberPermission.OWNER jceInfo.dwFlag == 1L -> MemberPermission.ADMINISTRATOR
jceInfo.dwFlag == 1L -> MemberPermission.ADMINISTRATOR else -> MemberPermission.MEMBER
else -> MemberPermission.MEMBER }
} override val specialTitle: String = jceInfo.sSpecialTitle ?: ""
override val specialTitle: String get() = jceInfo.sSpecialTitle ?: "" override val muteTimestamp: Int = jceInfo.dwShutupTimestap?.toInt() ?: 0
override val muteTimestamp: Int get() = jceInfo.dwShutupTimestap?.toInt() ?: 0
} }
/** /**
......
...@@ -74,8 +74,6 @@ internal class OnlinePush { ...@@ -74,8 +74,6 @@ internal class OnlinePush {
// println(pbPushMsg.msg.msgBody.richText.contentToString()) // println(pbPushMsg.msg.msgBody.richText.contentToString())
val flags = extraInfo?.flags ?: 0 val flags = extraInfo?.flags ?: 0
return GroupMessage( return GroupMessage(
bot = bot,
group = group,
senderName = pbPushMsg.msg.msgHead.groupInfo.groupCard, senderName = pbPushMsg.msg.msgHead.groupInfo.groupCard,
sender = group[pbPushMsg.msg.msgHead.fromUin], sender = group[pbPushMsg.msg.msgHead.fromUin],
message = pbPushMsg.msg.toMessageChain(), message = pbPushMsg.msg.toMessageChain(),
......
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
package net.mamoe.mirai.message package net.mamoe.mirai.message
import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.Contact import net.mamoe.mirai.contact.Contact
import net.mamoe.mirai.contact.QQ import net.mamoe.mirai.contact.QQ
import net.mamoe.mirai.utils.MiraiInternalAPI import net.mamoe.mirai.utils.MiraiInternalAPI
...@@ -18,7 +17,7 @@ import net.mamoe.mirai.utils.MiraiInternalAPI ...@@ -18,7 +17,7 @@ import net.mamoe.mirai.utils.MiraiInternalAPI
* 平台相关扩展 * 平台相关扩展
*/ */
@UseExperimental(MiraiInternalAPI::class) @UseExperimental(MiraiInternalAPI::class)
actual abstract class MessagePacket<TSender : QQ, TSubject : Contact> actual constructor(bot: Bot) : MessagePacketBase<TSender, TSubject>(bot) { actual abstract class MessagePacket<TSender : QQ, TSubject : Contact> actual constructor() : MessagePacketBase<TSender, TSubject>() {
// suspend inline fun uploadImage(image: Bitmap): Image = subject.uploadImage(image) // suspend inline fun uploadImage(image: Bitmap): Image = subject.uploadImage(image)
//suspend inline fun uploadImage(image: URL): Image = subject.uploadImage(image) //suspend inline fun uploadImage(image: URL): Image = subject.uploadImage(image)
//suspend inline fun uploadImage(image: Input): Image = subject.uploadImage(image) //suspend inline fun uploadImage(image: Input): Image = subject.uploadImage(image)
......
...@@ -13,12 +13,16 @@ import net.mamoe.mirai.Bot ...@@ -13,12 +13,16 @@ import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.QQ import net.mamoe.mirai.contact.QQ
import net.mamoe.mirai.event.BroadcastControllable import net.mamoe.mirai.event.BroadcastControllable
import net.mamoe.mirai.message.data.MessageChain import net.mamoe.mirai.message.data.MessageChain
import net.mamoe.mirai.utils.getValue
import net.mamoe.mirai.utils.unsafeWeakRef
class FriendMessage( class FriendMessage(
bot: Bot, bot: Bot,
override val sender: QQ, sender: QQ,
override val message: MessageChain override val message: MessageChain
) : MessagePacket<QQ, QQ>(bot), BroadcastControllable { ) : MessagePacket<QQ, QQ>(), BroadcastControllable {
override val sender: QQ by sender.unsafeWeakRef()
override val bot: Bot get() = sender.bot
override val subject: QQ get() = sender override val subject: QQ get() = sender
override fun toString(): String = "FriendMessage(sender=${sender.id}, message=$message)" override fun toString(): String = "FriendMessage(sender=${sender.id}, message=$message)"
......
...@@ -22,8 +22,6 @@ import kotlin.jvm.JvmName ...@@ -22,8 +22,6 @@ import kotlin.jvm.JvmName
@Suppress("unused", "NOTHING_TO_INLINE") @Suppress("unused", "NOTHING_TO_INLINE")
class GroupMessage( class GroupMessage(
bot: Bot,
group: Group,
val senderName: String, val senderName: String,
/** /**
* 发送方权限. * 发送方权限.
...@@ -31,9 +29,10 @@ class GroupMessage( ...@@ -31,9 +29,10 @@ class GroupMessage(
val permission: MemberPermission, val permission: MemberPermission,
sender: Member, sender: Member,
override val message: MessageChain override val message: MessageChain
) : MessagePacket<Member, Group>(bot), Event { ) : MessagePacket<Member, Group>(), Event {
val group: Group by group.unsafeWeakRef()
override val sender: Member by sender.unsafeWeakRef() override val sender: Member by sender.unsafeWeakRef()
val group: Group get() = sender.group
override val bot: Bot get() = sender.bot
override val subject: Group get() = group override val subject: Group get() = group
......
...@@ -32,18 +32,19 @@ import kotlin.jvm.JvmName ...@@ -32,18 +32,19 @@ import kotlin.jvm.JvmName
* 请查看各平台的 `actual` 实现的说明. * 请查看各平台的 `actual` 实现的说明.
*/ */
@UseExperimental(MiraiInternalAPI::class) @UseExperimental(MiraiInternalAPI::class)
expect abstract class MessagePacket<TSender : QQ, TSubject : Contact>(bot: Bot) : MessagePacketBase<TSender, TSubject> expect abstract class MessagePacket<TSender : QQ, TSubject : Contact>() : MessagePacketBase<TSender, TSubject>
/** /**
* 仅内部使用, 请使用 [MessagePacket] * 仅内部使用, 请使用 [MessagePacket]
*/ // Tips: 在 IntelliJ 中 (左侧边栏) 打开 `Structure`, 可查看类结构 */ // Tips: 在 IntelliJ 中 (左侧边栏) 打开 `Structure`, 可查看类结构
@Suppress("NOTHING_TO_INLINE", "UNCHECKED_CAST") @Suppress("NOTHING_TO_INLINE", "UNCHECKED_CAST")
@MiraiInternalAPI @MiraiInternalAPI
abstract class MessagePacketBase<TSender : QQ, TSubject : Contact>(_bot: Bot) : Packet, BotEvent { abstract class MessagePacketBase<TSender : QQ, TSubject : Contact> : Packet, BotEvent {
/** /**
* 接受到这条消息的 * 接受到这条消息的
*/ */
override val bot: Bot by _bot.unsafeWeakRef() @WeakRefProperty
abstract override val bot: Bot
/** /**
* 消息事件主体. * 消息事件主体.
...@@ -53,6 +54,7 @@ abstract class MessagePacketBase<TSender : QQ, TSubject : Contact>(_bot: Bot) : ...@@ -53,6 +54,7 @@ abstract class MessagePacketBase<TSender : QQ, TSubject : Contact>(_bot: Bot) :
* *
* 在回复消息时, 可通过 [subject] 作为回复对象 * 在回复消息时, 可通过 [subject] 作为回复对象
*/ */
@WeakRefProperty
abstract val subject: TSubject abstract val subject: TSubject
/** /**
...@@ -60,6 +62,7 @@ abstract class MessagePacketBase<TSender : QQ, TSubject : Contact>(_bot: Bot) : ...@@ -60,6 +62,7 @@ abstract class MessagePacketBase<TSender : QQ, TSubject : Contact>(_bot: Bot) :
* *
* 在好友消息时为 [QQ] 的实例, 在群消息时为 [Member] 的实例 * 在好友消息时为 [QQ] 的实例, 在群消息时为 [Member] 的实例
*/ */
@WeakRefProperty
abstract val sender: TSender abstract val sender: TSender
/** /**
......
...@@ -16,7 +16,6 @@ import kotlinx.coroutines.withContext ...@@ -16,7 +16,6 @@ import kotlinx.coroutines.withContext
import kotlinx.io.core.Input import kotlinx.io.core.Input
import kotlinx.io.core.use import kotlinx.io.core.use
import kotlinx.io.streams.inputStream import kotlinx.io.streams.inputStream
import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.Contact import net.mamoe.mirai.contact.Contact
import net.mamoe.mirai.contact.QQ import net.mamoe.mirai.contact.QQ
import net.mamoe.mirai.message.data.Image import net.mamoe.mirai.message.data.Image
...@@ -35,7 +34,7 @@ import javax.imageio.ImageIO ...@@ -35,7 +34,7 @@ import javax.imageio.ImageIO
* JVM 平台相关扩展 * JVM 平台相关扩展
*/ */
@UseExperimental(MiraiInternalAPI::class) @UseExperimental(MiraiInternalAPI::class)
actual abstract class MessagePacket<TSender : QQ, TSubject : Contact> actual constructor(bot: Bot) : MessagePacketBase<TSender, TSubject>(bot) { actual abstract class MessagePacket<TSender : QQ, TSubject : Contact> actual constructor() : MessagePacketBase<TSender, TSubject>() {
// region 上传图片 // region 上传图片
suspend inline fun uploadImage(image: BufferedImage): Image = subject.uploadImage(image) suspend inline fun uploadImage(image: BufferedImage): Image = subject.uploadImage(image)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment