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/protocol/tlv"
|
||||||
"github.com/Mrs4s/MiraiGo/utils"
|
"github.com/Mrs4s/MiraiGo/utils"
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto"
|
||||||
"math/rand"
|
|
||||||
"strconv"
|
"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())
|
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()
|
seq := c.nextSeq()
|
||||||
req := &msg.SendMessageRequest{
|
req := &msg.SendMessageRequest{
|
||||||
RoutingHead: &msg.RoutingHead{Grp: &msg.Grp{GroupCode: groupCode}},
|
RoutingHead: &msg.RoutingHead{Grp: &msg.Grp{GroupCode: groupCode}},
|
||||||
@ -379,7 +378,7 @@ func (c *QQClient) buildGroupSendingPacket(groupCode int64, m *message.SendingMe
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
MsgSeq: c.nextMessageSeq(),
|
MsgSeq: c.nextMessageSeq(),
|
||||||
MsgRand: int32(rand.Uint32()),
|
MsgRand: r,
|
||||||
SyncCookie: EmptyBytes,
|
SyncCookie: EmptyBytes,
|
||||||
MsgVia: 1,
|
MsgVia: 1,
|
||||||
MsgCtrl: nil,
|
MsgCtrl: nil,
|
||||||
|
@ -8,6 +8,7 @@ import (
|
|||||||
"github.com/Mrs4s/MiraiGo/client/pb"
|
"github.com/Mrs4s/MiraiGo/client/pb"
|
||||||
"github.com/Mrs4s/MiraiGo/message"
|
"github.com/Mrs4s/MiraiGo/message"
|
||||||
"github.com/Mrs4s/MiraiGo/protocol/packets"
|
"github.com/Mrs4s/MiraiGo/protocol/packets"
|
||||||
|
"github.com/Mrs4s/MiraiGo/utils"
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
@ -182,9 +183,26 @@ func (c *QQClient) GetFriendList() (*FriendListResponse, error) {
|
|||||||
return r, nil
|
return r, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage) {
|
func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage) int32 {
|
||||||
_, pkt := c.buildGroupSendingPacket(groupCode, m)
|
eid := utils.RandomString(6)
|
||||||
c.send(pkt)
|
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) {
|
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
|
return nil, err
|
||||||
}
|
}
|
||||||
if pkt.Message.Head.FromUin == c.Uin {
|
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
|
return nil, nil
|
||||||
}
|
}
|
||||||
c.dispatchGroupMessage(c.parseGroupMessage(pkt.Message))
|
c.dispatchGroupMessage(c.parseGroupMessage(pkt.Message))
|
||||||
|
@ -91,6 +91,11 @@ type (
|
|||||||
UploadIp []int32
|
UploadIp []int32
|
||||||
UploadPort []int32
|
UploadPort []int32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
groupMessageReceiptEvent struct {
|
||||||
|
Rand int32
|
||||||
|
Seq int32
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -3,15 +3,17 @@ package client
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"github.com/Mrs4s/MiraiGo/message"
|
"github.com/Mrs4s/MiraiGo/message"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
var ErrEventUndefined = errors.New("event undefined")
|
var ErrEventUndefined = errors.New("event undefined")
|
||||||
|
|
||||||
type eventHandlers struct {
|
type eventHandlers struct {
|
||||||
privateMessageHandlers []func(*QQClient, *message.PrivateMessage)
|
privateMessageHandlers []func(*QQClient, *message.PrivateMessage)
|
||||||
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)
|
||||||
|
groupMessageReceiptHandlers sync.Map
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *QQClient) OnEvent(i interface{}) error {
|
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) {
|
func (c *QQClient) dispatchFriendMessage(msg *message.PrivateMessage) {
|
||||||
if msg == nil {
|
if msg == nil {
|
||||||
return
|
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()) {
|
func cover(f func()) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if pan := recover(); pan != nil {
|
if pan := recover(); pan != nil {
|
||||||
|
@ -165,12 +165,11 @@ func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
g := &message.GroupMessage{
|
g := &message.GroupMessage{
|
||||||
Id: m.Head.MsgSeq,
|
Id: m.Head.MsgSeq,
|
||||||
GroupUin: m.Head.GroupInfo.GroupCode,
|
GroupUin: m.Head.GroupInfo.GroupCode,
|
||||||
GroupName: string(m.Head.GroupInfo.GroupName),
|
GroupName: string(m.Head.GroupInfo.GroupName),
|
||||||
Sender: sender,
|
Sender: sender,
|
||||||
Elements: parseMessageElems(m.Body.RichText.Elems),
|
Elements: parseMessageElems(m.Body.RichText.Elems),
|
||||||
IsAdministrator: false,
|
|
||||||
}
|
}
|
||||||
return g
|
return g
|
||||||
}
|
}
|
||||||
|
@ -12,12 +12,11 @@ type PrivateMessage struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type GroupMessage struct {
|
type GroupMessage struct {
|
||||||
Id int32
|
Id int32
|
||||||
GroupUin int64
|
GroupUin int64
|
||||||
GroupName string
|
GroupName string
|
||||||
Sender *Sender
|
Sender *Sender
|
||||||
Elements []IMessageElement
|
Elements []IMessageElement
|
||||||
IsAdministrator bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type SendingMessage struct {
|
type SendingMessage struct {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user