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 {
val firstNotify: AtomicBoolean = atomic(true)
var latestMsgNewGroupTime: Long = currentTimeSeconds()
var latestMsgNewFriendTime: Long = currentTimeSeconds()
@Volatile
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.internal.QQAndroidBot
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.QQAndroidClient
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.io.serialization.loadAs
import net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf
import net.mamoe.mirai.utils.currentTimeSeconds
internal class NewContact {
internal object SystemMsgNewFriend :
OutgoingPacketFactory<NewFriendRequestEvent?>("ProfileService.Pb.ReqSystemMsgNew.Friend") {
OutgoingPacketFactory<Packet?>("ProfileService.Pb.ReqSystemMsgNew.Friend") {
operator fun invoke(client: QQAndroidClient) = buildOutgoingUniPacket(client) {
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 {
val struct = friendmsgs.firstOrNull()// 会有重复且无法过滤, 不要用 map
return struct?.msg?.run {
NewFriendRequestEvent(
bot,
struct.msgSeq,
msgAdditional,
struct.reqUin,
groupCode,
reqUinNick
)
return friendmsgs.filter {
it.msgTime > bot.client.syncingController.latestMsgNewFriendTime
}.mapNotNull { struct ->
struct.msg?.run {
NewFriendRequestEvent(
bot,
struct.msgSeq,
msgAdditional,
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? {
return readBytes().loadAs(Structmsg.RspSystemMsgNew.serializer()).run {
val struct = groupmsgs.firstOrNull() ?: return null // 会有重复且无法过滤, 不要用 map
if (!bot.client.syncingController.systemMsgNewGroupCacheList.addCache(
QQAndroidClient.MessageSvcSyncData.SystemMsgNewGroupSyncId(struct.msgSeq, struct.msgTime)
)
) { // duplicate
return null
}
struct.msg?.run {
//this.soutv("SystemMsg")
fun handleStruct(struct: Structmsg.StructMsg): Packet? {
return struct.msg?.run {
when (subType) {
1 -> { // 处理被邀请入群 或 处理成员入群申请
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") {