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

private long message supported.

This commit is contained in:
Mrs4s 2020-08-16 19:15:33 +08:00
parent cfe2585d84
commit c0fadc3a4c
3 changed files with 47 additions and 5 deletions

View File

@ -425,14 +425,14 @@ func (c *QQClient) buildGroupSendingPacket(groupCode int64, r int32, forward boo
} }
// MessageSvc.PbSendMsg // MessageSvc.PbSendMsg
func (c *QQClient) buildFriendSendingPacket(target int64, msgSeq, r int32, time int64, m *message.SendingMessage) (uint16, []byte) { func (c *QQClient) buildFriendSendingPacket(target int64, msgSeq, r, pkgNum, pkgIndex, pkgDiv int32, time int64, m []message.IMessageElement) (uint16, []byte) {
seq := c.nextSeq() seq := c.nextSeq()
req := &msg.SendMessageRequest{ req := &msg.SendMessageRequest{
RoutingHead: &msg.RoutingHead{C2C: &msg.C2C{ToUin: target}}, RoutingHead: &msg.RoutingHead{C2C: &msg.C2C{ToUin: target}},
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, false), Elems: message.ToProtoElems(m, false),
}, },
}, },
MsgSeq: msgSeq, MsgSeq: msgSeq,

View File

@ -285,8 +285,32 @@ func (c *QQClient) SendPrivateMessage(target int64, m *message.SendingMessage) *
mr := int32(rand.Uint32()) mr := int32(rand.Uint32())
seq := c.nextFriendSeq() seq := c.nextFriendSeq()
t := time.Now().Unix() t := time.Now().Unix()
_, pkt := c.buildFriendSendingPacket(target, seq, mr, t, 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 > 5000 || imgCount > 50 {
return nil
}
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, 300) {
fragmented = append(fragmented, []message.IMessageElement{message.NewText(text)})
}
default:
fragmented = append(fragmented, []message.IMessageElement{o})
}
}
for i, elems := range fragmented {
_, pkt := c.buildFriendSendingPacket(target, c.nextFriendSeq(), mr, int32(len(fragmented)), int32(i), div, t, elems)
_ = c.send(pkt)
}
} else {
_, pkt := c.buildFriendSendingPacket(target, seq, mr, 1, 0, 0, t, m.Elements)
_ = c.send(pkt)
}
return &message.PrivateMessage{ return &message.PrivateMessage{
Id: seq, Id: seq,
InternalId: mr, InternalId: mr,

View File

@ -22,6 +22,24 @@ func RandomStringRange(len int, str string) string {
return res return res
} }
func ChunkString(s string, chunkSize int) []string {
var chunks []string
runes := []rune(s)
if len(runes) == 0 {
return []string{s}
}
for i := 0; i < len(runes); i += chunkSize {
nn := i + chunkSize
if nn > len(runes) {
nn = len(runes)
}
chunks = append(chunks, string(runes[i:nn]))
}
return chunks
}
func ChineseLength(str string, limit int) int { func ChineseLength(str string, limit int) int {
sum := 0 sum := 0
for _, r := range []rune(str) { for _, r := range []rune(str) {