diff --git a/message/elements.go b/message/elements.go index a03d2885..ba41cee8 100644 --- a/message/elements.go +++ b/message/elements.go @@ -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 } diff --git a/message/forward.go b/message/forward.go new file mode 100644 index 00000000..21c923f0 --- /dev/null +++ b/message/forward.go @@ -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 +} diff --git a/message/message.go b/message/message.go index ab9c5ba8..83269766 100644 --- a/message/message.go +++ b/message/message.go @@ -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) { diff --git a/message/pack.go b/message/pack.go index c646a058..36401be3 100644 --- a/message/pack.go +++ b/message/pack.go @@ -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{