From e9496fb612b5d96b1d8dd94ed0ba9b223e47ac1b Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 11 Oct 2023 07:36:05 +0300 Subject: [PATCH] Improved concurrent API requests of async statistical charts. --- Telegram/SourceFiles/api/api_statistics.cpp | 37 +++++++++++++-------- Telegram/SourceFiles/api/api_statistics.h | 2 ++ 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/Telegram/SourceFiles/api/api_statistics.cpp b/Telegram/SourceFiles/api/api_statistics.cpp index 4d80925d8..73c96e359 100644 --- a/Telegram/SourceFiles/api/api_statistics.cpp +++ b/Telegram/SourceFiles/api/api_statistics.cpp @@ -237,19 +237,30 @@ Statistics::GraphResult Statistics::requestZoom( if (!channel) { return lifetime; } - - _api.request(MTPstats_LoadAsyncGraph( - MTP_flags(x - ? MTPstats_LoadAsyncGraph::Flag::f_x - : MTPstats_LoadAsyncGraph::Flag(0)), - MTP_string(token), - MTP_long(x) - )).done([=](const MTPStatsGraph &result) { - consumer.put_next(StatisticalGraphFromTL(result)); - consumer.put_done(); - }).fail([=](const MTP::Error &error) { - consumer.put_error_copy(error.type()); - }).send(); + const auto wasEmpty = _zoomDeque.empty(); + _zoomDeque.push_back([=] { + _api.request(MTPstats_LoadAsyncGraph( + MTP_flags(x + ? MTPstats_LoadAsyncGraph::Flag::f_x + : MTPstats_LoadAsyncGraph::Flag(0)), + MTP_string(token), + MTP_long(x) + )).done([=](const MTPStatsGraph &result) { + consumer.put_next(StatisticalGraphFromTL(result)); + consumer.put_done(); + if (!_zoomDeque.empty()) { + _zoomDeque.pop_front(); + if (!_zoomDeque.empty()) { + _zoomDeque.front()(); + } + } + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).send(); + }); + if (wasEmpty) { + _zoomDeque.front()(); + } return lifetime; }; diff --git a/Telegram/SourceFiles/api/api_statistics.h b/Telegram/SourceFiles/api/api_statistics.h index 6fe2f15e7..15e80700b 100644 --- a/Telegram/SourceFiles/api/api_statistics.h +++ b/Telegram/SourceFiles/api/api_statistics.h @@ -39,6 +39,8 @@ private: Data::SupergroupStatistics _supergroupStats; MTP::Sender _api; + std::deque> _zoomDeque; + }; class PublicForwards final {