diff --git a/client/client.go b/client/client.go index 7c9153f7..f1675c65 100644 --- a/client/client.go +++ b/client/client.go @@ -9,6 +9,7 @@ import ( "github.com/Mrs4s/MiraiGo/binary/jce" "image" "io" + "math" "math/rand" "net" "runtime/debug" @@ -137,8 +138,6 @@ var decoders = map[string]func(*QQClient, uint16, []byte) (interface{}, error){ "LongConn.OffPicUp": decodeOffPicUpResponse, "ProfileService.Pb.ReqSystemMsgNew.Group": decodeSystemMsgGroupPacket, "ProfileService.Pb.ReqSystemMsgNew.Friend": decodeSystemMsgFriendPacket, - "MultiMsg.ApplyUp": decodeMultiApplyUpResponse, - "MultiMsg.ApplyDown": decodeMultiApplyDownResponse, "OidbSvc.0xe07_0": decodeImageOcrResponse, "OidbSvc.0xd79": decodeWordSegmentation, "OidbSvc.0x990": decodeTranslateResponse, @@ -503,23 +502,20 @@ func (c *QQClient) SendTempMessage(groupCode, target int64, m *message.SendingMe } func (c *QQClient) GetForwardMessage(resId string) *message.ForwardMessage { - i, err := c.sendAndWait(c.buildMultiApplyDownPacket(resId)) - if err != nil { + m := c.DownloadForwardMessage(resId) + if m == nil { return nil } - multiMsg := i.(*msg.PbMultiMsgTransmit) - ret := &message.ForwardMessage{} - if multiMsg.GetPbItemList() == nil { - return nil - } - var item *msg.PbMultiMsgItem - for _, m := range multiMsg.GetPbItemList() { - if m.GetFileName() == "MultiMsg" { - item = m - break + var ( + item *msg.PbMultiMsgItem + ret = &message.ForwardMessage{Nodes: []*message.ForwardNode{}} + ) + for _, iter := range m.Items { + if iter.GetFileName() == "MultiMsg" { + item = iter } } - if item == nil || item.GetBuffer() == nil || item.GetBuffer().GetMsg() == nil { + if item == nil { return nil } for _, m := range item.GetBuffer().GetMsg() { @@ -538,6 +534,38 @@ func (c *QQClient) GetForwardMessage(resId string) *message.ForwardMessage { return ret } +func (c *QQClient) DownloadForwardMessage(resId string) *message.ForwardElement { + i, err := c.sendAndWait(c.buildMultiApplyDownPacket(resId)) + if err != nil { + return nil + } + multiMsg := i.(*msg.PbMultiMsgTransmit) + if multiMsg.GetPbItemList() == nil { + return nil + } + var pv string + for i := 0; i < int(math.Min(4, float64(len(multiMsg.GetMsg())))); i++ { + m := multiMsg.Msg[i] + pv += fmt.Sprintf(`%s: %s`, + func() string { + if m.Head.GetMsgType() == 82 && m.Head.GroupInfo != nil { + return m.Head.GroupInfo.GetGroupCard() + } + return m.Head.GetFromNick() + }(), + message.ToReadableString( + message.ParseMessageElems(multiMsg.Msg[i].GetBody().GetRichText().Elems), + ), + ) + } + return genForwardTemplate( + resId, pv, "群聊的聊天记录", "[聊天记录]", "聊天记录", + fmt.Sprintf("查看 %d 条转发消息", len(multiMsg.GetMsg())), + time.Now().UnixNano(), + multiMsg.GetPbItemList(), + ) +} + func (c *QQClient) sendGroupPoke(groupCode, target int64) { _, _ = c.sendAndWait(c.buildGroupPokePacket(groupCode, target)) } diff --git a/client/global.go b/client/global.go index d2e31fe4..efc64ad5 100644 --- a/client/global.go +++ b/client/global.go @@ -580,19 +580,15 @@ func genForwardTemplate(resId, preview, title, brief, source, summary string, ts template := fmt.Sprintf(`%s %s
%s
`, brief, resId, ts, title, preview, summary, source, ) - for index, item := range items { + for _, item := range items { if item.GetFileName() == "MultiMsg" { - items[index].FileName = proto.String(strconv.FormatInt(ts, 10)) + *item.FileName = strconv.FormatInt(ts, 10) } } return &message.ForwardElement{ - ServiceElement: message.ServiceElement{ - Id: 35, - Content: template, - ResId: resId, - SubType: "Forward", - }, - Items: items, + Content: template, + ResId: resId, + Items: items, } } diff --git a/client/group_msg.go b/client/group_msg.go index 049709eb..e112d068 100644 --- a/client/group_msg.go +++ b/client/group_msg.go @@ -99,6 +99,10 @@ func (c *QQClient) sendGroupMessage(groupCode int64, forward bool, m *message.Se _, ok := e.(*message.GroupVoiceElement) _, ok2 := e.(*message.ServiceElement) _, ok3 := e.(*message.ReplyElement) + if _, ok4 := e.(*message.ForwardElement); ok4 { + forward = true + return true + } return ok || ok2 || ok3 }) { div := int32(rand.Uint32()) diff --git a/client/multimsg.go b/client/multimsg.go index 829834f7..1afabe30 100644 --- a/client/multimsg.go +++ b/client/multimsg.go @@ -13,6 +13,11 @@ import ( "google.golang.org/protobuf/proto" ) +func init() { + decoders["MultiMsg.ApplyUp"] = decodeMultiApplyUpResponse + decoders["MultiMsg.ApplyDown"] = decodeMultiApplyDownResponse +} + // MultiMsg.ApplyUp func (c *QQClient) buildMultiApplyUpPacket(data, hash []byte, buType int32, groupUin int64) (uint16, []byte) { seq := c.nextSeq() diff --git a/message/elements.go b/message/elements.go index b2b27129..3c23b803 100644 --- a/message/elements.go +++ b/message/elements.go @@ -103,8 +103,9 @@ type ServiceElement struct { } type ForwardElement struct { - ServiceElement - Items []*msg.PbMultiMsgItem + Content string + ResId string + Items []*msg.PbMultiMsgItem } type LightAppElement struct { diff --git a/message/message.go b/message/message.go index 37e6a77c..d2a9c43b 100644 --- a/message/message.go +++ b/message/message.go @@ -456,7 +456,7 @@ func ParseMessageElems(elems []*msg.Elem) []IMessageElement { reg := regexp.MustCompile(`m_resid="(\w+?.*?)"`) sub := reg.FindAllStringSubmatch(content, -1) if len(sub) > 0 && len(sub[0]) > 1 { - res = append(res, &ForwardElement{ServiceElement: ServiceElement{ResId: reg.FindAllStringSubmatch(content, -1)[0][1]}}) + res = append(res, &ForwardElement{ResId: reg.FindAllStringSubmatch(content, -1)[0][1]}) continue } } diff --git a/message/pack.go b/message/pack.go index 6488480d..05233de1 100644 --- a/message/pack.go +++ b/message/pack.go @@ -153,7 +153,7 @@ func (e *ForwardElement) Pack() (r []*msg.Elem) { r = append(r, &msg.Elem{ RichMsg: &msg.RichMsg{ Template1: append([]byte{1}, binary.ZlibCompress([]byte(e.Content))...), - ServiceId: &e.Id, + ServiceId: proto.Int32(35), MsgResId: []byte{}, }, })