chore: refresh gramsrv public release

This commit is contained in:
A 2026-06-30 14:37:43 +08:00
parent 75cebe8dbf
commit 70b6820474
1274 changed files with 378751 additions and 59919 deletions

View file

@ -4,25 +4,65 @@ package domain
type UpdateEventType string
const (
UpdateEventNewMessage UpdateEventType = "new_message"
UpdateEventReadHistoryInbox UpdateEventType = "read_history_inbox"
UpdateEventReadHistoryOutbox UpdateEventType = "read_history_outbox"
UpdateEventReadMessageContents UpdateEventType = "read_message_contents"
UpdateEventEditMessage UpdateEventType = "edit_message"
UpdateEventMessageReactions UpdateEventType = "message_reactions"
UpdateEventContactsReset UpdateEventType = "contacts_reset"
UpdateEventDialogPinned UpdateEventType = "dialog_pinned"
UpdateEventPinnedDialogs UpdateEventType = "pinned_dialogs"
UpdateEventDialogUnreadMark UpdateEventType = "dialog_unread_mark"
UpdateEventPeerSettings UpdateEventType = "peer_settings"
UpdateEventDeleteMessages UpdateEventType = "delete_messages"
UpdateEventDialogFilter UpdateEventType = "dialog_filter"
UpdateEventDialogFilterOrder UpdateEventType = "dialog_filter_order"
UpdateEventDialogFilters UpdateEventType = "dialog_filters"
UpdateEventFolderPeers UpdateEventType = "folder_peers"
UpdateEventChannelAvailable UpdateEventType = "channel_available_messages"
UpdateEventChannelViewForum UpdateEventType = "channel_view_forum_as_messages"
UpdateEventNoop UpdateEventType = "noop"
UpdateEventNewMessage UpdateEventType = "new_message"
UpdateEventReadHistoryInbox UpdateEventType = "read_history_inbox"
UpdateEventReadHistoryOutbox UpdateEventType = "read_history_outbox"
// forum 话题级已读:messages.readDiscussion 推进 per-topic 水位后下发。
UpdateEventReadChannelDiscussionInbox UpdateEventType = "read_channel_discussion_inbox"
UpdateEventReadChannelDiscussionOutbox UpdateEventType = "read_channel_discussion_outbox"
UpdateEventReadMessageContents UpdateEventType = "read_message_contents"
UpdateEventEditMessage UpdateEventType = "edit_message"
// UpdateEventWebPage 映射 updateWebPage:异步解析完成后把消息里的 pending 链接预览
// 占位就地替换为已解析卡片。携带账号 pts(非 LacksWirePts),消息快照经 box JOIN 重建,
// 故 difference/dispatch 与 edit_message 同走通用消息事件路径,仅 tg 投影构造器不同。
UpdateEventWebPage UpdateEventType = "web_page"
UpdateEventMessageReactions UpdateEventType = "message_reactions"
// UpdateEventMessagePoll 映射 updateMessagePoll(投票/关闭后 poll 状态变化;
// Message 为该 owner 视角消息,media 在 difference 重放时按 viewer 重新 enrich)。
// 与 reaction 同款:占账号 pts 但 TL 构造器无 pts,见 LacksWirePts。
UpdateEventMessagePoll UpdateEventType = "message_poll"
UpdateEventContactsReset UpdateEventType = "contacts_reset"
UpdateEventDialogPinned UpdateEventType = "dialog_pinned"
UpdateEventPinnedDialogs UpdateEventType = "pinned_dialogs"
UpdateEventDialogUnreadMark UpdateEventType = "dialog_unread_mark"
UpdateEventPeerSettings UpdateEventType = "peer_settings"
UpdateEventPeerStoryBlocked UpdateEventType = "peer_story_blocked"
UpdateEventDeleteMessages UpdateEventType = "delete_messages"
// UpdateEventPinnedMessages 映射 updatePinnedMessages(私聊置顶/取消
// 置顶;MessageIDs 是该 owner 自己视角的 box id,Bool 为 pinned)。
// TL 构造器自带账号 pts/pts_count,不属于 LacksWirePts。
UpdateEventPinnedMessages UpdateEventType = "pinned_messages"
UpdateEventDialogFilter UpdateEventType = "dialog_filter"
UpdateEventDialogFilterOrder UpdateEventType = "dialog_filter_order"
UpdateEventDialogFilters UpdateEventType = "dialog_filters"
UpdateEventFolderPeers UpdateEventType = "folder_peers"
UpdateEventChannelAvailable UpdateEventType = "channel_available_messages"
UpdateEventChannelViewForum UpdateEventType = "channel_view_forum_as_messages"
UpdateEventStory UpdateEventType = "story"
UpdateEventReadStories UpdateEventType = "read_stories"
UpdateEventSentStoryReaction UpdateEventType = "sent_story_reaction"
UpdateEventNewStoryReaction UpdateEventType = "new_story_reaction"
UpdateEventQuickReplies UpdateEventType = "quick_replies"
UpdateEventNewQuickReply UpdateEventType = "new_quick_reply"
UpdateEventDeleteQuickReply UpdateEventType = "delete_quick_reply"
UpdateEventQuickReplyMessage UpdateEventType = "quick_reply_message"
UpdateEventDeleteQuickReplyMessages UpdateEventType = "delete_quick_reply_messages"
// UpdateEventChannelState 表示当前账号与某频道的成员关系发生变化
// (leave/kick),离线设备经 difference 收到 updateChannel 后重新拉取
// channel 状态并移除会话。
UpdateEventChannelState UpdateEventType = "channel_state"
// UpdateEventDraftMessage 映射 updateDraftMessage(云草稿变更;Peer 为会话,
// MaxID 复用为 forum top_msg_id)。事件只是"该会话草稿变过"的标记——草稿是
// 绝对状态而非增量,difference/outbox 重放时按 Peer 重载当前草稿填充 Draft
// 字段(已删则下发 draftMessageEmpty),不在事件行里固化内容快照。
UpdateEventDraftMessage UpdateEventType = "draft_message"
// UpdateEventSavedDialogPinned 映射 updateSavedDialogPinned(收藏夹
// 子会话置顶翻转;Peer 为子会话分组键,Bool 为 pinned)。
UpdateEventSavedDialogPinned UpdateEventType = "saved_dialog_pinned"
// UpdateEventPinnedSavedDialogs 映射 updatePinnedSavedDialogs
// (收藏夹置顶顺序整表,Peers 为新顺序)。
UpdateEventPinnedSavedDialogs UpdateEventType = "pinned_saved_dialogs"
UpdateEventNoop UpdateEventType = "noop"
)
// UpdateEvent 是账号视角的增量事件,按 user_id + pts 顺序持久化。
@ -33,6 +73,7 @@ type UpdateEvent struct {
PtsCount int
Date int
Message Message
Story Story
Peer Peer
Peers []Peer
Bool bool
@ -40,13 +81,73 @@ type UpdateEvent struct {
MessageIDs []int
MaxID int
StillUnreadCount int
Users []User
Channels []Channel
FilterID int
DialogFilter *DialogFolder
FilterOrder []int
FolderPeers []FolderPeerUpdate
TagsEnabled bool
ChannelPts int
// TopMsgID 仅 forum per-topic 已读事件(read_channel_discussion_*)使用:承载话题 id
// (General=1),与 MaxID(=read_max_id) 一起映射 updateReadChannelDiscussionInbox/Outbox。
TopMsgID int
Users []User
Channels []Channel
FilterID int
// FolderID 是 read 类事件发生时该会话所在的物理 folder(0 主列表/1 归档),
// 填入 updateReadChannelInbox.folder_id。
FolderID int
DialogFilter *DialogFolder
// Draft 仅 draft_message 事件使用:不持久化,difference/outbox 重放时按
// Peer(+MaxID=top_msg_id) 重载当前草稿填充;nil 表示草稿已删(下发 empty)。
Draft *DialogDraft
FilterOrder []int
FolderPeers []FolderPeerUpdate
TagsEnabled bool
Reaction *MessageReaction
QuickReplies []QuickReply
QuickReply QuickReply
QuickReplyMessage QuickReplyMessage
}
// LacksWirePts 表示该事件占用了账号 pts,但它对应的 TL update 构造器没有
// 账号 pts 字段(reaction、channel 已读、dialog/folder/settings 状态类)。
// 在线投递这类事件必须附带显式 pts 簿记,否则客户端水位与服务端错位,
// 下一条真正带 pts 的更新会被判为空洞。
func (e UpdateEvent) LacksWirePts() bool {
switch e.Type {
case UpdateEventMessageReactions,
UpdateEventMessagePoll,
UpdateEventDraftMessage,
UpdateEventChannelState,
UpdateEventContactsReset,
UpdateEventDialogPinned,
UpdateEventPinnedDialogs,
UpdateEventSavedDialogPinned,
UpdateEventPinnedSavedDialogs,
UpdateEventDialogUnreadMark,
UpdateEventPeerSettings,
UpdateEventPeerStoryBlocked,
UpdateEventDialogFilter,
UpdateEventDialogFilterOrder,
UpdateEventDialogFilters,
UpdateEventChannelAvailable,
UpdateEventChannelViewForum,
UpdateEventStory,
UpdateEventReadStories,
UpdateEventSentStoryReaction,
UpdateEventNewStoryReaction,
UpdateEventQuickReplies,
UpdateEventNewQuickReply,
UpdateEventDeleteQuickReply,
UpdateEventQuickReplyMessage,
UpdateEventDeleteQuickReplyMessages:
// updateFolderPeers 自带 pts/pts_count,不在此列。
return true
case UpdateEventReadChannelDiscussionInbox, UpdateEventReadChannelDiscussionOutbox:
// forum 话题已读映射 updateReadChannelDiscussionInbox/Outbox,无账号 pts 字段。
return true
case UpdateEventReadHistoryInbox, UpdateEventReadHistoryOutbox:
// channel peer 映射 updateReadChannelInbox/Outbox,无账号 pts 字段;
// 私聊形态自带 pts/pts_count。
return e.Peer.Type == PeerTypeChannel
default:
return false
}
}
// UpdateDifference 是 updates.getDifference 的业务层结果。
@ -63,4 +164,5 @@ type UpdateDifference struct {
type ChannelDifferenceNudge struct {
ChannelID int64
Pts int
Channel *ChannelView
}