Improve RspSystemMsgNew handling; #1033, #996, #959, #610

This commit is contained in:
Karlatemp 2021-02-19 23:09:26 +08:00
parent 2eaa13a7c2
commit ce06ce85f0
No known key found for this signature in database
GPG Key ID: 21FBDDF664FF06F8
2 changed files with 54 additions and 24 deletions

View File

@ -165,6 +165,8 @@ internal open class QQAndroidClient(
class MessageSvcSyncData { class MessageSvcSyncData {
val firstNotify: AtomicBoolean = atomic(true) val firstNotify: AtomicBoolean = atomic(true)
var latestMsgNewGroupTime: Long = currentTimeSeconds()
var latestMsgNewFriendTime: Long = currentTimeSeconds()
@Volatile @Volatile
var syncCookie: ByteArray? = null var syncCookie: ByteArray? = null

View File

@ -19,6 +19,7 @@ import net.mamoe.mirai.event.events.MemberJoinRequestEvent
import net.mamoe.mirai.event.events.NewFriendRequestEvent import net.mamoe.mirai.event.events.NewFriendRequestEvent
import net.mamoe.mirai.internal.QQAndroidBot import net.mamoe.mirai.internal.QQAndroidBot
import net.mamoe.mirai.internal.message.contextualBugReportException import net.mamoe.mirai.internal.message.contextualBugReportException
import net.mamoe.mirai.internal.network.MultiPacketByIterable
import net.mamoe.mirai.internal.network.Packet import net.mamoe.mirai.internal.network.Packet
import net.mamoe.mirai.internal.network.QQAndroidClient import net.mamoe.mirai.internal.network.QQAndroidClient
import net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg import net.mamoe.mirai.internal.network.protocol.data.proto.Structmsg
@ -27,11 +28,12 @@ import net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket
import net.mamoe.mirai.internal.utils._miraiContentToString import net.mamoe.mirai.internal.utils._miraiContentToString
import net.mamoe.mirai.internal.utils.io.serialization.loadAs import net.mamoe.mirai.internal.utils.io.serialization.loadAs
import net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf import net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf
import net.mamoe.mirai.utils.currentTimeSeconds
internal class NewContact { internal class NewContact {
internal object SystemMsgNewFriend : internal object SystemMsgNewFriend :
OutgoingPacketFactory<NewFriendRequestEvent?>("ProfileService.Pb.ReqSystemMsgNew.Friend") { OutgoingPacketFactory<Packet?>("ProfileService.Pb.ReqSystemMsgNew.Friend") {
operator fun invoke(client: QQAndroidClient) = buildOutgoingUniPacket(client) { operator fun invoke(client: QQAndroidClient) = buildOutgoingUniPacket(client) {
writeProtoBuf( writeProtoBuf(
@ -55,18 +57,29 @@ internal class NewContact {
} }
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): NewFriendRequestEvent? { override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Packet? {
readBytes().loadAs(Structmsg.RspSystemMsgNew.serializer()).run { readBytes().loadAs(Structmsg.RspSystemMsgNew.serializer()).run {
val struct = friendmsgs.firstOrNull()// 会有重复且无法过滤, 不要用 map return friendmsgs.filter {
return struct?.msg?.run { it.msgTime > bot.client.syncingController.latestMsgNewFriendTime
NewFriendRequestEvent( }.mapNotNull { struct ->
bot, struct.msg?.run {
struct.msgSeq, NewFriendRequestEvent(
msgAdditional, bot,
struct.reqUin, struct.msgSeq,
groupCode, msgAdditional,
reqUinNick struct.reqUin,
) groupCode,
reqUinNick
)
}
}.let { packets ->
when {
packets.isEmpty() -> null
packets.size == 1 -> packets[0]
else -> MultiPacketByIterable(packets)
}
}.also {
bot.client.syncingController.latestMsgNewFriendTime = currentTimeSeconds()
} }
} }
} }
@ -143,18 +156,8 @@ internal class NewContact {
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Packet? { override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Packet? {
return readBytes().loadAs(Structmsg.RspSystemMsgNew.serializer()).run { fun handleStruct(struct: Structmsg.StructMsg): Packet? {
val struct = groupmsgs.firstOrNull() ?: return null // 会有重复且无法过滤, 不要用 map return struct.msg?.run {
if (!bot.client.syncingController.systemMsgNewGroupCacheList.addCache(
QQAndroidClient.MessageSvcSyncData.SystemMsgNewGroupSyncId(struct.msgSeq, struct.msgTime)
)
) { // duplicate
return null
}
struct.msg?.run {
//this.soutv("SystemMsg")
when (subType) { when (subType) {
1 -> { // 处理被邀请入群 或 处理成员入群申请 1 -> { // 处理被邀请入群 或 处理成员入群申请
when (groupMsgType) { when (groupMsgType) {
@ -232,6 +235,31 @@ internal class NewContact {
} }
} }
} }
return readBytes().loadAs(Structmsg.RspSystemMsgNew.serializer()).run {
groupmsgs.filter {
it.msgTime > bot.client.syncingController.latestMsgNewGroupTime
}.mapNotNull { struct ->
if (!bot.client.syncingController.systemMsgNewGroupCacheList.addCache(
QQAndroidClient.MessageSvcSyncData.SystemMsgNewGroupSyncId(
struct.msgSeq,
struct.msgTime
)
)
) { // duplicate
return@mapNotNull null
}
handleStruct(struct)
}.let { packets ->
when {
packets.isEmpty() -> null
packets.size == 1 -> packets[0]
else -> MultiPacketByIterable(packets)
}
}
}.also {
bot.client.syncingController.latestMsgNewGroupTime = currentTimeSeconds()
}
} }
internal object Action : OutgoingPacketFactory<Nothing?>("ProfileService.Pb.ReqSystemMsgAction.Group") { internal object Action : OutgoingPacketFactory<Nothing?>("ProfileService.Pb.ReqSystemMsgAction.Group") {