1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-06-19 14:05:04 +08:00

Merge pull request #88 from wdvxdr1123/patch/forwardmsg

remove unnecessary code
This commit is contained in:
Mrs4s 2020-12-26 23:46:41 +08:00 committed by GitHub
commit 4e82afc69b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 64 additions and 114 deletions

View File

@ -507,17 +507,17 @@ func (c *QQClient) GetForwardMessage(resId string) *message.ForwardMessage {
if multiMsg.GetPbItemList() == nil { if multiMsg.GetPbItemList() == nil {
return nil return nil
} }
var msg *msg.PbMultiMsgItem var item *msg.PbMultiMsgItem
for _, m := range multiMsg.GetPbItemList() { for _, m := range multiMsg.GetPbItemList() {
if m.GetFileName() == "MultiMsg" { if m.GetFileName() == "MultiMsg" {
msg = m item = m
break break
} }
} }
if msg == nil || msg.GetBuffer() == nil || msg.GetBuffer().GetMsg() == nil { if item == nil || item.GetBuffer() == nil || item.GetBuffer().GetMsg() == nil {
return nil return nil
} }
for _, m := range msg.GetBuffer().GetMsg() { for _, m := range item.GetBuffer().GetMsg() {
ret.Nodes = append(ret.Nodes, &message.ForwardNode{ ret.Nodes = append(ret.Nodes, &message.ForwardNode{
SenderId: m.Head.GetFromUin(), SenderId: m.Head.GetFromUin(),
SenderName: func() string { SenderName: func() string {

View File

@ -61,11 +61,8 @@ func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage,
// SendGroupForwardMessage 发送群合并转发消息 // SendGroupForwardMessage 发送群合并转发消息
func (c *QQClient) SendGroupForwardMessage(groupCode int64, m *message.ForwardMessage) *message.GroupMessage { func (c *QQClient) SendGroupForwardMessage(groupCode int64, m *message.ForwardMessage) *message.GroupMessage {
mg := c.UploadGroupForwardMessage(groupCode, m)
return c.sendGroupMessage(groupCode, true, return c.sendGroupMessage(groupCode, true,
&message.SendingMessage{Elements: []message.IMessageElement{ &message.SendingMessage{Elements: []message.IMessageElement{c.UploadGroupForwardMessage(groupCode, m)}},
&mg.ServiceElement,
}},
) )
} }
@ -152,25 +149,10 @@ func (c *QQClient) uploadGroupLongMessage(groupCode int64, m *message.ForwardMes
ts := time.Now().UnixNano() ts := time.Now().UnixNano()
seq := c.nextGroupSeq() seq := c.nextGroupSeq()
data, hash := m.CalculateValidationData(seq, rand.Int31(), groupCode) data, hash := m.CalculateValidationData(seq, rand.Int31(), groupCode)
i, err := c.sendAndWait(c.buildMultiApplyUpPacket(data, hash, 1, utils.ToGroupUin(groupCode))) rsp, body, err := c.multiMsgApplyUp(groupCode, data, hash, 1)
if err != nil { if err != nil {
return nil return nil
} }
rsp := i.(*multimsg.MultiMsgApplyUpRsp)
body, _ := proto.Marshal(&longmsg.LongReqBody{
Subcmd: 1,
TermType: 5,
PlatformType: 9,
MsgUpReq: []*longmsg.LongMsgUpReq{
{
MsgType: 3,
DstUin: utils.ToGroupUin(groupCode),
MsgContent: data,
StoreType: 2,
MsgUkey: rsp.MsgUkey,
},
},
})
for i, ip := range rsp.Uint32UpIp { for i, ip := range rsp.Uint32UpIp {
err := c.highwayUpload(uint32(ip), int(rsp.Uint32UpPort[i]), rsp.MsgSig, body, 27) err := c.highwayUpload(uint32(ip), int(rsp.Uint32UpPort[i]), rsp.MsgSig, body, 27)
if err == nil { if err == nil {
@ -197,10 +179,28 @@ func (c *QQClient) UploadGroupForwardMessage(groupCode int64, m *message.Forward
ts := time.Now().UnixNano() ts := time.Now().UnixNano()
seq := c.nextGroupSeq() seq := c.nextGroupSeq()
data, hash, items := m.CalculateValidationDataForward(seq, rand.Int31(), groupCode) data, hash, items := m.CalculateValidationDataForward(seq, rand.Int31(), groupCode)
i, err := c.sendAndWait(c.buildMultiApplyUpPacket(data, hash, 2, utils.ToGroupUin(groupCode))) rsp, body, err := c.multiMsgApplyUp(groupCode, data, hash, 2)
if err != nil { if err != nil {
return nil return nil
} }
for i, ip := range rsp.Uint32UpIp {
err := c.highwayUpload(uint32(ip), int(rsp.Uint32UpPort[i]), rsp.MsgSig, body, 27)
if err == nil {
var pv string
for i := 0; i < int(math.Min(4, float64(len(m.Nodes)))); i++ {
pv += fmt.Sprintf(`<title size="26" color="#777777">%s: %s</title>`, m.Nodes[i].SenderName, message.ToReadableString(m.Nodes[i].Message))
}
return genForwardTemplate(rsp.MsgResid, pv, "群聊的聊天记录", "[聊天记录]", "聊天记录", fmt.Sprintf("查看 %d 条转发消息", len(m.Nodes)), ts, items)
}
}
return nil
}
func (c *QQClient) multiMsgApplyUp(groupCode int64, data []byte, hash []byte, buType int32) (*multimsg.MultiMsgApplyUpRsp, []byte, error) {
i, err := c.sendAndWait(c.buildMultiApplyUpPacket(data, hash, buType, utils.ToGroupUin(groupCode)))
if err != nil {
return nil, nil, err
}
rsp := i.(*multimsg.MultiMsgApplyUpRsp) rsp := i.(*multimsg.MultiMsgApplyUpRsp)
body, _ := proto.Marshal(&longmsg.LongReqBody{ body, _ := proto.Marshal(&longmsg.LongReqBody{
Subcmd: 1, Subcmd: 1,
@ -216,17 +216,7 @@ func (c *QQClient) UploadGroupForwardMessage(groupCode int64, m *message.Forward
}, },
}, },
}) })
for i, ip := range rsp.Uint32UpIp { return rsp, body, nil
err := c.highwayUpload(uint32(ip), int(rsp.Uint32UpPort[i]), rsp.MsgSig, body, 27)
if err == nil {
var pv string
for i := 0; i < int(math.Min(4, float64(len(m.Nodes)))); i++ {
pv += fmt.Sprintf(`<title size="26" color="#777777">%s: %s</title>`, m.Nodes[i].SenderName, message.ToReadableString(m.Nodes[i].Message))
}
return genForwardTemplate(rsp.MsgResid, pv, "群聊的聊天记录", "[聊天记录]", "聊天记录", fmt.Sprintf("查看 %d 条转发消息", len(m.Nodes)), ts, items)
}
}
return nil
} }
// MessageSvc.PbSendMsg // MessageSvc.PbSendMsg

View File

@ -560,6 +560,42 @@ func ParseMessageElems(elems []*msg.Elem) []IMessageElement {
} }
func (forMsg *ForwardMessage) CalculateValidationData(seq, random int32, groupCode int64) ([]byte, []byte) { func (forMsg *ForwardMessage) CalculateValidationData(seq, random int32, groupCode int64) ([]byte, []byte) {
msgs := forMsg.packForwardMsg(seq, random, groupCode)
trans := &msg.PbMultiMsgTransmit{Msg: msgs, PbItemList: []*msg.PbMultiMsgItem{
{
FileName: proto.String("MultiMsg"),
Buffer: &msg.PbMultiMsgNew{Msg: msgs},
},
}}
b, _ := proto.Marshal(trans)
data := binary.GZipCompress(b)
hash := md5.Sum(data)
return data, hash[:]
}
// CalculateValidationDataForward 屎代码
func (forMsg *ForwardMessage) CalculateValidationDataForward(seq, random int32, groupCode int64) ([]byte, []byte, []*msg.PbMultiMsgItem) {
msgs := forMsg.packForwardMsg(seq, random, groupCode)
trans := &msg.PbMultiMsgTransmit{Msg: msgs, PbItemList: []*msg.PbMultiMsgItem{
{
FileName: proto.String("MultiMsg"),
Buffer: &msg.PbMultiMsgNew{Msg: msgs},
},
}}
for _, node := range forMsg.Nodes {
for _, message := range node.Message {
if forwardElement, ok := message.(*ForwardElement); ok {
trans.PbItemList = append(trans.PbItemList, forwardElement.Items...)
}
}
}
b, _ := proto.Marshal(trans)
data := binary.GZipCompress(b)
hash := md5.Sum(data)
return data, hash[:], trans.PbItemList
}
func (forMsg *ForwardMessage) packForwardMsg(seq int32, random int32, groupCode int64) []*msg.Message {
var msgs []*msg.Message var msgs []*msg.Message
for _, node := range forMsg.Nodes { for _, node := range forMsg.Nodes {
msgs = append(msgs, &msg.Message{ msgs = append(msgs, &msg.Message{
@ -586,65 +622,7 @@ func (forMsg *ForwardMessage) CalculateValidationData(seq, random int32, groupCo
}, },
}) })
} }
trans := &msg.PbMultiMsgTransmit{Msg: msgs, PbItemList: []*msg.PbMultiMsgItem{ return msgs
{
FileName: proto.String("MultiMsg"),
Buffer: &msg.PbMultiMsgNew{Msg: msgs},
},
}}
b, _ := proto.Marshal(trans)
data := binary.GZipCompress(b)
hash := md5.Sum(data)
return data, hash[:]
}
// CalculateValidationDataForward 屎代码
func (forMsg *ForwardMessage) CalculateValidationDataForward(seq, random int32, groupCode int64) ([]byte, []byte, []*msg.PbMultiMsgItem) {
var msgs []*msg.Message
for _, node := range forMsg.Nodes {
msgs = append(msgs, &msg.Message{
Head: &msg.MessageHead{
FromUin: &node.SenderId,
MsgSeq: &seq,
MsgTime: &node.Time,
MsgUid: proto.Int64(0x01000000000000000 | (int64(random) & 0xFFFFFFFF)),
MutiltransHead: &msg.MutilTransHead{
MsgId: proto.Int32(1),
},
MsgType: proto.Int32(82),
GroupInfo: &msg.GroupInfo{
GroupCode: &groupCode,
GroupRank: []byte{},
GroupName: []byte{},
GroupCard: &node.SenderName,
},
},
Body: &msg.MessageBody{
RichText: &msg.RichText{
Elems: func() []*msg.Elem {
return ToProtoElems(node.Message, false)
}(),
},
},
})
}
trans := &msg.PbMultiMsgTransmit{Msg: msgs, PbItemList: []*msg.PbMultiMsgItem{
{
FileName: proto.String("MultiMsg"),
Buffer: &msg.PbMultiMsgNew{Msg: msgs},
},
}}
for _, item1 := range forMsg.Nodes {
for _, item2 := range item1.Message {
if item3, ok := item2.(*ForwardElement); ok {
trans.PbItemList = append(trans.PbItemList, item3.Items...)
}
}
}
b, _ := proto.Marshal(trans)
data := binary.GZipCompress(b)
hash := md5.Sum(data)
return data, hash[:], trans.PbItemList
} }
func ToReadableString(m []IMessageElement) (r string) { func ToReadableString(m []IMessageElement) (r string) {
@ -658,10 +636,6 @@ func ToReadableString(m []IMessageElement) (r string) {
r += "/" + e.Name r += "/" + e.Name
case *GroupImageElement: case *GroupImageElement:
r += "[图片]" r += "[图片]"
case *ServiceElement:
if e.SubType == "Forward" {
r += "[聊天记录]"
}
case *ForwardElement: case *ForwardElement:
r += "[聊天记录]" r += "[聊天记录]"
// NOTE: flash pic is singular // NOTE: flash pic is singular

View File

@ -125,21 +125,7 @@ func (e *FriendImageElement) Pack() (r []*msg.Elem) {
func (e *ServiceElement) Pack() (r []*msg.Elem) { func (e *ServiceElement) Pack() (r []*msg.Elem) {
r = []*msg.Elem{} r = []*msg.Elem{}
if e.Id == 35 { // id =35 已移至 ForwardElement
r = append(r, &msg.Elem{
RichMsg: &msg.RichMsg{
Template1: append([]byte{1}, binary.ZlibCompress([]byte(e.Content))...),
ServiceId: &e.Id,
MsgResId: []byte{},
},
})
r = append(r, &msg.Elem{
Text: &msg.Text{
Str: proto.String("你的QQ暂不支持查看[转发多条消息],请期待后续版本。"),
},
})
return
}
if e.Id == 33 { if e.Id == 33 {
r = append(r, &msg.Elem{ r = append(r, &msg.Elem{
Text: &msg.Text{Str: &e.ResId}, Text: &msg.Text{Str: &e.ResId},