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) {
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{

View File

@ -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 {

View File

@ -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
}

View File

@ -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