package message import ( "bytes" "crypto/md5" protobuf "github.com/segmentio/encoding/proto" "google.golang.org/protobuf/proto" "github.com/Mrs4s/MiraiGo/binary" "github.com/Mrs4s/MiraiGo/internal/protobuf/data/msg" "github.com/Mrs4s/MiraiGo/utils" ) // *----- Definitions -----* // // ForwardMessage 添加 Node 请用 AddNode 方法 type ForwardMessage struct { Nodes []*ForwardNode items []*msg.PbMultiMsgItem } 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() []*msg.Elem { rich := &msg.Elem{ RichMsg: &msg.RichMsg{ Template1: append([]byte{1}, binary.ZlibCompress(utils.S2B(e.Content))...), ServiceId: proto.Int32(35), MsgResId: []byte{}, }, } txt := &msg.Elem{ Text: &msg.Text{ Str: proto.String("你的QQ暂不支持查看[转发多条消息],请期待后续版本。"), }, } return []*msg.Elem{rich, txt} } func NewForwardMessage() *ForwardMessage { return &ForwardMessage{} } // AddNode adds a node to the forward message. return for method chaining. func (f *ForwardMessage) AddNode(node *ForwardNode) *ForwardMessage { f.Nodes = append(f.Nodes, node) for _, item := range node.Message { if item.Type() != Forward { // quick path continue } if forward, ok := item.(*ForwardElement); ok { f.items = append(f.items, forward.Items...) } } return f } // Length return the length of Nodes. func (f *ForwardMessage) Length() int { return len(f.Nodes) } func (f *ForwardMessage) Brief() string { var brief bytes.Buffer for _, n := range f.Nodes { brief.WriteString(ToReadableString(n.Message)) if brief.Len() >= 27 { break } } return brief.String() } func (f *ForwardMessage) Preview() string { var pv bytes.Buffer for i, node := range f.Nodes { if i >= 4 { break } pv.WriteString(`