From eb82664452c60eff83643bdfd5ed13600f37dd72 Mon Sep 17 00:00:00 2001 From: John Preston <johnprestonmail@gmail.com> Date: Wed, 27 Oct 2021 09:57:50 +0400 Subject: [PATCH] Use recent requester userIds from API. --- Telegram/SourceFiles/api/api_invite_links.cpp | 9 -- Telegram/SourceFiles/api/api_invite_links.h | 8 -- .../boxes/peers/edit_peer_requests_box.cpp | 19 --- .../boxes/peers/edit_peer_requests_box.h | 1 - .../view/history_view_requests_bar.cpp | 131 +++++------------- 5 files changed, 32 insertions(+), 136 deletions(-) diff --git a/Telegram/SourceFiles/api/api_invite_links.cpp b/Telegram/SourceFiles/api/api_invite_links.cpp index b5460e554..54ecaa4cb 100644 --- a/Telegram/SourceFiles/api/api_invite_links.cpp +++ b/Telegram/SourceFiles/api/api_invite_links.cpp @@ -766,15 +766,6 @@ void InviteLinks::requestMoreLinks( }).send(); } -void InviteLinks::pushRecentRequests(RecentRequests &&requests) { - _recentRequestsLocal.fire(std::move(requests)); -} - -auto InviteLinks::recentRequestsLocal() const --> rpl::producer<RecentRequests> { - return _recentRequestsLocal.events(); -} - void InviteLinks::editPermanentLink( not_null<PeerData*> peer, const QString &link) { diff --git a/Telegram/SourceFiles/api/api_invite_links.h b/Telegram/SourceFiles/api/api_invite_links.h index 01eee58ee..0ade69856 100644 --- a/Telegram/SourceFiles/api/api_invite_links.h +++ b/Telegram/SourceFiles/api/api_invite_links.h @@ -132,13 +132,6 @@ public: bool revoked, Fn<void(Links)> done); - struct RecentRequests { - not_null<PeerData*> peer; - std::vector<not_null<UserData*>> users; - }; - void pushRecentRequests(RecentRequests &&requests); - [[nodiscard]] rpl::producer<RecentRequests> recentRequestsLocal() const; - private: struct LinkKey { not_null<PeerData*> peer; @@ -223,7 +216,6 @@ private: base::flat_map< std::pair<not_null<PeerData*>, not_null<UserData*>>, ProcessRequest> _processRequests; - rpl::event_stream<RecentRequests> _recentRequestsLocal; rpl::event_stream<Update> _updates; diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_requests_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_requests_box.cpp index f683b9414..a041ae22e 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_requests_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_requests_box.cpp @@ -377,7 +377,6 @@ void RequestsBoxController::processRequest( } static_cast<RequestsBoxSearchController*>( searchController())->removeFromCache(user); - pushRecentRequests(); }; const auto done = crl::guard(this, [=] { remove(); @@ -403,24 +402,6 @@ void RequestsBoxController::processRequest( fail); } -void RequestsBoxController::pushRecentRequests() { - const auto count = std::min( - delegate()->peerListFullRowsCount(), - HistoryView::kRecentRequestsLimit); - if (!count) { - return; - } - auto requests = std::vector<not_null<UserData*>>(); - requests.reserve(count); - for (auto i = 0; i != count; ++i) { - requests.push_back(delegate()->peerListRowAt(i)->peer()->asUser()); - } - session().api().inviteLinks().pushRecentRequests({ - .peer = _peer, - .users = std::move(requests), - }); -} - void RequestsBoxController::appendRow( not_null<UserData*> user, TimeId date) { diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_requests_box.h b/Telegram/SourceFiles/boxes/peers/edit_peer_requests_box.h index 255a4e1ce..0e82ca7dc 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_requests_box.h +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_requests_box.h @@ -53,7 +53,6 @@ private: void appendRow(not_null<UserData*> user, TimeId date); void refreshDescription(); void processRequest(not_null<UserData*> user, bool approved); - void pushRecentRequests(); void subscribeToMigration(); void migrate(not_null<ChatData*> chat, not_null<ChannelData*> channel); diff --git a/Telegram/SourceFiles/history/view/history_view_requests_bar.cpp b/Telegram/SourceFiles/history/view/history_view_requests_bar.cpp index 8f70c5287..820b5f7e4 100644 --- a/Telegram/SourceFiles/history/view/history_view_requests_bar.cpp +++ b/Telegram/SourceFiles/history/view/history_view_requests_bar.cpp @@ -10,6 +10,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/history_view_group_call_bar.h" #include "data/data_peer.h" #include "data/data_user.h" +#include "data/data_chat.h" +#include "data/data_channel.h" #include "data/data_changes.h" #include "data/data_session.h" #include "main/main_session.h" @@ -17,15 +19,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/chat/group_call_userpics.h" #include "info/profile/info_profile_values.h" #include "apiwrap.h" -#include "api/api_invite_links.h" namespace HistoryView { -namespace { - -// If less than 10 requests we request userpics each time the count changes. -constexpr auto kRequestExactThreshold = 10; - -} // namespace rpl::producer<Ui::RequestsBarContent> RequestsBarContentByPeer( not_null<PeerData*> peer, @@ -35,18 +30,12 @@ rpl::producer<Ui::RequestsBarContent> RequestsBarContentByPeer( : peer(peer) { current.isGroup = !peer->isBroadcast(); } - ~State() { - if (requestId) { - peer->session().api().request(requestId).cancel(); - } - } not_null<PeerData*> peer; std::vector<UserpicInRow> userpics; std::vector<not_null<UserData*>> users; Ui::RequestsBarContent current; base::has_weak_ptr guard; - mtpRequestId requestId = 0; bool someUserpicsNotLoaded = false; bool pushScheduled = false; }; @@ -113,74 +102,6 @@ rpl::producer<Ui::RequestsBarContent> RequestsBarContentByPeer( return true; }; - static const auto RequestExact = []( - not_null<State*> state, - int userpicSize, - Fn<void()> push, - auto requestExact) { - if (state->requestId) { - return; - } - using Flag = MTPmessages_GetChatInviteImporters::Flag; - state->requestId = state->peer->session().api().request( - MTPmessages_GetChatInviteImporters( - MTP_flags(Flag::f_requested), - state->peer->input, - MTPstring(), // link - MTPstring(), // q - MTP_int(0), // offset_date - MTP_inputUserEmpty(), // offset_user - MTP_int(kRecentRequestsLimit)) - ).done([=](const MTPmessages_ChatInviteImporters &result) { - state->requestId = 0; - - result.match([&]( - const MTPDmessages_chatInviteImporters &data) { - const auto count = data.vcount().v; - const auto &importers = data.vimporters().v; - auto &owner = state->peer->owner(); - const auto old = base::take(state->users); - state->users = std::vector<not_null<UserData*>>(); - const auto use = std::min( - importers.size(), - HistoryView::kRecentRequestsLimit); - state->users.reserve(use); - for (auto i = 0; i != use; ++i) { - importers[i].match([&]( - const MTPDchatInviteImporter &data) { - state->users.push_back( - owner.user(data.vuser_id())); - }); - } - const auto changed = (state->current.count != count) - || (count == 1 - && ((state->users.size() != old.size()) - || (old.size() == 1 - && state->users.front() != old.front()))); - if (changed) { - state->current.count = count; - if (count == 1 && !state->users.empty()) { - const auto user = state->users.front(); - state->current.nameShort = user->shortName(); - state->current.nameFull = user->name; - } else { - state->current.nameShort - = state->current.nameFull - = QString(); - } - } - if (RegenerateUserpics(state, userpicSize) || changed) { - push(); - } - if (state->userpics.size() > state->current.count) { - requestExact(state, userpicSize, push, requestExact); - } - }); - }).fail([=](const MTP::Error &error) { - state->requestId = 0; - }).send(); - }; - return [=](auto consumer) { const auto api = &peer->session().api(); @@ -219,25 +140,37 @@ rpl::producer<Ui::RequestsBarContent> RequestsBarContentByPeer( ) | rpl::filter([=](int count) { return (state->current.count != count); }) | rpl::start_with_next([=](int count) { - const auto was = state->current.count; - const auto requestUsersNeeded = (was < kRequestExactThreshold) - || (count < kRequestExactThreshold); - state->current.count = count; - if (requestUsersNeeded) { - RequestExact(state, userpicSize, pushNext, RequestExact); + const auto &requesters = peer->isChat() + ? peer->asChat()->recentRequesters() + : peer->asChannel()->recentRequesters(); + auto &owner = state->peer->owner(); + const auto old = base::take(state->users); + state->users = std::vector<not_null<UserData*>>(); + const auto use = std::min( + int(requesters.size()), + HistoryView::kRecentRequestsLimit); + state->users.reserve(use); + for (auto i = 0; i != use; ++i) { + state->users.push_back(owner.user(requesters[i])); } - pushNext(); - }, lifetime); - - using RecentRequests = Api::InviteLinks::RecentRequests; - api->inviteLinks().recentRequestsLocal( - ) | rpl::filter([=](const RecentRequests &value) { - return (value.peer == peer) - && (state->current.count >= kRequestExactThreshold) - && (value.users.size() == kRecentRequestsLimit); - }) | rpl::start_with_next([=](RecentRequests &&value) { - state->users = std::move(value.users); - if (RegenerateUserpics(state, userpicSize)) { + const auto changed = (state->current.count != count) + || (count == 1 + && ((state->users.size() != old.size()) + || (old.size() == 1 + && state->users.front() != old.front()))); + if (changed) { + state->current.count = count; + if (count == 1 && !state->users.empty()) { + const auto user = state->users.front(); + state->current.nameShort = user->shortName(); + state->current.nameFull = user->name; + } else { + state->current.nameShort + = state->current.nameFull + = QString(); + } + } + if (RegenerateUserpics(state, userpicSize) || changed) { pushNext(); } }, lifetime);