merged from gramsrv upstream

This commit is contained in:
onysd 2026-09-01 12:06:31 +03:00
parent 79c64ee916
commit 21a0856587
651 changed files with 54774 additions and 4590 deletions

View file

@ -2,11 +2,13 @@ package rpc
import (
"context"
"unicode/utf8"
"github.com/iamxvbaba/td/tg"
"github.com/iamxvbaba/td/tlprofile"
"telesrv/internal/compat/tdesktop"
"telesrv/internal/domain"
"unicode/utf8"
)
// registerMessages 注册 messages.* RPC handler。
@ -432,6 +434,21 @@ func (r *Router) registerMessages(d *tlprofile.Dispatcher) {
return &tg.MessagesDialogsNotModified{Count: hashCheck.Count}, nil
}
}
type pinnedLoadResult struct {
list domain.DialogList
err error
}
var pinnedLoad <-chan pinnedLoadResult
if ClientTypeFrom(ctx) == ClientTypeTDesktop && tdesktop.ShouldMergePinnedIntoInitialDialogs(filter) {
pinnedCtx, cancelPinned := context.WithCancel(ctx)
defer cancelPinned()
results := make(chan pinnedLoadResult, 1)
pinnedLoad = results
go func() {
list, err := r.pinnedDialogsList(pinnedCtx, userID, domain.DialogMainFolderID)
results <- pinnedLoadResult{list: list, err: err}
}()
}
list, err := r.deps.Dialogs.GetDialogs(ctx, userID, filter)
if err != nil {
return nil, internalErr()
@ -440,16 +457,18 @@ func (r *Router) registerMessages(d *tlprofile.Dispatcher) {
if err != nil {
return nil, communityErr(err)
}
if ClientTypeFrom(ctx) == ClientTypeTDesktop && tdesktop.ShouldMergePinnedIntoInitialDialogs(filter) {
pinned, err := r.pinnedDialogsList(ctx, userID, domain.DialogMainFolderID)
if err != nil {
if pinnedLoad != nil {
pinned := <-pinnedLoad
if pinned.err != nil {
return nil, internalErr()
}
list = tdesktop.MergeInitialDialogsWithPinned(list, pinned)
}
if filter.Hash != 0 && r.deps.Communities == nil && list.Hash == filter.Hash {
return &tg.MessagesDialogsNotModified{Count: list.Count}, nil
list = tdesktop.MergeInitialDialogsWithPinned(list, pinned.list)
}
// An unknown cache entry is also the invalidation signal for metadata that
// does not alter dialog ordering (for example verified/scam/fake flags).
// In that case the peer objects must be sent once even when the freshly
// computed list hash still equals the client's hash. The response warms the
// cache, so later identical requests retain the fast NotModified path above.
return r.tgMessagesDialogs(ctx, userID, r.withDialogListPresence(ctx, userID, list)), nil
})
registerRPC[*tg.MessagesGetPinnedDialogsRequest](d, tlprofile.SemanticMethodMessagesGetPinnedDialogs, func(ctx context.Context, layerRequest *tg.MessagesGetPinnedDialogsRequest) (any, error) {
@ -720,6 +739,12 @@ func (r *Router) registerMessages(d *tlprofile.Dispatcher) {
if isLegacyInputPeerChat(req.Peer) {
return &tg.MessagesMessages{}, nil
}
// P2P calls are stored exclusively in private message boxes. Returning
// an empty result is important here: falling through to channel history
// would make ordinary channel posts appear in the Calls tab.
if filter.PhoneCallsOnly {
return &tg.MessagesMessages{}, nil
}
if messagesSearchFilterChatPhotos(req.Filter) {
view, err := r.resolveInputPeerChannelView(ctx, userID, req.Peer, filter.Peer.ID)
if err != nil {
@ -758,15 +783,11 @@ func (r *Router) registerMessages(d *tlprofile.Dispatcher) {
if err := r.validateInputPeerChannelAccess(ctx, userID, req.Peer, filter.Peer.ID); err != nil {
return nil, err
}
categories := mediaCategoriesForFilter(req.Filter)
mediaReq := domain.MediaSearchRequest{
Categories: categories,
OffsetID: req.OffsetID,
AddOffset: domain.ClampMessageHistoryAddOffset(req.AddOffset),
Limit: req.Limit,
MaxID: req.MaxID,
MinID: req.MinID,
mediaReq, err := r.mediaSearchRequestFromMessagesSearch(ctx, userID, req, filter)
if err != nil {
return nil, err
}
categories := mediaReq.Categories
if mediaSearchCanReusePeerWideCount(req) {
counts, err := r.mediaCountsForPeer(ctx, userID, filter.Peer)
if err != nil {
@ -843,15 +864,11 @@ func (r *Router) registerMessages(d *tlprofile.Dispatcher) {
Count: counts.CountAny(mediaCategoriesForFilter(req.Filter)),
}), nil
}
categories := mediaCategoriesForFilter(req.Filter)
mediaReq := domain.MediaSearchRequest{
Categories: categories,
OffsetID: req.OffsetID,
AddOffset: domain.ClampMessageHistoryAddOffset(req.AddOffset),
Limit: req.Limit,
MaxID: req.MaxID,
MinID: req.MinID,
mediaReq, err := r.mediaSearchRequestFromMessagesSearch(ctx, userID, req, filter)
if err != nil {
return nil, err
}
categories := mediaReq.Categories
if mediaSearchCanReusePeerWideCount(req) {
counts, err := r.mediaCountsForPeer(ctx, userID, peer)
if err != nil {