diff --git a/client/builders.go b/client/builders.go index 6841c620..863084b9 100644 --- a/client/builders.go +++ b/client/builders.go @@ -196,7 +196,7 @@ func (c *QQClient) buildFriendGroupListRequestPacket(friendStartIndex, friendLis } return 1 }(), - Uin: int64(c.Uin), + Uin: c.Uin, StartIndex: friendStartIndex, FriendCount: friendListCount, GroupId: 0, diff --git a/client/client.go b/client/client.go index 1c4afb23..48221c0a 100644 --- a/client/client.go +++ b/client/client.go @@ -54,6 +54,7 @@ type QQClient struct { running bool lastMessageSeq int32 + lastMessageSeqTmp sync.Map onlinePushCache []int16 // reset on reconnect requestPacketRequestId int32 messageSeq int32 diff --git a/client/decoders.go b/client/decoders.go index da25195e..9e43b1e2 100644 --- a/client/decoders.go +++ b/client/decoders.go @@ -153,7 +153,7 @@ func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{}, continue } switch message.Head.MsgType { - case 33: + case 33: // 加群同步 groupJoinLock.Lock() group := c.FindGroupByUin(message.Head.FromUin) if message.Head.AuthUin == c.Uin { @@ -181,7 +181,28 @@ func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{}, } } groupJoinLock.Unlock() - case 166: + case 141: // 临时会话 + if message.Head.C2CTmpMsgHead == nil { + continue + } + group := c.FindGroupByUin(message.Head.C2CTmpMsgHead.GroupUin) + if group == nil { + continue + } + mem := group.FindMember(message.Head.FromUin) + if mem == nil || message.Head.FromUin == c.Uin { + continue + } + lastSeq, ok := c.lastMessageSeqTmp.Load(mem.Uin) + if !ok { + c.lastMessageSeqTmp.Store(mem.Uin, int32(-1)) + lastSeq = int32(-1) + } + if message.Head.MsgSeq > lastSeq.(int32) { + c.lastMessageSeqTmp.Store(mem.Uin, message.Head.MsgSeq) + c.dispatchTempMessage(c.parseTempMessage(message)) + } + case 166: // 好友消息 if message.Body.RichText == nil || message.Body.RichText.Elems == nil { continue } diff --git a/client/events.go b/client/events.go index 1f3878e0..66558cea 100644 --- a/client/events.go +++ b/client/events.go @@ -7,6 +7,7 @@ import ( type eventHandlers struct { privateMessageHandlers []func(*QQClient, *message.PrivateMessage) + tempMessageHandlers []func(*QQClient, *message.TempMessage) groupMessageHandlers []func(*QQClient, *message.GroupMessage) groupMuteEventHandlers []func(*QQClient, *GroupMuteEvent) groupRecalledHandlers []func(*QQClient, *GroupMessageRecalledEvent) @@ -30,6 +31,10 @@ func (c *QQClient) OnPrivateMessageF(filter func(*message.PrivateMessage) bool, }) } +func (c *QQClient) OnTempMessage(f func(*QQClient, *message.TempMessage)) { + c.eventHandlers.tempMessageHandlers = append(c.eventHandlers.tempMessageHandlers, f) +} + func (c *QQClient) OnGroupMessage(f func(*QQClient, *message.GroupMessage)) { c.eventHandlers.groupMessageHandlers = append(c.eventHandlers.groupMessageHandlers, f) } @@ -87,6 +92,17 @@ func (c *QQClient) dispatchFriendMessage(msg *message.PrivateMessage) { } } +func (c *QQClient) dispatchTempMessage(msg *message.TempMessage) { + if msg == nil { + return + } + for _, f := range c.eventHandlers.tempMessageHandlers { + cover(func() { + f(c, msg) + }) + } +} + func (c *QQClient) dispatchGroupMessage(msg *message.GroupMessage) { if msg == nil { return diff --git a/client/global.go b/client/global.go index 5405b70e..b4bf0751 100644 --- a/client/global.go +++ b/client/global.go @@ -130,6 +130,22 @@ func (c *QQClient) parsePrivateMessage(msg *msg.Message) *message.PrivateMessage } } +func (c *QQClient) parseTempMessage(msg *msg.Message) *message.TempMessage { + group := c.FindGroupByUin(msg.Head.C2CTmpMsgHead.GroupUin) + mem := group.FindMember(msg.Head.FromUin) + return &message.TempMessage{ + Id: msg.Head.MsgSeq, + GroupCode: group.Code, + GroupName: group.Name, + Sender: &message.Sender{ + Uin: mem.Uin, + Nickname: mem.Nickname, + CardName: mem.CardName, + }, + Elements: parseMessageElems(msg.Body.RichText.Elems), + } +} + func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage { group := c.FindGroup(m.Head.GroupInfo.GroupCode) if group == nil { diff --git a/message/message.go b/message/message.go index ecf02e21..4b0c5f29 100644 --- a/message/message.go +++ b/message/message.go @@ -12,6 +12,14 @@ type PrivateMessage struct { Elements []IMessageElement } +type TempMessage struct { + Id int32 + GroupCode int64 + GroupName string + Sender *Sender + Elements []IMessageElement +} + type GroupMessage struct { Id int32 GroupCode int64 @@ -69,6 +77,22 @@ func (msg *PrivateMessage) ToString() (res string) { return } +func (msg *TempMessage) ToString() (res string) { + for _, elem := range msg.Elements { + switch e := elem.(type) { + case *TextElement: + res += e.Content + case *ImageElement: + res += "[Image:" + e.Filename + "]" + case *FaceElement: + res += "[" + e.Name + "]" + case *AtElement: + res += e.Display + } + } + return +} + func (msg *GroupMessage) ToString() (res string) { for _, elem := range msg.Elements { switch e := elem.(type) {