-
Couldn't load subscription status.
- Fork 44
Open
Description
发送文本消息A,用消息B回复消息A,再用消息C回复消息B:
消息C中消息B的 Elements 数组只有 TextElement ,没有对消息A的 ReplyElement:
这就导致需要向上寻找最终被回复的根消息(场景中的消息A)时不方便,目前我的方案是用函数 func (c *QQClient) GetPrivateMessages(uin, timestamp, count uint32) ([]*message2.PrivateMessage, error) ,用Time字段迭代找到root消息:
func findReplyRootMsg(msg *message.PrivateMessage) (*message.PrivateMessage, error) {
var root *message.PrivateMessage // 根消息
replyMsg, ok := msg.Elements[0].(*message.ReplyElement)
if !ok {
return nil, fmt.Errorf("first element is Reply but type assertion failed")
}
for {
// 用Time迭代寻找根message
msgs, err := qqClient.GetPrivateMessages(replyMsg.SenderUin, replyMsg.Time, 1)
if err != nil {
return nil, fmt.Errorf("fail to get messages (uin=%v, time=%v): %w", replyMsg.SenderUin, replyMsg.Time, err)
}
if len(msgs) == 0 {
return nil, fmt.Errorf("no message returned for (uin=%v, time=%v)", replyMsg.SenderUin, replyMsg.Time)
}
m := msgs[0]
if len(m.Elements) == 0 {
return nil, fmt.Errorf("empty message")
}
// 仍是回复消息,继续迭代
if m.Elements[0].Type() == message.Reply {
if next, ok := m.Elements[0].(*message.ReplyElement); ok {
replyMsg = next
continue
}
}
// 第一条非 Reply 的消息 => 根消息
root = m
break
}
return root, nil
}Metadata
Metadata
Assignees
Labels
No labels