From 7302ac5f7e2be790a931b40bccd3acb24a33f82f Mon Sep 17 00:00:00 2001 From: Mrs4s <1844812067@qq.com> Date: Thu, 9 Jul 2020 18:13:27 +0800 Subject: [PATCH] SendGroupMessage() will now return the mid. --- client/builders.go | 5 ++--- client/client.go | 24 +++++++++++++++++++++--- client/decoders.go | 4 ++++ client/entities.go | 5 +++++ client/events.go | 25 +++++++++++++++++++++---- client/global.go | 11 +++++------ message/message.go | 11 +++++------ 7 files changed, 63 insertions(+), 22 deletions(-) diff --git a/client/builders.go b/client/builders.go index 38eeadc5..e385cbfc 100644 --- a/client/builders.go +++ b/client/builders.go @@ -12,7 +12,6 @@ import ( "github.com/Mrs4s/MiraiGo/protocol/tlv" "github.com/Mrs4s/MiraiGo/utils" "github.com/golang/protobuf/proto" - "math/rand" "strconv" ) @@ -368,7 +367,7 @@ func (c *QQClient) buildDeleteOnlinePushPacket(uin int64, seq uint16, delMsg []j return packets.BuildUniPacket(c.Uin, seq, "OnlinePush.RespPush", 1, c.OutGoingPacketSessionId, []byte{}, c.sigInfo.d2Key, pkt.ToBytes()) } -func (c *QQClient) buildGroupSendingPacket(groupCode int64, m *message.SendingMessage) (uint16, []byte) { +func (c *QQClient) buildGroupSendingPacket(groupCode int64, r int32, m *message.SendingMessage) (uint16, []byte) { seq := c.nextSeq() req := &msg.SendMessageRequest{ RoutingHead: &msg.RoutingHead{Grp: &msg.Grp{GroupCode: groupCode}}, @@ -379,7 +378,7 @@ func (c *QQClient) buildGroupSendingPacket(groupCode int64, m *message.SendingMe }, }, MsgSeq: c.nextMessageSeq(), - MsgRand: int32(rand.Uint32()), + MsgRand: r, SyncCookie: EmptyBytes, MsgVia: 1, MsgCtrl: nil, diff --git a/client/client.go b/client/client.go index 2bcb37b5..fb31e413 100644 --- a/client/client.go +++ b/client/client.go @@ -8,6 +8,7 @@ import ( "github.com/Mrs4s/MiraiGo/client/pb" "github.com/Mrs4s/MiraiGo/message" "github.com/Mrs4s/MiraiGo/protocol/packets" + "github.com/Mrs4s/MiraiGo/utils" "github.com/golang/protobuf/proto" "io" "log" @@ -182,9 +183,26 @@ func (c *QQClient) GetFriendList() (*FriendListResponse, error) { return r, nil } -func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage) { - _, pkt := c.buildGroupSendingPacket(groupCode, m) - c.send(pkt) +func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage) int32 { + eid := utils.RandomString(6) + mr := int32(rand.Uint32()) + ch := make(chan int32) + c.onGroupMessageReceipt(eid, func(c *QQClient, e *groupMessageReceiptEvent) { + if e.Rand == mr { + ch <- e.Seq + c.onGroupMessageReceipt(eid) + } + }) + _, pkt := c.buildGroupSendingPacket(groupCode, mr, m) + _ = c.send(pkt) + var mid int32 + select { + case mid = <-ch: + case <-time.After(time.Second * 5): + c.onGroupMessageReceipt(eid) + return -1 + } + return mid } func (c *QQClient) UploadGroupImage(groupCode int64, img []byte) (*message.GroupImageElement, error) { diff --git a/client/decoders.go b/client/decoders.go index 23ffd5ee..6f0824df 100644 --- a/client/decoders.go +++ b/client/decoders.go @@ -173,6 +173,10 @@ func decodeGroupMessagePacket(c *QQClient, seq uint16, payload []byte) (interfac return nil, err } if pkt.Message.Head.FromUin == c.Uin { + c.dispatchGroupMessageReceiptEvent(&groupMessageReceiptEvent{ + Rand: pkt.Message.Body.RichText.Attr.Random, + Seq: pkt.Message.Head.MsgSeq, + }) return nil, nil } c.dispatchGroupMessage(c.parseGroupMessage(pkt.Message)) diff --git a/client/entities.go b/client/entities.go index cf7f028d..50fe0b36 100644 --- a/client/entities.go +++ b/client/entities.go @@ -91,6 +91,11 @@ type ( UploadIp []int32 UploadPort []int32 } + + groupMessageReceiptEvent struct { + Rand int32 + Seq int32 + } ) const ( diff --git a/client/events.go b/client/events.go index f579c55c..90147091 100644 --- a/client/events.go +++ b/client/events.go @@ -3,15 +3,17 @@ package client import ( "errors" "github.com/Mrs4s/MiraiGo/message" + "sync" ) var ErrEventUndefined = errors.New("event undefined") type eventHandlers struct { - privateMessageHandlers []func(*QQClient, *message.PrivateMessage) - groupMessageHandlers []func(*QQClient, *message.GroupMessage) - groupMuteEventHandlers []func(*QQClient, *GroupMuteEvent) - groupRecalledHandlers []func(*QQClient, *GroupMessageRecalledEvent) + privateMessageHandlers []func(*QQClient, *message.PrivateMessage) + groupMessageHandlers []func(*QQClient, *message.GroupMessage) + groupMuteEventHandlers []func(*QQClient, *GroupMuteEvent) + groupRecalledHandlers []func(*QQClient, *GroupMessageRecalledEvent) + groupMessageReceiptHandlers sync.Map } func (c *QQClient) OnEvent(i interface{}) error { @@ -60,6 +62,14 @@ func NewUinFilterPrivate(uin int64) func(*message.PrivateMessage) bool { } } +func (c *QQClient) onGroupMessageReceipt(id string, f ...func(*QQClient, *groupMessageReceiptEvent)) { + if len(f) == 0 { + c.eventHandlers.groupMessageReceiptHandlers.Delete(id) + return + } + c.eventHandlers.groupMessageReceiptHandlers.LoadOrStore(id, f[0]) +} + func (c *QQClient) dispatchFriendMessage(msg *message.PrivateMessage) { if msg == nil { return @@ -104,6 +114,13 @@ func (c *QQClient) dispatchGroupMessageRecalledEvent(e *GroupMessageRecalledEven } } +func (c *QQClient) dispatchGroupMessageReceiptEvent(e *groupMessageReceiptEvent) { + c.eventHandlers.groupMessageReceiptHandlers.Range(func(_, f interface{}) bool { + go f.(func(*QQClient, *groupMessageReceiptEvent))(c, e) + return true + }) +} + func cover(f func()) { defer func() { if pan := recover(); pan != nil { diff --git a/client/global.go b/client/global.go index 85b162eb..c242a16d 100644 --- a/client/global.go +++ b/client/global.go @@ -165,12 +165,11 @@ func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage { } } g := &message.GroupMessage{ - Id: m.Head.MsgSeq, - GroupUin: m.Head.GroupInfo.GroupCode, - GroupName: string(m.Head.GroupInfo.GroupName), - Sender: sender, - Elements: parseMessageElems(m.Body.RichText.Elems), - IsAdministrator: false, + Id: m.Head.MsgSeq, + GroupUin: m.Head.GroupInfo.GroupCode, + GroupName: string(m.Head.GroupInfo.GroupName), + Sender: sender, + Elements: parseMessageElems(m.Body.RichText.Elems), } return g } diff --git a/message/message.go b/message/message.go index f11f09aa..608d470b 100644 --- a/message/message.go +++ b/message/message.go @@ -12,12 +12,11 @@ type PrivateMessage struct { } type GroupMessage struct { - Id int32 - GroupUin int64 - GroupName string - Sender *Sender - Elements []IMessageElement - IsAdministrator bool + Id int32 + GroupUin int64 + GroupName string + Sender *Sender + Elements []IMessageElement } type SendingMessage struct {