feat: sync account freeze lifecycle

This commit is contained in:
A 2026-07-15 20:24:37 +08:00
parent 76bfc5100f
commit 47fcf0ea41
40 changed files with 1363 additions and 196 deletions

View file

@ -201,15 +201,26 @@ func (r *Router) registerMessages(d *tg.ServerDispatcher) {
if err != nil {
return nil, internalErr()
}
// difference 类 catch-up FLOOD_WAIT(设计 Phase 2 / §10.3):DrKLO 收 nudge 对未加载频道
// 走 loadUnknownChannel→getPeerDialogs,限速须同时覆盖它(不止 getChannelDifference)。
if err := r.checkCatchupRateLimit(ctx, userID, peerDialogsRateLimitKeyPrefix); err != nil {
return nil, err
}
domainPeers, err := r.dialogPeersFromInput(ctx, userID, peers)
if err != nil {
return nil, err
}
channelIDs := make([]int64, 0, len(domainPeers))
for _, peer := range domainPeers {
if peer.Type == domain.PeerTypeChannel {
channelIDs = append(channelIDs, peer.ID)
}
}
if err := r.checkFrozenChannelParticipants(ctx, userID, channelIDs...); err != nil {
return nil, err
}
// difference 类 catch-up FLOOD_WAIT(设计 Phase 2 / §10.3):DrKLO 收 nudge 对未加载频道
// 走 loadUnknownChannel→getPeerDialogs,限速须同时覆盖它(不止 getChannelDifference)。
// 冻结账号的 guest/non-member 必须先返回 FROZEN_PARTICIPANT_MISSING,拒绝路径不能
// 消耗限流额度或产生其它可变状态。
if err := r.checkCatchupRateLimit(ctx, userID, peerDialogsRateLimitKeyPrefix); err != nil {
return nil, err
}
var list domain.DialogList
if len(domainPeers) > 0 && r.deps.Dialogs != nil {
var err error
@ -259,6 +270,9 @@ func (r *Router) registerMessages(d *tg.ServerDispatcher) {
if err := r.validateInputPeerChannelAccess(ctx, userID, req.Peer, filter.Peer.ID); err != nil {
return nil, err
}
if err := r.checkFrozenChannelParticipants(ctx, userID, filter.Peer.ID); err != nil {
return nil, err
}
if isLegacyInputPeerChat(req.Peer) {
return &tg.MessagesMessages{}, nil
}