diff --git a/client/guild_msg.go b/client/guild_msg.go index 45023b13..b2fc2067 100644 --- a/client/guild_msg.go +++ b/client/guild_msg.go @@ -43,9 +43,13 @@ func init() { func (s *GuildService) SendGuildChannelMessage(guildId, channelId uint64, m *message.SendingMessage) (*message.GuildChannelMessage, error) { mr := rand.Uint32() // 客户端似乎是生成的 u32 虽然类型是u64 - at := m.FirstOrNil(func(e message.IMessageElement) bool { return e.Type() == message.At }) - if at != nil { - at.(*message.AtElement).Guild = true + for _, elem := range m.Elements { + if elem.Type() == message.At { + at := elem.(*message.AtElement) + if at.SubType == message.AtTypeGroupMember { + at.SubType = message.AtTypeGuildMember + } + } } req := &channel.DF62ReqBody{Msg: &channel.ChannelMsgContent{ Head: &channel.ChannelMsgHead{ diff --git a/message/elements.go b/message/elements.go index 5f4a59cd..e1fa3c3b 100644 --- a/message/elements.go +++ b/message/elements.go @@ -41,7 +41,7 @@ type FaceElement struct { type AtElement struct { Target int64 Display string - Guild bool + SubType AtType } type GroupFileElement struct { @@ -107,6 +107,7 @@ type AnimatedSticker struct { } type RedBagMessageType int +type AtType int // /com/tencent/mobileqq/data/MessageForQQWalletMsg.java const ( @@ -130,6 +131,10 @@ const ( RedBagWordChain RedBagMessageType = 24 RedBagKeyword RedBagMessageType = 25 // ? RedBagDrawMultiModel RedBagMessageType = 26 // ?? + + AtTypeGroupMember = 0 // At群成员 + AtTypeGuildMember = 1 // At频道成员 + AtTypeGuildChannel = 2 // At频道 ) func NewText(s string) *TextElement { diff --git a/message/message.go b/message/message.go index 4531aa8c..2a38b637 100644 --- a/message/message.go +++ b/message/message.go @@ -379,13 +379,21 @@ func ParseMessageElems(elems []*msg.Elem) []IMessageElement { att6 := binary.NewReader(elem.Text.Attr6Buf) att6.ReadBytes(7) 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: resv := new(msg.TextResvAttr) _ = proto.Unmarshal(elem.Text.PbReserve, resv) if resv.GetAtType() == 2 { 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) break } diff --git a/message/pack.go b/message/pack.go index 0f5d55ad..37af9a7c 100644 --- a/message/pack.go +++ b/message/pack.go @@ -56,15 +56,8 @@ func (e *FaceElement) Pack() (r []*msg.Elem) { func (e *AtElement) Pack() (r []*msg.Elem) { r = []*msg.Elem{} - if e.Guild { - 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, - }, - }) - } else { + switch e.SubType { + case AtTypeGroupMember: r = append(r, &msg.Elem{ Text: &msg.Text{ 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(" ")}}) return