From 3d773342a6cec24c4479f00ad7a5d7e483082873 Mon Sep 17 00:00:00 2001 From: mzdluo123 Date: Wed, 29 Jul 2020 14:26:25 +0800 Subject: [PATCH] Revert "try to fix #249 again" This reverts commit b320d2ca --- .../chat/receive/MessageSvc.PbGetMsg.kt | 85 ++++++++++++------- 1 file changed, 54 insertions(+), 31 deletions(-) diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt index edd19d4ce..dcb4cd326 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt @@ -37,7 +37,6 @@ import net.mamoe.mirai.qqandroid.network.Packet import net.mamoe.mirai.qqandroid.network.QQAndroidClient import net.mamoe.mirai.qqandroid.network.protocol.data.proto.MsgComm import net.mamoe.mirai.qqandroid.network.protocol.data.proto.MsgSvc -import net.mamoe.mirai.qqandroid.network.protocol.data.proto.SyncCookie import net.mamoe.mirai.qqandroid.network.protocol.packet.OutgoingPacket import net.mamoe.mirai.qqandroid.network.protocol.packet.OutgoingPacketFactory import net.mamoe.mirai.qqandroid.network.protocol.packet.buildOutgoingUniPacket @@ -45,7 +44,6 @@ import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.GroupInfoImpl import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.NewContact import net.mamoe.mirai.qqandroid.network.protocol.packet.list.FriendList import net.mamoe.mirai.qqandroid.utils.io.serialization.readProtoBuf -import net.mamoe.mirai.qqandroid.utils.io.serialization.toByteArray import net.mamoe.mirai.qqandroid.utils.io.serialization.writeProtoBuf import net.mamoe.mirai.qqandroid.utils.read import net.mamoe.mirai.qqandroid.utils.toInt @@ -59,15 +57,21 @@ import net.mamoe.mirai.utils.warning * 获取好友消息和消息记录 */ internal object MessageSvcPbGetMsg : OutgoingPacketFactory("MessageSvc.PbGetMsg") { + private var firstSyncPackets = 0 // 启动时候仅将所有好友信息设为已读的包 @Suppress("SpellCheckingInspection") operator fun invoke( client: QQAndroidClient, syncFlag: MsgSvc.SyncFlag = MsgSvc.SyncFlag.START, - msgTime: Long //PbPushMsg.msg.msgHead.msgTime + msgTime: Long, //PbPushMsg.msg.msgHead.msgTime + syncCookie: ByteArray?, + firstSync: Boolean = false ): OutgoingPacket = buildOutgoingUniPacket( client ) { //println("syncCookie=${client.c2cMessageSync.syncCookie?.toUHexString()}") + if (firstSync) { + firstSyncPackets++ + } writeProtoBuf( MsgSvc.PbGetMsgReq.serializer(), MsgSvc.PbGetMsgReq( @@ -80,8 +84,8 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory) : Response(MsgSvc.SyncFlag.STOP, delegate), Event, + open class GetMsgSuccess(delegate: List, syncCookie: ByteArray?) : Response( + MsgSvc.SyncFlag.STOP, delegate, + syncCookie + ), Event, Packet.NoLog { override fun toString(): String = "MessageSvcPbGetMsg.GetMsgSuccess(messages=))" } @@ -97,7 +104,11 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory) : + open class Response( + internal val syncFlagFromServer: MsgSvc.SyncFlag, + delegate: List, + val syncCookie: ByteArray? + ) : AbstractEvent(), MultiPacket, Iterable by (delegate) { @@ -106,7 +117,7 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory))" } - object EmptyResponse : GetMsgSuccess(emptyList()) + object EmptyResponse : GetMsgSuccess(emptyList(), null) private fun MsgComm.Msg.getNewMemberInfo(): MemberInfo { return object : MemberInfo { @@ -125,24 +136,20 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory { - + if (firstSyncPackets != 0) { + return@mapNotNull null + } if (msg.msgHead.fromUin == bot.id) { loop@ while (true) { val instance = bot.client.getFriendSeq() @@ -291,17 +300,17 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory + if (msg.msgHead.msgSeq > instant) { + if (friend.lastMessageSequence.compareAndSet(instant, msg.msgHead.msgSeq)) { + return@mapNotNull FriendMessageEvent( + friend, + msg.toMessageChain(bot, groupIdOrZero = 0, onlineSource = true), + msg.msgHead.msgTime + ) + } + } else return@mapNotNull null } - return@mapNotNull null - } 208 -> { // friend ptt @@ -365,27 +374,41 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory = messages.toList() if (resp.syncFlag == MsgSvc.SyncFlag.STOP) { - return GetMsgSuccess(list) + return GetMsgSuccess(list, resp.syncCookie) } - return Response(resp.syncFlag, list) + return Response(resp.syncFlag, list, resp.syncCookie) } override suspend fun QQAndroidBot.handle(packet: Response) { when (packet.syncFlagFromServer) { - MsgSvc.SyncFlag.STOP -> return + MsgSvc.SyncFlag.STOP -> { + if (firstSyncPackets != 0) { + firstSyncPackets-- + } + } + MsgSvc.SyncFlag.START -> { network.run { - MessageSvcPbGetMsg(client, MsgSvc.SyncFlag.CONTINUE, currentTimeSeconds).sendAndExpect() + MessageSvcPbGetMsg( + client, + MsgSvc.SyncFlag.CONTINUE, + currentTimeSeconds, + packet.syncCookie + ).sendAndExpect() } return } MsgSvc.SyncFlag.CONTINUE -> { network.run { - MessageSvcPbGetMsg(client, MsgSvc.SyncFlag.CONTINUE, currentTimeSeconds).sendAndExpect() + MessageSvcPbGetMsg( + client, + MsgSvc.SyncFlag.CONTINUE, + currentTimeSeconds, + packet.syncCookie + ).sendAndExpect() } return }