1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 11:07:40 +08:00

supported TempMessageEvent.

This commit is contained in:
Mrs4s 2020-07-15 22:51:03 +08:00
parent ef3d1cab23
commit d86adf8619
6 changed files with 81 additions and 3 deletions

View File

@ -196,7 +196,7 @@ func (c *QQClient) buildFriendGroupListRequestPacket(friendStartIndex, friendLis
} }
return 1 return 1
}(), }(),
Uin: int64(c.Uin), Uin: c.Uin,
StartIndex: friendStartIndex, StartIndex: friendStartIndex,
FriendCount: friendListCount, FriendCount: friendListCount,
GroupId: 0, GroupId: 0,

View File

@ -54,6 +54,7 @@ type QQClient struct {
running bool running bool
lastMessageSeq int32 lastMessageSeq int32
lastMessageSeqTmp sync.Map
onlinePushCache []int16 // reset on reconnect onlinePushCache []int16 // reset on reconnect
requestPacketRequestId int32 requestPacketRequestId int32
messageSeq int32 messageSeq int32

View File

@ -153,7 +153,7 @@ func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{},
continue continue
} }
switch message.Head.MsgType { switch message.Head.MsgType {
case 33: case 33: // 加群同步
groupJoinLock.Lock() groupJoinLock.Lock()
group := c.FindGroupByUin(message.Head.FromUin) group := c.FindGroupByUin(message.Head.FromUin)
if message.Head.AuthUin == c.Uin { if message.Head.AuthUin == c.Uin {
@ -181,7 +181,28 @@ func decodeMessageSvcPacket(c *QQClient, _ uint16, payload []byte) (interface{},
} }
} }
groupJoinLock.Unlock() 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 { if message.Body.RichText == nil || message.Body.RichText.Elems == nil {
continue continue
} }

View File

@ -7,6 +7,7 @@ import (
type eventHandlers struct { type eventHandlers struct {
privateMessageHandlers []func(*QQClient, *message.PrivateMessage) privateMessageHandlers []func(*QQClient, *message.PrivateMessage)
tempMessageHandlers []func(*QQClient, *message.TempMessage)
groupMessageHandlers []func(*QQClient, *message.GroupMessage) groupMessageHandlers []func(*QQClient, *message.GroupMessage)
groupMuteEventHandlers []func(*QQClient, *GroupMuteEvent) groupMuteEventHandlers []func(*QQClient, *GroupMuteEvent)
groupRecalledHandlers []func(*QQClient, *GroupMessageRecalledEvent) 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)) { func (c *QQClient) OnGroupMessage(f func(*QQClient, *message.GroupMessage)) {
c.eventHandlers.groupMessageHandlers = append(c.eventHandlers.groupMessageHandlers, f) 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) { func (c *QQClient) dispatchGroupMessage(msg *message.GroupMessage) {
if msg == nil { if msg == nil {
return return

View File

@ -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 { func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage {
group := c.FindGroup(m.Head.GroupInfo.GroupCode) group := c.FindGroup(m.Head.GroupInfo.GroupCode)
if group == nil { if group == nil {

View File

@ -12,6 +12,14 @@ type PrivateMessage struct {
Elements []IMessageElement Elements []IMessageElement
} }
type TempMessage struct {
Id int32
GroupCode int64
GroupName string
Sender *Sender
Elements []IMessageElement
}
type GroupMessage struct { type GroupMessage struct {
Id int32 Id int32
GroupCode int64 GroupCode int64
@ -69,6 +77,22 @@ func (msg *PrivateMessage) ToString() (res string) {
return 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) { func (msg *GroupMessage) ToString() (res string) {
for _, elem := range msg.Elements { for _, elem := range msg.Elements {
switch e := elem.(type) { switch e := elem.(type) {