1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 19:17:38 +08:00

feat: supported parsing emoji reactions updated event operator id and message sender uin

This commit is contained in:
Mrs4s 2021-11-08 18:07:32 +08:00
parent c350734b4f
commit 10a98ca4f1
No known key found for this signature in database
GPG Key ID: 3186E98FA19CE3A7
3 changed files with 53 additions and 4 deletions

View File

@ -221,11 +221,12 @@ type (
} }
GuildMessageReactionsUpdatedEvent struct { GuildMessageReactionsUpdatedEvent struct {
OperatorId uint64 // OperatorId 操作者TinyId, 只有自身消息被贴表情才会有值 OperatorId uint64 // OperatorId 操作者TinyId, 删除贴表情的事件下不会有值
EmojiId int32 // EmojiId 被贴的表情, 只有自身消息被贴表情才会有值 EmojiId int32 // EmojiId 被贴的表情, 只有自身消息被贴表情才会有值
GuildId uint64 GuildId uint64
ChannelId uint64 ChannelId uint64
MessageId uint64 MessageId uint64
MessageSenderUin int64 // MessageSenderUin 被贴表情的消息发送者QQ号
CurrentReactions []*message.GuildMessageEmojiReaction CurrentReactions []*message.GuildMessageEmojiReaction
} }

View File

@ -8,6 +8,7 @@ import (
"github.com/Mrs4s/MiraiGo/client/pb/msg" "github.com/Mrs4s/MiraiGo/client/pb/msg"
"github.com/Mrs4s/MiraiGo/message" "github.com/Mrs4s/MiraiGo/message"
"google.golang.org/protobuf/proto" "google.golang.org/protobuf/proto"
"time"
) )
func init() { func init() {
@ -41,6 +42,12 @@ func decodeGuildMessagePushPacket(c *QQClient, _ *incomingPacketInfo, payload []
} }
for _, m := range push.Msgs { for _, m := range push.Msgs {
if m.Head.ContentHead.GetType() == 3841 { if m.Head.ContentHead.GetType() == 3841 {
type tipsPushInfo struct {
TinyId uint64
TargetMessageSenderUin int64
GuildId uint64
ChannelId uint64
}
// todo: 回头 event flow 的处理移出去重构下逻辑, 先暂时这样方便改 // todo: 回头 event flow 的处理移出去重构下逻辑, 先暂时这样方便改
var common *msg.CommonElem var common *msg.CommonElem
if m.Body != nil { if m.Body != nil {
@ -52,7 +59,18 @@ func decodeGuildMessagePushPacket(c *QQClient, _ *incomingPacketInfo, payload []
} }
} }
if m.Head.ContentHead.GetSubType() == 2 { // todo: tips? if m.Head.ContentHead.GetSubType() == 2 { // todo: tips?
continue if common == nil { // empty tips
}
tipsInfo := &tipsPushInfo{
TinyId: m.Head.RoutingHead.GetFromTinyid(),
GuildId: m.Head.RoutingHead.GetGuildId(),
ChannelId: m.Head.RoutingHead.GetChannelId(),
}
if len(m.CtrlHead.IncludeUin) > 0 {
tipsInfo.TargetMessageSenderUin = int64(m.CtrlHead.IncludeUin[0])
}
return tipsInfo, nil
} }
if common == nil || common.GetServiceType() != 500 { if common == nil || common.GetServiceType() != 500 {
continue continue
@ -76,13 +94,24 @@ func decodeGuildMessagePushPacket(c *QQClient, _ *incomingPacketInfo, payload []
if t[0].Head.RoutingHead.GetFromTinyid() == c.GuildService.TinyId { if t[0].Head.RoutingHead.GetFromTinyid() == c.GuildService.TinyId {
continue continue
} }
// todo: 如果是别人消息被贴表情, 会在在后续继续推送一个 empty tips, 可以从那个消息获取到 OperatorId updatedEvent := &GuildMessageReactionsUpdatedEvent{
c.dispatchGuildMessageReactionsUpdatedEvent(&GuildMessageReactionsUpdatedEvent{
GuildId: m.Head.RoutingHead.GetGuildId(), GuildId: m.Head.RoutingHead.GetGuildId(),
ChannelId: m.Head.RoutingHead.GetChannelId(), ChannelId: m.Head.RoutingHead.GetChannelId(),
MessageId: t[0].Head.ContentHead.GetSeq(), MessageId: t[0].Head.ContentHead.GetSeq(),
CurrentReactions: decodeGuildMessageEmojiReactions(t[0]), CurrentReactions: decodeGuildMessageEmojiReactions(t[0]),
}
tipsInfo, err := c.waitPacketTimeoutSyncF("MsgPush.PushGroupProMsg", time.Second, func(i interface{}) bool {
if i == nil {
return false
}
_, ok := i.(*tipsPushInfo)
return ok
}) })
if err == nil {
updatedEvent.OperatorId = tipsInfo.(*tipsPushInfo).TinyId
updatedEvent.MessageSenderUin = tipsInfo.(*tipsPushInfo).TargetMessageSenderUin
}
c.dispatchGuildMessageReactionsUpdatedEvent(updatedEvent)
} }
} }
continue continue

View File

@ -213,6 +213,25 @@ func (c *QQClient) waitPacket(cmd string, f func(interface{}, error)) func() {
} }
} }
// waitPacketTimeoutSyncF
// 等待一个数据包解析, 优先级低于 sendAndWait
func (c *QQClient) waitPacketTimeoutSyncF(cmd string, timeout time.Duration, filter func(interface{}) bool) (r interface{}, e error) {
notifyChan := make(chan bool)
defer c.waitPacket(cmd, func(i interface{}, err error) {
if filter(i) {
r = i
e = err
notifyChan <- true
}
})()
select {
case <-notifyChan:
return
case <-time.After(timeout):
return nil, errors.New("timeout")
}
}
// sendAndWaitDynamic // sendAndWaitDynamic
// 发送数据包并返回需要解析的 response // 发送数据包并返回需要解析的 response
func (c *QQClient) sendAndWaitDynamic(seq uint16, pkt []byte) ([]byte, error) { func (c *QQClient) sendAndWaitDynamic(seq uint16, pkt []byte) ([]byte, error) {