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:
parent
66ad12db03
commit
68e387e91b
@ -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{
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user