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

At and Reply element supported.

fix typo.
This commit is contained in:
Mrs4s 2020-07-12 15:58:14 +08:00
parent 85e7553b29
commit 414c770818
5 changed files with 869 additions and 590 deletions

View File

@ -2,6 +2,7 @@ package client
import ( import (
"crypto/md5" "crypto/md5"
"github.com/Mrs4s/MiraiGo/binary"
devinfo "github.com/Mrs4s/MiraiGo/client/pb" devinfo "github.com/Mrs4s/MiraiGo/client/pb"
"github.com/Mrs4s/MiraiGo/client/pb/msg" "github.com/Mrs4s/MiraiGo/client/pb/msg"
"github.com/Mrs4s/MiraiGo/message" "github.com/Mrs4s/MiraiGo/message"
@ -177,8 +178,25 @@ func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage {
func parseMessageElems(elems []*msg.Elem) []message.IMessageElement { func parseMessageElems(elems []*msg.Elem) []message.IMessageElement {
var res []message.IMessageElement var res []message.IMessageElement
for _, elem := range elems { for _, elem := range elems {
if elem.SrcMsg != nil {
if len(elem.SrcMsg.OrigSeqs) != 0 {
r := &message.ReplyElement{
ReplySeq: elem.SrcMsg.OrigSeqs[0],
Elements: parseMessageElems(elem.SrcMsg.Elems),
}
res = append(res, r)
}
continue
}
if elem.Text != nil { if elem.Text != nil {
if len(elem.Text.Attr6Buf) == 0 {
res = append(res, message.NewText(elem.Text.Str)) res = append(res, message.NewText(elem.Text.Str))
} else {
att6 := binary.NewReader(elem.Text.Attr6Buf)
att6.ReadBytes(7)
target := int64(uint32(att6.ReadInt32()))
res = append(res, message.NewAt(target, elem.Text.Str))
}
} }
if elem.CustomFace != nil { if elem.CustomFace != nil {
res = append(res, message.NewNetImage(elem.CustomFace.FilePath, "http://gchat.qpic.cn"+elem.CustomFace.OrigUrl)) res = append(res, message.NewNetImage(elem.CustomFace.FilePath, "http://gchat.qpic.cn"+elem.CustomFace.OrigUrl))

File diff suppressed because it is too large Load Diff

View File

@ -170,7 +170,7 @@ message Elem {
//ApolloActMsg? apolloMsg = 42; //ApolloActMsg? apolloMsg = 42;
//GroupPubAccountInfo? groupPubAccInfo = 43; //GroupPubAccountInfo? groupPubAccInfo = 43;
//BlessingMessage? blessMsg = 44; //BlessingMessage? blessMsg = 44;
//SourceMsg? srcMsg = 45; SourceMsg srcMsg = 45;
//LolaMsg? lolaMsg = 46; //LolaMsg? lolaMsg = 46;
//GroupBusinessMsg? groupBusinessMsg = 47; //GroupBusinessMsg? groupBusinessMsg = 47;
//WorkflowNotifyMsg? msgWorkflowNotify = 48; //WorkflowNotifyMsg? msgWorkflowNotify = 48;
@ -361,6 +361,20 @@ message VideoFile {
bytes pbReserve = 24; bytes pbReserve = 24;
} }
message SourceMsg {
repeated int32 origSeqs = 1;
int64 senderUin = 2;
int32 time = 3;
int32 flag = 4;
repeated Elem elems = 5;
int32 type = 6;
bytes richMsg = 7;
bytes pbReserve = 8;
bytes srcMsg = 9;
int64 toUin = 10;
bytes troopName = 11;
}
message Face { message Face {
int32 index = 1; int32 index = 1;
bytes old = 2; bytes old = 2;

View File

@ -1,6 +1,9 @@
package message package message
import "strings" import (
"strconv"
"strings"
)
type TextElement struct { type TextElement struct {
Content string Content string
@ -23,6 +26,16 @@ type FaceElement struct {
Name string Name string
} }
type AtElement struct {
Target int64
Display string
}
type ReplyElement struct {
ReplySeq int32
Elements []IMessageElement
}
func NewText(s string) *TextElement { func NewText(s string) *TextElement {
return &TextElement{Content: s} return &TextElement{Content: s}
} }
@ -59,6 +72,20 @@ func NewFace(index int32) *FaceElement {
} }
} }
func NewAt(target int64, display ...string) *AtElement {
dis := "@" + strconv.FormatInt(target, 10)
if target == 0 {
dis = "@全体成员"
}
if len(display) != 0 {
dis = display[0]
}
return &AtElement{
Target: target,
Display: dis,
}
}
func (e *TextElement) Type() ElementType { func (e *TextElement) Type() ElementType {
return Text return Text
} }
@ -75,6 +102,14 @@ func (e *GroupImageElement) Type() ElementType {
return Image return Image
} }
func (e *AtElement) Type() ElementType {
return At
}
func (e *ReplyElement) Type() ElementType {
return Reply
}
var faceMap = map[int]string{ var faceMap = map[int]string{
14: "微笑", 14: "微笑",
1: "撇嘴", 1: "撇嘴",

View File

@ -3,6 +3,7 @@ package message
import ( import (
"github.com/Mrs4s/MiraiGo/binary" "github.com/Mrs4s/MiraiGo/binary"
"github.com/Mrs4s/MiraiGo/client/pb/msg" "github.com/Mrs4s/MiraiGo/client/pb/msg"
"strconv"
) )
type PrivateMessage struct { type PrivateMessage struct {
@ -40,21 +41,29 @@ const (
Text ElementType = iota Text ElementType = iota
Image Image
Face Face
At
Reply
) )
func (s *Sender) IsAnonymous() bool { func (s *Sender) IsAnonymous() bool {
return s.Uin == 80000000 return s.Uin == 80000000
} }
func NewSendingMessage() *SendingMessage {
return &SendingMessage{}
}
func (msg *PrivateMessage) ToString() (res string) { func (msg *PrivateMessage) ToString() (res string) {
for _, elem := range msg.Elements { for _, elem := range msg.Elements {
switch e := elem.(type) { switch e := elem.(type) {
case *TextElement: case *TextElement:
res += e.Content res += e.Content
case *ImageElement: case *ImageElement:
res += " [Image= " + e.Filename + " ] " res += "[Image:" + e.Filename + "]"
case *FaceElement: case *FaceElement:
res += " [" + e.Name + "] " res += "[" + e.Name + "]"
case *AtElement:
res += e.Display
} }
} }
return return
@ -66,11 +75,15 @@ func (msg *GroupMessage) ToString() (res string) {
case *TextElement: case *TextElement:
res += e.Content res += e.Content
case *ImageElement: case *ImageElement:
res += " [Image= " + e.Filename + " ] " res += "[Image:" + e.Filename + "]"
case *FaceElement: case *FaceElement:
res += " [" + e.Name + "] " res += "[" + e.Name + "]"
case *GroupImageElement: case *GroupImageElement:
res += "[Image= " + e.ImageId + " ]" res += "[Image: " + e.ImageId + "]"
case *AtElement:
res += e.Display
case *ReplyElement:
res += "[Reply:" + strconv.FormatInt(int64(e.ReplySeq), 10) + "]"
} }
} }
return return
@ -98,6 +111,21 @@ func ToProtoElems(elems []IMessageElement) (r []*msg.Elem) {
Buf: []byte{0x00, 0x01, 0x00, 0x04, 0x52, 0xCC, 0xF5, 0xD0}, Buf: []byte{0x00, 0x01, 0x00, 0x04, 0x52, 0xCC, 0xF5, 0xD0},
}, },
}) })
case *AtElement:
r = append(r, &msg.Elem{
Text: &msg.Text{
Str: e.Display,
Attr6Buf: binary.NewWriterF(func(w *binary.Writer) {
w.WriteUInt16(1)
w.WriteUInt16(0)
w.WriteUInt16(uint16(len(e.Display)))
w.WriteByte(0)
w.WriteUInt32(uint32(e.Target))
w.WriteUInt16(0)
}),
},
})
r = append(r, &msg.Elem{Text: &msg.Text{Str: " "}})
case *GroupImageElement: case *GroupImageElement:
r = append(r, &msg.Elem{ r = append(r, &msg.Elem{
CustomFace: &msg.CustomFace{ CustomFace: &msg.CustomFace{