mirror of
https://github.com/Mrs4s/MiraiGo.git
synced 2025-05-04 19:17:38 +08:00
feat: GetGroupMessages support fragmented message building.
This commit is contained in:
parent
93534fe94a
commit
f584f21b81
@ -598,6 +598,17 @@ func (p requestParams) bool(k string) bool {
|
|||||||
return i.(bool)
|
return i.(bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p requestParams) int32(k string) int32 {
|
||||||
|
if p == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
i, ok := p[k]
|
||||||
|
if !ok {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return i.(int32)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *QQClient) packOIDBPackage(cmd, serviceType int32, body []byte) []byte {
|
func (c *QQClient) packOIDBPackage(cmd, serviceType int32, body []byte) []byte {
|
||||||
pkg := &oidb.OIDBSSOPkg{
|
pkg := &oidb.OIDBSSOPkg{
|
||||||
Command: cmd,
|
Command: cmd,
|
||||||
|
@ -82,7 +82,8 @@ func (c *QQClient) SendGroupForwardMessage(groupCode int64, m *message.ForwardMe
|
|||||||
|
|
||||||
// GetGroupMessages 从服务器获取历史信息
|
// GetGroupMessages 从服务器获取历史信息
|
||||||
func (c *QQClient) GetGroupMessages(groupCode, beginSeq, endSeq int64) ([]*message.GroupMessage, error) {
|
func (c *QQClient) GetGroupMessages(groupCode, beginSeq, endSeq int64) ([]*message.GroupMessage, error) {
|
||||||
i, err := c.sendAndWait(c.buildGetGroupMsgRequest(groupCode, beginSeq, endSeq))
|
seq, pkt := c.buildGetGroupMsgRequest(groupCode, beginSeq, endSeq)
|
||||||
|
i, err := c.sendAndWait(seq, pkt, requestParams{"raw": false})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -356,7 +357,7 @@ func decodeMsgSendResponse(c *QQClient, _ *incomingPacketInfo, payload []byte) (
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func decodeGetGroupMsgResponse(c *QQClient, _ *incomingPacketInfo, payload []byte) (interface{}, error) {
|
func decodeGetGroupMsgResponse(c *QQClient, info *incomingPacketInfo, payload []byte) (interface{}, error) {
|
||||||
rsp := msg.GetGroupMsgResp{}
|
rsp := msg.GetGroupMsgResp{}
|
||||||
if err := proto.Unmarshal(payload, &rsp); err != nil {
|
if err := proto.Unmarshal(payload, &rsp); err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to unmarshal protobuf message")
|
return nil, errors.Wrap(err, "failed to unmarshal protobuf message")
|
||||||
@ -370,6 +371,34 @@ func decodeGetGroupMsgResponse(c *QQClient, _ *incomingPacketInfo, payload []byt
|
|||||||
if m.Head.FromUin == nil {
|
if m.Head.FromUin == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if m.Content != nil && m.Content.GetPkgNum() > 1 && !info.Params.bool("raw") {
|
||||||
|
if m.Content.GetPkgIndex() == 0 {
|
||||||
|
c.Debug("build fragmented message from history")
|
||||||
|
i := m.Head.GetMsgSeq() - m.Content.GetPkgNum()
|
||||||
|
builder := &groupMessageBuilder{}
|
||||||
|
for {
|
||||||
|
end := int32(math.Min(float64(i+19), float64(m.Head.GetMsgSeq()+m.Content.GetPkgNum())))
|
||||||
|
seq, pkt := c.buildGetGroupMsgRequest(m.Head.GroupInfo.GetGroupCode(), int64(i), int64(end))
|
||||||
|
data, err := c.sendAndWait(seq, pkt, requestParams{"raw": true})
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrap(err, "build fragmented message error")
|
||||||
|
}
|
||||||
|
for _, fm := range data.([]*message.GroupMessage) {
|
||||||
|
if fm.OriginalObject.Content != nil && fm.OriginalObject.Content.GetDivSeq() == m.Content.GetDivSeq() {
|
||||||
|
builder.MessageSlices = append(builder.MessageSlices, fm.OriginalObject)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(builder.MessageSlices) >= int(m.Content.GetPkgNum()) || data == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
i = end
|
||||||
|
}
|
||||||
|
if elem := c.parseGroupMessage(builder.build()); elem != nil {
|
||||||
|
ret = append(ret, elem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
if elem := c.parseGroupMessage(m); elem != nil {
|
if elem := c.parseGroupMessage(m); elem != nil {
|
||||||
ret = append(ret, elem)
|
ret = append(ret, elem)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user