merged from gramsrv upstream
This commit is contained in:
parent
79c64ee916
commit
21a0856587
651 changed files with 54774 additions and 4590 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue