mirror of
https://github.com/Mrs4s/MiraiGo.git
synced 2025-05-04 11:07:40 +08:00
At and Reply element supported.
fix typo.
This commit is contained in:
parent
85e7553b29
commit
414c770818
@ -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 {
|
||||||
res = append(res, message.NewText(elem.Text.Str))
|
if len(elem.Text.Attr6Buf) == 0 {
|
||||||
|
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
@ -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;
|
||||||
|
@ -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: "撇嘴",
|
||||||
|
@ -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{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user