mirror of
https://github.com/Mrs4s/MiraiGo.git
synced 2025-05-04 11:07:40 +08:00
update group msg sending.
This commit is contained in:
parent
9bbe416206
commit
c3d5aafe5d
@ -386,22 +386,21 @@ func (c *QQClient) buildDeleteOnlinePushPacket(uin int64, seq uint16, delMsg []j
|
|||||||
}
|
}
|
||||||
|
|
||||||
// MessageSvc.PbSendMsg
|
// MessageSvc.PbSendMsg
|
||||||
func (c *QQClient) buildGroupSendingPacket(groupCode int64, r int32, forward bool, m *message.SendingMessage) (uint16, []byte) {
|
func (c *QQClient) buildGroupSendingPacket(groupCode int64, r, pkgNum, pkgIndex, pkgDiv int32, forward bool, m []message.IMessageElement) (uint16, []byte) {
|
||||||
seq := c.nextSeq()
|
seq := c.nextSeq()
|
||||||
var ptt *message.GroupVoiceElement
|
var ptt *message.GroupVoiceElement
|
||||||
if i := m.FirstOrNil(func(e message.IMessageElement) bool {
|
if len(m) > 0 {
|
||||||
_, ok := e.(*message.GroupVoiceElement)
|
if p, ok := m[0].(*message.GroupVoiceElement); ok {
|
||||||
return ok
|
ptt = p
|
||||||
}); i != nil {
|
m = []message.IMessageElement{}
|
||||||
ptt = i.(*message.GroupVoiceElement)
|
}
|
||||||
m.Elements = []message.IMessageElement{}
|
|
||||||
}
|
}
|
||||||
req := &msg.SendMessageRequest{
|
req := &msg.SendMessageRequest{
|
||||||
RoutingHead: &msg.RoutingHead{Grp: &msg.Grp{GroupCode: groupCode}},
|
RoutingHead: &msg.RoutingHead{Grp: &msg.Grp{GroupCode: groupCode}},
|
||||||
ContentHead: &msg.ContentHead{PkgNum: 1},
|
ContentHead: &msg.ContentHead{PkgNum: pkgNum, PkgIndex: pkgIndex, DivSeq: pkgDiv},
|
||||||
MsgBody: &msg.MessageBody{
|
MsgBody: &msg.MessageBody{
|
||||||
RichText: &msg.RichText{
|
RichText: &msg.RichText{
|
||||||
Elems: message.ToProtoElems(m.Elements, true),
|
Elems: message.ToProtoElems(m, true),
|
||||||
Ptt: func() *msg.Ptt {
|
Ptt: func() *msg.Ptt {
|
||||||
if ptt != nil {
|
if ptt != nil {
|
||||||
return ptt.Ptt
|
return ptt.Ptt
|
||||||
|
@ -255,14 +255,18 @@ func (c *QQClient) GetGroupFileUrl(groupCode int64, fileId string, busId int32)
|
|||||||
return url
|
return url
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage) *message.GroupMessage {
|
func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage, f ...bool) *message.GroupMessage {
|
||||||
|
useFram := false
|
||||||
|
if len(f) > 0 {
|
||||||
|
useFram = f[0]
|
||||||
|
}
|
||||||
imgCount := m.Count(func(e message.IMessageElement) bool { return e.Type() == message.Image })
|
imgCount := m.Count(func(e message.IMessageElement) bool { return e.Type() == message.Image })
|
||||||
msgLen := message.EstimateLength(m.Elements, 703)
|
msgLen := message.EstimateLength(m.Elements, 703)
|
||||||
if msgLen > 5000 || imgCount > 50 {
|
if msgLen > 5000 || imgCount > 50 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if msgLen > 300 || imgCount > 2 {
|
if (msgLen > 300 || imgCount > 2) && !useFram {
|
||||||
return c.sendGroupLongOrForwardMessage(groupCode, true, &message.ForwardMessage{Nodes: []*message.ForwardNode{
|
ret := c.sendGroupLongOrForwardMessage(groupCode, true, &message.ForwardMessage{Nodes: []*message.ForwardNode{
|
||||||
{
|
{
|
||||||
SenderId: c.Uin,
|
SenderId: c.Uin,
|
||||||
SenderName: c.Nickname,
|
SenderName: c.Nickname,
|
||||||
@ -270,6 +274,10 @@ func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage)
|
|||||||
Message: m.Elements,
|
Message: m.Elements,
|
||||||
},
|
},
|
||||||
}})
|
}})
|
||||||
|
if ret != nil && ret.Id == -1 {
|
||||||
|
return c.SendGroupMessage(groupCode, m, true)
|
||||||
|
}
|
||||||
|
return ret
|
||||||
}
|
}
|
||||||
return c.sendGroupMessage(groupCode, false, m)
|
return c.sendGroupMessage(groupCode, false, m)
|
||||||
}
|
}
|
||||||
@ -284,8 +292,23 @@ func (c *QQClient) sendGroupMessage(groupCode int64, forward bool, m *message.Se
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
defer c.onGroupMessageReceipt(eid)
|
defer c.onGroupMessageReceipt(eid)
|
||||||
_, pkt := c.buildGroupSendingPacket(groupCode, mr, forward, m)
|
imgCount := m.Count(func(e message.IMessageElement) bool { return e.Type() == message.Image })
|
||||||
_ = c.send(pkt)
|
msgLen := message.EstimateLength(m.Elements, 703)
|
||||||
|
if (msgLen > 300 || imgCount > 2) && !forward && !m.Any(func(e message.IMessageElement) bool {
|
||||||
|
_, ok := e.(*message.GroupVoiceElement)
|
||||||
|
_, ok2 := e.(*message.ServiceElement)
|
||||||
|
return ok || ok2
|
||||||
|
}) {
|
||||||
|
div := int32(rand.Uint32())
|
||||||
|
fragmented := m.ToFragmented()
|
||||||
|
for i, elems := range fragmented {
|
||||||
|
_, pkt := c.buildGroupSendingPacket(groupCode, mr, int32(len(fragmented)), int32(i), div, forward, elems)
|
||||||
|
_ = c.send(pkt)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_, pkt := c.buildGroupSendingPacket(groupCode, mr, 1, 0, 0, forward, m.Elements)
|
||||||
|
_ = c.send(pkt)
|
||||||
|
}
|
||||||
var mid int32
|
var mid int32
|
||||||
ret := &message.GroupMessage{
|
ret := &message.GroupMessage{
|
||||||
Id: -1,
|
Id: -1,
|
||||||
@ -319,17 +342,7 @@ func (c *QQClient) SendPrivateMessage(target int64, m *message.SendingMessage) *
|
|||||||
}
|
}
|
||||||
if msgLen > 300 || imgCount > 2 {
|
if msgLen > 300 || imgCount > 2 {
|
||||||
div := int32(rand.Uint32())
|
div := int32(rand.Uint32())
|
||||||
var fragmented [][]message.IMessageElement
|
fragmented := m.ToFragmented()
|
||||||
for _, elem := range m.Elements {
|
|
||||||
switch o := elem.(type) {
|
|
||||||
case *message.TextElement:
|
|
||||||
for _, text := range utils.ChunkString(o.Content, 220) {
|
|
||||||
fragmented = append(fragmented, []message.IMessageElement{message.NewText(text)})
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
fragmented = append(fragmented, []message.IMessageElement{o})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for i, elems := range fragmented {
|
for i, elems := range fragmented {
|
||||||
_, pkt := c.buildFriendSendingPacket(target, c.nextFriendSeq(), mr, int32(len(fragmented)), int32(i), div, t, elems)
|
_, pkt := c.buildFriendSendingPacket(target, c.nextFriendSeq(), mr, int32(len(fragmented)), int32(i), div, t, elems)
|
||||||
_ = c.send(pkt)
|
_ = c.send(pkt)
|
||||||
|
@ -179,6 +179,21 @@ func (msg *SendingMessage) Count(filter func(e IMessageElement) bool) (c int) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (msg *SendingMessage) ToFragmented() [][]IMessageElement {
|
||||||
|
var fragmented [][]IMessageElement
|
||||||
|
for _, elem := range msg.Elements {
|
||||||
|
switch o := elem.(type) {
|
||||||
|
case *TextElement:
|
||||||
|
for _, text := range utils.ChunkString(o.Content, 220) {
|
||||||
|
fragmented = append(fragmented, []IMessageElement{NewText(text)})
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
fragmented = append(fragmented, []IMessageElement{o})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fragmented
|
||||||
|
}
|
||||||
|
|
||||||
func EstimateLength(elems []IMessageElement, limit int) int {
|
func EstimateLength(elems []IMessageElement, limit int) int {
|
||||||
sum := 0
|
sum := 0
|
||||||
for _, elem := range elems {
|
for _, elem := range elems {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user