mirror of
https://github.com/Mrs4s/MiraiGo.git
synced 2025-05-03 18:47:41 +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
|
||||
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()
|
||||
var ptt *message.GroupVoiceElement
|
||||
if i := m.FirstOrNil(func(e message.IMessageElement) bool {
|
||||
_, ok := e.(*message.GroupVoiceElement)
|
||||
return ok
|
||||
}); i != nil {
|
||||
ptt = i.(*message.GroupVoiceElement)
|
||||
m.Elements = []message.IMessageElement{}
|
||||
if len(m) > 0 {
|
||||
if p, ok := m[0].(*message.GroupVoiceElement); ok {
|
||||
ptt = p
|
||||
m = []message.IMessageElement{}
|
||||
}
|
||||
}
|
||||
req := &msg.SendMessageRequest{
|
||||
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{
|
||||
RichText: &msg.RichText{
|
||||
Elems: message.ToProtoElems(m.Elements, true),
|
||||
Elems: message.ToProtoElems(m, true),
|
||||
Ptt: func() *msg.Ptt {
|
||||
if ptt != nil {
|
||||
return ptt.Ptt
|
||||
|
@ -255,14 +255,18 @@ func (c *QQClient) GetGroupFileUrl(groupCode int64, fileId string, busId int32)
|
||||
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 })
|
||||
msgLen := message.EstimateLength(m.Elements, 703)
|
||||
if msgLen > 5000 || imgCount > 50 {
|
||||
return nil
|
||||
}
|
||||
if msgLen > 300 || imgCount > 2 {
|
||||
return c.sendGroupLongOrForwardMessage(groupCode, true, &message.ForwardMessage{Nodes: []*message.ForwardNode{
|
||||
if (msgLen > 300 || imgCount > 2) && !useFram {
|
||||
ret := c.sendGroupLongOrForwardMessage(groupCode, true, &message.ForwardMessage{Nodes: []*message.ForwardNode{
|
||||
{
|
||||
SenderId: c.Uin,
|
||||
SenderName: c.Nickname,
|
||||
@ -270,6 +274,10 @@ func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage)
|
||||
Message: m.Elements,
|
||||
},
|
||||
}})
|
||||
if ret != nil && ret.Id == -1 {
|
||||
return c.SendGroupMessage(groupCode, m, true)
|
||||
}
|
||||
return ret
|
||||
}
|
||||
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)
|
||||
_, pkt := c.buildGroupSendingPacket(groupCode, mr, forward, m)
|
||||
_ = c.send(pkt)
|
||||
imgCount := m.Count(func(e message.IMessageElement) bool { return e.Type() == message.Image })
|
||||
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
|
||||
ret := &message.GroupMessage{
|
||||
Id: -1,
|
||||
@ -319,17 +342,7 @@ func (c *QQClient) SendPrivateMessage(target int64, m *message.SendingMessage) *
|
||||
}
|
||||
if msgLen > 300 || imgCount > 2 {
|
||||
div := int32(rand.Uint32())
|
||||
var fragmented [][]message.IMessageElement
|
||||
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})
|
||||
}
|
||||
}
|
||||
fragmented := m.ToFragmented()
|
||||
for i, elems := range fragmented {
|
||||
_, pkt := c.buildFriendSendingPacket(target, c.nextFriendSeq(), mr, int32(len(fragmented)), int32(i), div, t, elems)
|
||||
_ = c.send(pkt)
|
||||
|
@ -179,6 +179,21 @@ func (msg *SendingMessage) Count(filter func(e IMessageElement) bool) (c int) {
|
||||
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 {
|
||||
sum := 0
|
||||
for _, elem := range elems {
|
||||
|
Loading…
x
Reference in New Issue
Block a user