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

feat: at channel support

This commit is contained in:
Mrs4s 2021-12-17 00:20:27 +08:00
parent 66ad12db03
commit 68e387e91b
No known key found for this signature in database
GPG Key ID: 3186E98FA19CE3A7
4 changed files with 33 additions and 15 deletions

View File

@ -43,9 +43,13 @@ func init() {
func (s *GuildService) SendGuildChannelMessage(guildId, channelId uint64, m *message.SendingMessage) (*message.GuildChannelMessage, error) { func (s *GuildService) SendGuildChannelMessage(guildId, channelId uint64, m *message.SendingMessage) (*message.GuildChannelMessage, error) {
mr := rand.Uint32() // 客户端似乎是生成的 u32 虽然类型是u64 mr := rand.Uint32() // 客户端似乎是生成的 u32 虽然类型是u64
at := m.FirstOrNil(func(e message.IMessageElement) bool { return e.Type() == message.At }) for _, elem := range m.Elements {
if at != nil { if elem.Type() == message.At {
at.(*message.AtElement).Guild = true at := elem.(*message.AtElement)
if at.SubType == message.AtTypeGroupMember {
at.SubType = message.AtTypeGuildMember
}
}
} }
req := &channel.DF62ReqBody{Msg: &channel.ChannelMsgContent{ req := &channel.DF62ReqBody{Msg: &channel.ChannelMsgContent{
Head: &channel.ChannelMsgHead{ Head: &channel.ChannelMsgHead{

View File

@ -41,7 +41,7 @@ type FaceElement struct {
type AtElement struct { type AtElement struct {
Target int64 Target int64
Display string Display string
Guild bool SubType AtType
} }
type GroupFileElement struct { type GroupFileElement struct {
@ -107,6 +107,7 @@ type AnimatedSticker struct {
} }
type RedBagMessageType int type RedBagMessageType int
type AtType int
// /com/tencent/mobileqq/data/MessageForQQWalletMsg.java // /com/tencent/mobileqq/data/MessageForQQWalletMsg.java
const ( const (
@ -130,6 +131,10 @@ const (
RedBagWordChain RedBagMessageType = 24 RedBagWordChain RedBagMessageType = 24
RedBagKeyword RedBagMessageType = 25 // ? RedBagKeyword RedBagMessageType = 25 // ?
RedBagDrawMultiModel RedBagMessageType = 26 // ?? RedBagDrawMultiModel RedBagMessageType = 26 // ??
AtTypeGroupMember = 0 // At群成员
AtTypeGuildMember = 1 // At频道成员
AtTypeGuildChannel = 2 // At频道
) )
func NewText(s string) *TextElement { func NewText(s string) *TextElement {

View File

@ -379,13 +379,21 @@ func ParseMessageElems(elems []*msg.Elem) []IMessageElement {
att6 := binary.NewReader(elem.Text.Attr6Buf) att6 := binary.NewReader(elem.Text.Attr6Buf)
att6.ReadBytes(7) att6.ReadBytes(7)
target := int64(uint32(att6.ReadInt32())) target := int64(uint32(att6.ReadInt32()))
res = append(res, NewAt(target, elem.Text.GetStr())) at := NewAt(target, elem.Text.GetStr())
at.SubType = AtTypeGroupMember
res = append(res, at)
case len(elem.Text.PbReserve) > 0: case len(elem.Text.PbReserve) > 0:
resv := new(msg.TextResvAttr) resv := new(msg.TextResvAttr)
_ = proto.Unmarshal(elem.Text.PbReserve, resv) _ = proto.Unmarshal(elem.Text.PbReserve, resv)
if resv.GetAtType() == 2 { if resv.GetAtType() == 2 {
at := NewAt(int64(resv.GetAtMemberTinyid()), elem.Text.GetStr()) at := NewAt(int64(resv.GetAtMemberTinyid()), elem.Text.GetStr())
at.Guild = true at.SubType = AtTypeGuildMember
res = append(res, at)
break
}
if resv.GetAtType() == 4 {
at := NewAt(int64(resv.AtChannelInfo.GetChannelId()), elem.Text.GetStr())
at.SubType = AtTypeGuildChannel
res = append(res, at) res = append(res, at)
break break
} }

View File

@ -56,15 +56,8 @@ func (e *FaceElement) Pack() (r []*msg.Elem) {
func (e *AtElement) Pack() (r []*msg.Elem) { func (e *AtElement) Pack() (r []*msg.Elem) {
r = []*msg.Elem{} r = []*msg.Elem{}
if e.Guild { switch e.SubType {
pb, _ := proto.Marshal(&msg.TextResvAttr{AtType: proto.Uint32(2), AtMemberTinyid: proto.Uint64(uint64(e.Target))}) case AtTypeGroupMember:
r = append(r, &msg.Elem{
Text: &msg.Text{
Str: &e.Display,
PbReserve: pb,
},
})
} else {
r = append(r, &msg.Elem{ r = append(r, &msg.Elem{
Text: &msg.Text{ Text: &msg.Text{
Str: &e.Display, Str: &e.Display,
@ -82,6 +75,14 @@ func (e *AtElement) Pack() (r []*msg.Elem) {
}), }),
}, },
}) })
case AtTypeGuildMember:
pb, _ := proto.Marshal(&msg.TextResvAttr{AtType: proto.Uint32(2), AtMemberTinyid: proto.Uint64(uint64(e.Target))})
r = append(r, &msg.Elem{
Text: &msg.Text{
Str: &e.Display,
PbReserve: pb,
},
})
} }
r = append(r, &msg.Elem{Text: &msg.Text{Str: proto.String(" ")}}) r = append(r, &msg.Elem{Text: &msg.Text{Str: proto.String(" ")}})
return return