feat(messages): sync saved message tags

This commit is contained in:
iamxvbaba 2026-07-25 19:23:14 +08:00
parent a785ae7491
commit 6b3eba6c5d
42 changed files with 1581 additions and 551 deletions

View file

@ -802,8 +802,11 @@ type ChannelMessagePeerReaction struct {
// ChannelMessageReactions is the read model carried by channel messages and reaction updates.
type ChannelMessageReactions struct {
CanSeeList bool
Results []ChannelMessageReactionCount
Recent []ChannelMessagePeerReaction
// AsTags marks reactions on Saved Messages as private message tags.
// It is never set for ordinary private/channel reactions.
AsTags bool
Results []ChannelMessageReactionCount
Recent []ChannelMessagePeerReaction
// Paid 是付费 reactionStars聚合nil = 无);读路径从 channel_message_paid_reactions
// 填充、tg 转换注入 ReactionPaid 计数 + top reactors。与普通 reaction 分表存储。
Paid *ChannelMessagePaidReactions
@ -923,6 +926,14 @@ type SavedReactionTag struct {
Count int
}
// SavedReactionTagsRequest lists account-level Saved Messages tags. SavedPeer
// is zero for the global list and non-zero for one Saved Messages sub-dialog.
type SavedReactionTagsRequest struct {
UserID int64
SavedPeer Peer
Limit int
}
// ChannelDiscussionRef links a broadcast post to its discussion megagroup root message.
type ChannelDiscussionRef struct {
ChannelID int64

View file

@ -232,6 +232,8 @@ type MessageFilter struct {
Query string
OffsetID int
OffsetDate int
MinDate int
MaxDate int
AddOffset int
Limit int
MaxID int
@ -245,6 +247,9 @@ type MessageFilter struct {
// SavedPeer 非零时仅返回 self-chat 中该 saved 子会话的消息
// messages.getSavedHistoryPeer 必须同时是 self。
SavedPeer Peer
// SavedReactions 非空时仅返回至少带其中一个 tag 的 Saved Messages。
// 仅 messages.search(peer=self) 使用;普通私聊 reaction 不参与匹配。
SavedReactions []MessageReaction
// PeerIDs restricts a global private search to these user peers. Empty is a
// valid restricted set, so RestrictPeerIDs carries presence separately.
PeerIDs []int64

View file

@ -18,11 +18,10 @@ const (
// UpdateEventWebPage 映射 updateWebPage异步解析完成后把消息里的 pending 链接预览
// 占位就地替换为已解析卡片。携带账号 pts非 LacksWirePts消息快照经 box JOIN 重建,
// 故 difference/dispatch 与 edit_message 同走通用消息事件路径,仅 tg 投影构造器不同。
UpdateEventWebPage UpdateEventType = "web_page"
UpdateEventMessageReactions UpdateEventType = "message_reactions"
UpdateEventWebPage UpdateEventType = "web_page"
// UpdateEventMessagePoll 映射 updateMessagePoll投票/关闭后 poll 状态变化;
// Message 为该 owner 视角消息media 在 difference 重放时按 viewer 重新 enrich
// 与 reaction 同款:占账号 pts 但 TL 构造器无 pts见 LacksWirePts
// 当前历史实现仍将 poll 作为待复核的 LacksWirePts 事件
UpdateEventMessagePoll UpdateEventType = "message_poll"
UpdateEventContactsReset UpdateEventType = "contacts_reset"
UpdateEventDialogPinned UpdateEventType = "dialog_pinned"
@ -126,8 +125,7 @@ type UpdateEvent struct {
// 下一条真正带 pts 的更新会被判为空洞。
func (e UpdateEvent) LacksWirePts() bool {
switch e.Type {
case UpdateEventMessageReactions,
UpdateEventMessagePoll,
case UpdateEventMessagePoll,
UpdateEventDraftMessage,
UpdateEventChannelState,
UpdateEventContactsReset,