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:
parent
1afa9f801f
commit
7302ac5f7e
@ -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,
|
||||
|
@ -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) {
|
||||
|
@ -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))
|
||||
|
@ -91,6 +91,11 @@ type (
|
||||
UploadIp []int32
|
||||
UploadPort []int32
|
||||
}
|
||||
|
||||
groupMessageReceiptEvent struct {
|
||||
Rand int32
|
||||
Seq int32
|
||||
}
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user