fix: sync public channel preview updates
This commit is contained in:
parent
2289a31f46
commit
b4aaf57d6b
27 changed files with 877 additions and 128 deletions
|
|
@ -342,11 +342,24 @@ func (s *Service) appendMissingChannelPeerPreviews(ctx context.Context, userID i
|
|||
if !ok || view.Forbidden {
|
||||
continue
|
||||
}
|
||||
if view.Self.Status == domain.ChannelMemberLeft && !view.Self.Guest {
|
||||
// A visible public preview still needs one transient dialog so a
|
||||
// client can finish bootstrapping the requested peer. Keep the top
|
||||
// message and read state at zero: the response is an admission
|
||||
// token, not a persisted/chat-list dialog snapshot. In particular,
|
||||
// clients that persist non-zero top dialogs will instead continue
|
||||
// with messages.getHistory, which is the authoritative preview
|
||||
// history path.
|
||||
out.Dialogs = append(out.Dialogs, publicChannelPreviewBootstrapDialog(view))
|
||||
out.Channels = append(out.Channels, view.Channel)
|
||||
out.Count++
|
||||
present[channelID] = struct{}{}
|
||||
continue
|
||||
}
|
||||
// Linked discussion guests need a transient peer-dialog snapshot so
|
||||
// TDesktop can finish materializing the comments History after
|
||||
// requestSelf. ChannelLeft keeps the snapshot out of the main chat list,
|
||||
// and Guest guarantees this path never turns an ordinary public preview
|
||||
// into a dialog.
|
||||
// while Guest authorizes the target's real top-message snapshot.
|
||||
if view.Self.Status != domain.ChannelMemberActive && !view.Self.Guest {
|
||||
continue
|
||||
}
|
||||
|
|
@ -378,6 +391,14 @@ func (s *Service) appendMissingChannelPeerPreviews(ctx context.Context, userID i
|
|||
return out, nil
|
||||
}
|
||||
|
||||
func publicChannelPreviewBootstrapDialog(view domain.ChannelView) domain.Dialog {
|
||||
return domain.Dialog{
|
||||
Peer: domain.Peer{Type: domain.PeerTypeChannel, ID: view.Channel.ID},
|
||||
ChannelLeft: true,
|
||||
Pts: view.Channel.Pts,
|
||||
}
|
||||
}
|
||||
|
||||
func isChannelPreviewAccessError(err error) bool {
|
||||
return errors.Is(err, domain.ErrChannelPrivate) ||
|
||||
errors.Is(err, domain.ErrChannelUserBanned) ||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue