mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-12 14:00:12 +08:00
Fix #212
This commit is contained in:
parent
94557a2a33
commit
1ff84a4c91
@ -65,7 +65,8 @@ internal class GroupImpl(
|
|||||||
) : Group() {
|
) : Group() {
|
||||||
companion object
|
companion object
|
||||||
|
|
||||||
val lastRecalledMessageRandoms: LockFreeLinkedList<Int> = LockFreeLinkedList()
|
val lastRecalledMessageRandoms: LockFreeCacheList<Int> = LockFreeCacheList(16) // events per 3 second
|
||||||
|
val lastMemberPermissionChangeSequences: LockFreeCacheList<Int> = LockFreeCacheList(16) // events per 3 second
|
||||||
|
|
||||||
override val bot: QQAndroidBot by bot.unsafeWeakRef()
|
override val bot: QQAndroidBot by bot.unsafeWeakRef()
|
||||||
|
|
||||||
|
@ -49,6 +49,7 @@ internal class MemberImpl constructor(
|
|||||||
) : Member() {
|
) : Member() {
|
||||||
override val group: GroupImpl by group.unsafeWeakRef()
|
override val group: GroupImpl by group.unsafeWeakRef()
|
||||||
|
|
||||||
|
@Suppress("unused") // false positive
|
||||||
val lastMessageSequence: AtomicInt = atomic(-1)
|
val lastMessageSequence: AtomicInt = atomic(-1)
|
||||||
|
|
||||||
// region QQ delegate
|
// region QQ delegate
|
||||||
|
@ -25,6 +25,7 @@ import net.mamoe.mirai.qqandroid.message.ensureSequenceIdAvailable
|
|||||||
import net.mamoe.mirai.qqandroid.message.firstIsInstanceOrNull
|
import net.mamoe.mirai.qqandroid.message.firstIsInstanceOrNull
|
||||||
import net.mamoe.mirai.qqandroid.network.QQAndroidBotNetworkHandler
|
import net.mamoe.mirai.qqandroid.network.QQAndroidBotNetworkHandler
|
||||||
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive.MessageSvc
|
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive.MessageSvc
|
||||||
|
import net.mamoe.mirai.utils.LockFreeLinkedList
|
||||||
import net.mamoe.mirai.utils.MiraiExperimentalAPI
|
import net.mamoe.mirai.utils.MiraiExperimentalAPI
|
||||||
import net.mamoe.mirai.utils.MiraiInternalAPI
|
import net.mamoe.mirai.utils.MiraiInternalAPI
|
||||||
|
|
||||||
@ -61,3 +62,27 @@ internal fun Contact.logMessageSent(message: Message) {
|
|||||||
internal fun String.singleLine(): String {
|
internal fun String.singleLine(): String {
|
||||||
return this.replace("\n", """\n""").replace("\r", "")
|
return this.replace("\n", """\n""").replace("\r", "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Size management isn't atomic.
|
||||||
|
*/
|
||||||
|
internal class LockFreeCacheList<E>(private val maxSize: Int) : LockFreeLinkedList<E>() {
|
||||||
|
override fun addLast(element: E) {
|
||||||
|
if (size >= maxSize) {
|
||||||
|
this.removeFirst()
|
||||||
|
}
|
||||||
|
|
||||||
|
super.addLast(element)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated("prohibited", level = DeprecationLevel.HIDDEN)
|
||||||
|
override fun addAll(iterable: Iterable<E>) {
|
||||||
|
super.addAll(iterable)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated("prohibited", level = DeprecationLevel.HIDDEN)
|
||||||
|
override fun addAll(iterable: Sequence<E>) {
|
||||||
|
super.addAll(iterable)
|
||||||
|
}
|
||||||
|
}
|
@ -47,7 +47,7 @@ internal class OnlinePushTrans : ProtoBuf {
|
|||||||
@ProtoId(9) val nickName: String = "",
|
@ProtoId(9) val nickName: String = "",
|
||||||
@ProtoId(10) val msgData: ByteArray = EMPTY_BYTE_ARRAY,
|
@ProtoId(10) val msgData: ByteArray = EMPTY_BYTE_ARRAY,
|
||||||
@ProtoId(11) val svrIp: Int = 0,
|
@ProtoId(11) val svrIp: Int = 0,
|
||||||
@ProtoId(12) val extGroupKeyInfo: OnlinePushTrans.ExtGroupKeyInfo? = null,
|
@ProtoId(12) val extGroupKeyInfo: ExtGroupKeyInfo? = null,
|
||||||
@ProtoId(17) val generalFlag: Int = 0
|
@ProtoId(17) val generalFlag: Int = 0
|
||||||
) : ProtoBuf
|
) : ProtoBuf
|
||||||
}
|
}
|
@ -113,9 +113,9 @@ internal class OnlinePush {
|
|||||||
IncomingPacketFactory<Packet?>("OnlinePush.PbPushTransMsg", "OnlinePush.RespPush") {
|
IncomingPacketFactory<Packet?>("OnlinePush.PbPushTransMsg", "OnlinePush.RespPush") {
|
||||||
|
|
||||||
@OptIn(MiraiInternalAPI::class)
|
@OptIn(MiraiInternalAPI::class)
|
||||||
@ExperimentalUnsignedTypes
|
|
||||||
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): Packet? {
|
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): Packet? {
|
||||||
val content = this.readProtoBuf(OnlinePushTrans.PbMsgInfo.serializer())
|
val content = this.readProtoBuf(OnlinePushTrans.PbMsgInfo.serializer())
|
||||||
|
|
||||||
content.msgData.read<Unit> {
|
content.msgData.read<Unit> {
|
||||||
when (content.msgType) {
|
when (content.msgType) {
|
||||||
44 -> {
|
44 -> {
|
||||||
@ -128,21 +128,33 @@ internal class OnlinePush {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val group = bot.getGroupByUin(content.fromUin) as GroupImpl
|
val group = bot.getGroupByUin(content.fromUin) as GroupImpl
|
||||||
if (var5 == 0L && this.remaining == 1L) {//管理员变更
|
if (group.lastMemberPermissionChangeSequences.remove(content.msgSeq)) {
|
||||||
val newPermission =
|
return null
|
||||||
if (this.readByte()
|
}
|
||||||
.toInt() == 1
|
|
||||||
) MemberPermission.ADMINISTRATOR else MemberPermission.MEMBER
|
|
||||||
|
|
||||||
return if (target == bot.id) {
|
if (var5 == 0L && this.remaining == 1L) {//管理员变更
|
||||||
BotGroupPermissionChangeEvent(
|
group.lastMemberPermissionChangeSequences.addLast(content.msgSeq)
|
||||||
|
val newPermission =
|
||||||
|
if (this.readByte().toInt() == 1) MemberPermission.ADMINISTRATOR
|
||||||
|
else MemberPermission.MEMBER
|
||||||
|
|
||||||
|
if (target == bot.id) {
|
||||||
|
if (group.botPermission == newPermission) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return BotGroupPermissionChangeEvent(
|
||||||
group,
|
group,
|
||||||
group.botPermission.also { group.botPermission = newPermission },
|
group.botPermission.also { group.botPermission = newPermission },
|
||||||
newPermission
|
newPermission
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
val member = group[target] as MemberImpl
|
val member = group[target] as MemberImpl
|
||||||
MemberPermissionChangeEvent(
|
if (member.permission == newPermission) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return MemberPermissionChangeEvent(
|
||||||
member,
|
member,
|
||||||
member.permission.also { member.permission = newPermission },
|
member.permission.also { member.permission = newPermission },
|
||||||
newPermission
|
newPermission
|
||||||
@ -173,21 +185,17 @@ internal class OnlinePush {
|
|||||||
val groupUin = content.fromUin
|
val groupUin = content.fromUin
|
||||||
|
|
||||||
when (type) {
|
when (type) {
|
||||||
0x82 -> { // 2020/4/8: 在这里拿到了一个 Group xxx not found
|
0x82 -> bot.getGroupByUinOrNull(groupUin)?.let { group ->
|
||||||
bot.getGroupByUinOrNull(groupUin)?.let { group ->
|
val member = group.getOrNull(target) as? MemberImpl ?: return null
|
||||||
val member = group.getOrNull(target) as? MemberImpl ?: return null
|
return MemberLeaveEvent.Quit(member.also {
|
||||||
return MemberLeaveEvent.Quit(member.also {
|
group.members.delegate.remove(member)
|
||||||
group.members.delegate.remove(member)
|
})
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
0x83 -> {
|
0x83 -> bot.getGroupByUin(groupUin).let { group ->
|
||||||
bot.getGroupByUin(groupUin).let { group ->
|
val member = group.getOrNull(target) as? MemberImpl ?: return null
|
||||||
val member = group.getOrNull(target) as? MemberImpl ?: return null
|
return MemberLeaveEvent.Kick(member.also {
|
||||||
return MemberLeaveEvent.Kick(member.also {
|
group.members.delegate.remove(member)
|
||||||
group.members.delegate.remove(member)
|
}, group.members[operator])
|
||||||
}, group.members[operator])
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user