diff --git a/client/events.go b/client/events.go index b13462b0..1e9b60ce 100644 --- a/client/events.go +++ b/client/events.go @@ -12,6 +12,7 @@ type eventHandlers struct { privateMessageHandlers []func(*QQClient, *message.PrivateMessage) tempMessageHandlers []func(*QQClient, *message.TempMessage) groupMessageHandlers []func(*QQClient, *message.GroupMessage) + selfGroupMessageHandlers []func(*QQClient, *message.GroupMessage) groupMuteEventHandlers []func(*QQClient, *GroupMuteEvent) groupRecalledHandlers []func(*QQClient, *GroupMessageRecalledEvent) friendRecalledHandlers []func(*QQClient, *FriendMessageRecalledEvent) @@ -56,6 +57,10 @@ func (c *QQClient) OnGroupMessage(f func(*QQClient, *message.GroupMessage)) { c.eventHandlers.groupMessageHandlers = append(c.eventHandlers.groupMessageHandlers, f) } +func (c *QQClient) OnSelfGroupMessage(f func(*QQClient, *message.GroupMessage)) { + c.eventHandlers.selfGroupMessageHandlers = append(c.eventHandlers.selfGroupMessageHandlers, f) +} + func (c *QQClient) OnGroupMuted(f func(*QQClient, *GroupMuteEvent)) { c.eventHandlers.groupMuteEventHandlers = append(c.eventHandlers.groupMuteEventHandlers, f) } @@ -188,6 +193,17 @@ func (c *QQClient) dispatchGroupMessage(msg *message.GroupMessage) { } } +func (c *QQClient) dispatchGroupMessageSelf(msg *message.GroupMessage) { + if msg == nil { + return + } + for _, f := range c.eventHandlers.selfGroupMessageHandlers { + cover(func() { + f(c, msg) + }) + } +} + func (c *QQClient) dispatchGroupMuteEvent(e *GroupMuteEvent) { if e == nil { return diff --git a/client/group_msg.go b/client/group_msg.go index f40055be..b50fb9c5 100644 --- a/client/group_msg.go +++ b/client/group_msg.go @@ -316,7 +316,6 @@ func decodeGroupMessagePacket(c *QQClient, _ uint16, payload []byte) (interface{ Seq: pkt.Message.Head.GetMsgSeq(), Msg: c.parseGroupMessage(pkt.Message), }) - return nil, nil } if pkt.Message.Content != nil && pkt.Message.Content.GetPkgNum() > 1 { var builder *groupMessageBuilder @@ -330,11 +329,19 @@ func decodeGroupMessagePacket(c *QQClient, _ uint16, payload []byte) (interface{ builder.MessageSlices = append(builder.MessageSlices, pkt.Message) if int32(len(builder.MessageSlices)) >= pkt.Message.Content.GetPkgNum() { c.groupMsgBuilders.Delete(pkt.Message.Content.GetDivSeq()) - c.dispatchGroupMessage(c.parseGroupMessage(builder.build())) + if pkt.Message.Head.GetFromUin() == c.Uin { + c.dispatchGroupMessageSelf(c.parseGroupMessage(builder.build())) + } else { + c.dispatchGroupMessage(c.parseGroupMessage(builder.build())) + } } return nil, nil } - c.dispatchGroupMessage(c.parseGroupMessage(pkt.Message)) + if pkt.Message.Head.GetFromUin() == c.Uin { + c.dispatchGroupMessageSelf(c.parseGroupMessage(pkt.Message)) + } else { + c.dispatchGroupMessage(c.parseGroupMessage(pkt.Message)) + } return nil, nil }