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);