diff --git a/client/client.go b/client/client.go index 1aaea009..b2d50de3 100644 --- a/client/client.go +++ b/client/client.go @@ -64,7 +64,6 @@ type QQClient struct { lastLostMsg string groupMsgBuilders sync.Map onlinePushCache []int16 // reset on reconnect - msgSvcCache *utils.Cache requestPacketRequestId int32 groupSeq int32 friendSeq int32 @@ -73,6 +72,7 @@ type QQClient struct { eventHandlers *eventHandlers groupListLock *sync.Mutex + msgSvcLock sync.Mutex } type loginSigInfo struct { diff --git a/client/decoders.go b/client/decoders.go index bceb087b..c5f48261 100644 --- a/client/decoders.go +++ b/client/decoders.go @@ -6,7 +6,6 @@ import ( "fmt" "github.com/Mrs4s/MiraiGo/client/pb/pttcenter" "log" - "strconv" "sync" "sync/atomic" "time" @@ -136,6 +135,8 @@ func decodePushReqPacket(c *QQClient, _ uint16, payload []byte) (interface{}, er } func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{}, error) { + c.msgSvcLock.Lock() + defer c.msgSvcLock.Unlock() rsp := msg.GetMessageResponse{} err := proto.Unmarshal(payload, &rsp) if err != nil { @@ -165,12 +166,8 @@ func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{}, if message.Head.ToUin != c.Uin { continue } - if message.Head.MsgType != 166 { - strSeq := strconv.FormatInt(int64(message.Head.MsgSeq), 10) - if _, ok := c.msgSvcCache.Get(strSeq); ok { - continue - } - c.msgSvcCache.Add(strSeq, 0, time.Minute*15) + if (int64(pairMsg.LastReadTime) & 4294967295) > int64(message.Head.MsgTime) { + continue } switch message.Head.MsgType { case 33: // 加群同步 @@ -234,18 +231,20 @@ func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{}, if message.Body.RichText == nil || message.Body.RichText.Elems == nil { continue } - friend := c.FindFriend(message.Head.FromUin) - if friend == nil { - return nil, nil - } - if friend.msgSeqList == nil { - friend.msgSeqList = utils.NewCache(time.Second * 5) - } - strSeq := strconv.FormatInt(int64(message.Head.MsgSeq), 10) - if _, ok := friend.msgSeqList.Get(strSeq); ok { - continue - } - friend.msgSeqList.Add(strSeq, 0, time.Minute*15) + //friend := c.FindFriend(message.Head.FromUin) + /* + if friend == nil { + return nil, nil + } + if friend.msgSeqList == nil { + friend.msgSeqList = utils.NewCache(time.Second * 5) + } + strSeq := strconv.FormatInt(int64(message.Head.MsgSeq), 10) + if _, ok := friend.msgSeqList.Get(strSeq); ok { + continue + } + friend.msgSeqList.Add(strSeq, 0, time.Minute*15) + */ c.dispatchFriendMessage(c.parsePrivateMessage(message)) case 187: _, pkt := c.buildSystemMsgNewFriendPacket() @@ -253,8 +252,7 @@ func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{}, } } } - _, delPkt := c.buildDeleteMessageRequestPacket(delItems) - _ = c.send(delPkt) + _, _ = c.sendAndWait(c.buildDeleteMessageRequestPacket(delItems)) if rsp.SyncFlag != msg.SyncFlag_STOP { _, nextPkt := c.buildGetMessageRequestPacket(rsp.SyncFlag, time.Now().Unix()) _ = c.send(nextPkt) diff --git a/client/entities.go b/client/entities.go index f54fb0e5..d330de2b 100644 --- a/client/entities.go +++ b/client/entities.go @@ -2,7 +2,6 @@ package client import ( "errors" - "github.com/Mrs4s/MiraiGo/utils" "strings" "sync" ) @@ -37,7 +36,7 @@ type ( Remark string FaceId int16 - msgSeqList *utils.Cache + //msgSeqList *utils.Cache } FriendListResponse struct {