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

rf(message): move forward to forward.go

This commit is contained in:
wdvxdr 2021-07-13 16:01:29 +08:00
parent b7dee2aeb2
commit 211a39e36c
No known key found for this signature in database
GPG Key ID: 55FF1414A69CEBA6
4 changed files with 125 additions and 106 deletions

View File

@ -105,13 +105,6 @@ type ServiceElement struct {
SubType string
}
type ForwardElement struct {
FileName string
Content string
ResId string
Items []*msg.PbMultiMsgItem
}
type LightAppElement struct {
Content string
}
@ -334,10 +327,6 @@ func (e *ReplyElement) Type() ElementType {
return Reply
}
func (e *ForwardElement) Type() ElementType {
return Forward
}
func (e *GroupFileElement) Type() ElementType {
return File
}

125
message/forward.go Normal file
View File

@ -0,0 +1,125 @@
package message
import (
"crypto/md5"
"google.golang.org/protobuf/proto"
"github.com/Mrs4s/MiraiGo/binary"
"github.com/Mrs4s/MiraiGo/client/pb/msg"
)
// *----- Definitions -----* //
type ForwardMessage struct {
Nodes []*ForwardNode
}
type ForwardNode struct {
SenderId int64
SenderName string
Time int32
Message []IMessageElement
}
type ForwardElement struct {
FileName string
Content string
ResId string
Items []*msg.PbMultiMsgItem
}
// *----- Implementations -----* //
// Type impl IMessageElement
func (e *ForwardElement) Type() ElementType {
return Forward
}
func (e *ForwardElement) Pack() (r []*msg.Elem) {
r = []*msg.Elem{}
r = append(r, &msg.Elem{
RichMsg: &msg.RichMsg{
Template1: append([]byte{1}, binary.ZlibCompress([]byte(e.Content))...),
ServiceId: proto.Int32(35),
MsgResId: []byte{},
},
})
r = append(r, &msg.Elem{
Text: &msg.Text{
Str: proto.String("你的QQ暂不支持查看[转发多条消息],请期待后续版本。"),
},
})
return
}
// Type impl IMessageElement
func (f *ForwardMessage) Type() ElementType {
return Forward
}
func (f *ForwardMessage) CalculateValidationData(seq, random int32, groupCode int64) ([]byte, []byte) {
msgs := f.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 (f *ForwardMessage) CalculateValidationDataForward(seq, random int32, groupCode int64) ([]byte, []byte, []*msg.PbMultiMsgItem) {
msgs := f.packForwardMsg(seq, random, groupCode)
trans := &msg.PbMultiMsgTransmit{Msg: msgs, PbItemList: []*msg.PbMultiMsgItem{
{
FileName: proto.String("MultiMsg"),
Buffer: &msg.PbMultiMsgNew{Msg: msgs},
},
}}
for _, node := range f.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 (f *ForwardMessage) packForwardMsg(seq int32, random int32, groupCode int64) []*msg.Message {
msgs := make([]*msg.Message, 0, len(f.Nodes))
for _, node := range f.Nodes {
msgs = append(msgs, &msg.Message{
Head: &msg.MessageHead{
FromUin: &node.SenderId,
MsgSeq: &seq,
MsgTime: &node.Time,
MsgUid: proto.Int64(0x0100_0000_0000_0000 | (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: ToProtoElems(node.Message, false),
},
},
})
}
return msgs
}

View File

@ -1,7 +1,6 @@
package message
import (
"crypto/md5"
"math"
"reflect"
"regexp"
@ -54,17 +53,6 @@ type (
Elements []IMessageElement
}
ForwardMessage struct {
Nodes []*ForwardNode
}
ForwardNode struct {
SenderId int64
SenderName string
Time int32
Message []IMessageElement
}
Sender struct {
Uin int64
Nickname string
@ -553,72 +541,6 @@ func ParseMessageElems(elems []*msg.Elem) []IMessageElement {
return res
}
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 {
msgs := make([]*msg.Message, 0, len(forMsg.Nodes))
for _, node := range forMsg.Nodes {
msgs = append(msgs, &msg.Message{
Head: &msg.MessageHead{
FromUin: &node.SenderId,
MsgSeq: &seq,
MsgTime: &node.Time,
MsgUid: proto.Int64(0x0100_0000_0000_0000 | (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: ToProtoElems(node.Message, false),
},
},
})
}
return msgs
}
func ToReadableString(m []IMessageElement) (r string) {
for _, elem := range m {
switch e := elem.(type) {

View File

@ -145,23 +145,6 @@ func (e *ServiceElement) Pack() (r []*msg.Elem) {
return
}
func (e *ForwardElement) Pack() (r []*msg.Elem) {
r = []*msg.Elem{}
r = append(r, &msg.Elem{
RichMsg: &msg.RichMsg{
Template1: append([]byte{1}, binary.ZlibCompress([]byte(e.Content))...),
ServiceId: proto.Int32(35),
MsgResId: []byte{},
},
})
r = append(r, &msg.Elem{
Text: &msg.Text{
Str: proto.String("你的QQ暂不支持查看[转发多条消息],请期待后续版本。"),
},
})
return
}
func (e *LightAppElement) Pack() (r []*msg.Elem) {
r = []*msg.Elem{}
r = append(r, &msg.Elem{