From b320d2caedfe849abaae66f696963b124859c4d7 Mon Sep 17 00:00:00 2001 From: mzdluo123 Date: Tue, 28 Jul 2020 14:55:14 +0800 Subject: [PATCH] try to fix #249 again --- .../chat/receive/MessageSvc.PbGetMsg.kt | 85 +++++++------------ 1 file changed, 31 insertions(+), 54 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 dcb4cd326..edd19d4ce 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,6 +37,7 @@ 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 @@ -44,6 +45,7 @@ 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 @@ -57,21 +59,15 @@ 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 - syncCookie: ByteArray?, - firstSync: Boolean = false + msgTime: Long //PbPushMsg.msg.msgHead.msgTime ): OutgoingPacket = buildOutgoingUniPacket( client ) { //println("syncCookie=${client.c2cMessageSync.syncCookie?.toUHexString()}") - if (firstSync) { - firstSyncPackets++ - } writeProtoBuf( MsgSvc.PbGetMsgReq.serializer(), MsgSvc.PbGetMsgReq( @@ -84,8 +80,8 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory, syncCookie: ByteArray?) : Response( - MsgSvc.SyncFlag.STOP, delegate, - syncCookie - ), Event, + open class GetMsgSuccess(delegate: List) : Response(MsgSvc.SyncFlag.STOP, delegate), Event, Packet.NoLog { override fun toString(): String = "MessageSvcPbGetMsg.GetMsgSuccess(messages=))" } @@ -104,11 +97,7 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory, - val syncCookie: ByteArray? - ) : + open class Response(internal val syncFlagFromServer: MsgSvc.SyncFlag, delegate: List) : AbstractEvent(), MultiPacket, Iterable by (delegate) { @@ -117,7 +106,7 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory))" } - object EmptyResponse : GetMsgSuccess(emptyList(), null) + object EmptyResponse : GetMsgSuccess(emptyList()) private fun MsgComm.Msg.getNewMemberInfo(): MemberInfo { return object : MemberInfo { @@ -136,20 +125,24 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory { - if (firstSyncPackets != 0) { - return@mapNotNull null - } + if (msg.msgHead.fromUin == bot.id) { loop@ while (true) { val instance = bot.client.getFriendSeq() @@ -300,17 +291,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 + + if (friend.lastMessageSequence.compareAndSet(friend.lastMessageSequence.value, msg.msgHead.msgSeq)) { + return@mapNotNull FriendMessageEvent( + friend, + msg.toMessageChain(bot, groupIdOrZero = 0, onlineSource = true), + msg.msgHead.msgTime + ) + } + return@mapNotNull null + } 208 -> { // friend ptt @@ -374,41 +365,27 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory = messages.toList() if (resp.syncFlag == MsgSvc.SyncFlag.STOP) { - return GetMsgSuccess(list, resp.syncCookie) + return GetMsgSuccess(list) } - return Response(resp.syncFlag, list, resp.syncCookie) + return Response(resp.syncFlag, list) } override suspend fun QQAndroidBot.handle(packet: Response) { when (packet.syncFlagFromServer) { - MsgSvc.SyncFlag.STOP -> { - if (firstSyncPackets != 0) { - firstSyncPackets-- - } - } - + MsgSvc.SyncFlag.STOP -> return MsgSvc.SyncFlag.START -> { network.run { - MessageSvcPbGetMsg( - client, - MsgSvc.SyncFlag.CONTINUE, - currentTimeSeconds, - packet.syncCookie - ).sendAndExpect() + MessageSvcPbGetMsg(client, MsgSvc.SyncFlag.CONTINUE, currentTimeSeconds).sendAndExpect() } return } MsgSvc.SyncFlag.CONTINUE -> { network.run { - MessageSvcPbGetMsg( - client, - MsgSvc.SyncFlag.CONTINUE, - currentTimeSeconds, - packet.syncCookie - ).sendAndExpect() + MessageSvcPbGetMsg(client, MsgSvc.SyncFlag.CONTINUE, currentTimeSeconds).sendAndExpect() } return }