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

SendGroupMessage() will now return the mid.

This commit is contained in:
Mrs4s 2020-07-09 18:13:27 +08:00
parent 1afa9f801f
commit 7302ac5f7e
7 changed files with 63 additions and 22 deletions

View File

@ -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,

View File

@ -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) {

View File

@ -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))

View File

@ -91,6 +91,11 @@ type (
UploadIp []int32
UploadPort []int32
}
groupMessageReceiptEvent struct {
Rand int32
Seq int32
}
)
const (

View File

@ -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 {

View File

@ -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
}

View File

@ -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 {