From 2dc45ac90753eb9d00125ac546a7a6e8d07f94be Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 11 Oct 2023 05:10:09 +0300 Subject: [PATCH] Added ability to restore first public forwards in statistical info. --- Telegram/SourceFiles/api/api_statistics.cpp | 10 +++++----- Telegram/SourceFiles/api/api_statistics.h | 20 +++++-------------- Telegram/SourceFiles/data/data_statistics.h | 11 ++++++++++ .../info/statistics/info_statistics_common.h | 1 + .../info_statistics_inner_widget.cpp | 11 +++------- .../info_statistics_list_controllers.cpp | 18 ++++++++--------- .../info_statistics_list_controllers.h | 7 ++----- 7 files changed, 36 insertions(+), 42 deletions(-) diff --git a/Telegram/SourceFiles/api/api_statistics.cpp b/Telegram/SourceFiles/api/api_statistics.cpp index 933b7118e..4d80925d8 100644 --- a/Telegram/SourceFiles/api/api_statistics.cpp +++ b/Telegram/SourceFiles/api/api_statistics.cpp @@ -298,8 +298,8 @@ PublicForwards::PublicForwards( } void PublicForwards::request( - const OffsetToken &token, - Fn done) { + const Data::PublicForwardsSlice::OffsetToken &token, + Fn done) { if (_requestId) { return; } @@ -319,7 +319,7 @@ void PublicForwards::request( using Messages = QVector; _requestId = 0; - auto nextToken = OffsetToken(); + auto nextToken = Data::PublicForwardsSlice::OffsetToken(); const auto process = [&](const MTPVector &messages) { auto result = Messages(); for (const auto &message : messages.v) { @@ -397,7 +397,7 @@ MessageStatistics::MessageStatistics( , _api(&channel->session().api().instance()) { } -PublicForwards::Slice MessageStatistics::firstSlice() const { +Data::PublicForwardsSlice MessageStatistics::firstSlice() const { return _firstSlice; } @@ -409,7 +409,7 @@ void MessageStatistics::request(Fn done) { const auto requestFirstPublicForwards = [=]( const Data::StatisticalGraph &messageGraph, const Data::StatisticsMessageInteractionInfo &info) { - _publicForwards.request({}, [=](PublicForwards::Slice slice) { + _publicForwards.request({}, [=](Data::PublicForwardsSlice slice) { const auto total = slice.total; _firstSlice = std::move(slice); done({ diff --git a/Telegram/SourceFiles/api/api_statistics.h b/Telegram/SourceFiles/api/api_statistics.h index d5d9583d4..6fe2f15e7 100644 --- a/Telegram/SourceFiles/api/api_statistics.h +++ b/Telegram/SourceFiles/api/api_statistics.h @@ -43,21 +43,11 @@ private: class PublicForwards final { public: - struct OffsetToken final { - int rate = 0; - FullMsgId fullId; - }; - - struct Slice { - QVector list; - int total = 0; - bool allLoaded = false; - OffsetToken token; - }; - explicit PublicForwards(not_null channel, FullMsgId fullId); - void request(const OffsetToken &token, Fn done); + void request( + const Data::PublicForwardsSlice::OffsetToken &token, + Fn done); private: const not_null _channel; @@ -77,14 +67,14 @@ public: void request(Fn done); - [[nodiscard]] PublicForwards::Slice firstSlice() const; + [[nodiscard]] Data::PublicForwardsSlice firstSlice() const; private: PublicForwards _publicForwards; const not_null _channel; const FullMsgId _fullId; - PublicForwards::Slice _firstSlice; + Data::PublicForwardsSlice _firstSlice; mtpRequestId _requestId = 0; MTP::Sender _api; diff --git a/Telegram/SourceFiles/data/data_statistics.h b/Telegram/SourceFiles/data/data_statistics.h index 0ca8eb648..045dae70e 100644 --- a/Telegram/SourceFiles/data/data_statistics.h +++ b/Telegram/SourceFiles/data/data_statistics.h @@ -119,4 +119,15 @@ struct AnyStatistics final { Data::MessageStatistics message; }; +struct PublicForwardsSlice final { + struct OffsetToken final { + int rate = 0; + FullMsgId fullId; + }; + QVector list; + int total = 0; + bool allLoaded = false; + OffsetToken token; +}; + } // namespace Data diff --git a/Telegram/SourceFiles/info/statistics/info_statistics_common.h b/Telegram/SourceFiles/info/statistics/info_statistics_common.h index 9ffa41680..30a3e092f 100644 --- a/Telegram/SourceFiles/info/statistics/info_statistics_common.h +++ b/Telegram/SourceFiles/info/statistics/info_statistics_common.h @@ -14,6 +14,7 @@ namespace Info::Statistics { struct SavedState final { Data::AnyStatistics stats; base::flat_map recentPostPreviews; + Data::PublicForwardsSlice publicForwardsFirstSlice; }; } // namespace Info::Statistics diff --git a/Telegram/SourceFiles/info/statistics/info_statistics_inner_widget.cpp b/Telegram/SourceFiles/info/statistics/info_statistics_inner_widget.cpp index b103f4714..88e484dab 100644 --- a/Telegram/SourceFiles/info/statistics/info_statistics_inner_widget.cpp +++ b/Telegram/SourceFiles/info/statistics/info_statistics_inner_widget.cpp @@ -525,6 +525,7 @@ void InnerWidget::load() { api->request([=](const Data::MessageStatistics &data) { _state.stats = Data::AnyStatistics{ .message = data }; + _state.publicForwardsFirstSlice = api->firstSlice(); fill(); finishLoading(); @@ -587,16 +588,10 @@ void InnerWidget::fill() { tr::lng_stats_inviters_title()); } } else if (message) { - auto showPeerHistory = [=](FullMsgId fullId) { - _showRequests.fire({ .history = fullId }); - }; - const auto api = lifetime().make_state( - descriptor.peer->asChannel(), - _contextId); AddPublicForwards( - *api, + _state.publicForwardsFirstSlice, inner, - std::move(showPeerHistory), + [=](FullMsgId id) { _showRequests.fire({ .history = id }); }, descriptor.peer, _contextId); } diff --git a/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.cpp b/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.cpp index 9b5796d81..d6d0fe968 100644 --- a/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.cpp +++ b/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.cpp @@ -59,7 +59,7 @@ void AddSubsectionTitle( } struct Descriptor final { - Api::PublicForwards::Slice firstSlice; + Data::PublicForwardsSlice firstSlice; Fn showPeerHistory; not_null peer; FullMsgId contextId; @@ -199,14 +199,14 @@ public: private: bool appendRow(not_null peer, MsgId msgId); - void applySlice(const Api::PublicForwards::Slice &slice); + void applySlice(const Data::PublicForwardsSlice &slice); const not_null _session; Fn _showPeerHistory; Api::PublicForwards _api; - Api::PublicForwards::Slice _firstSlice; - Api::PublicForwards::OffsetToken _apiToken; + Data::PublicForwardsSlice _firstSlice; + Data::PublicForwardsSlice::OffsetToken _apiToken; bool _allLoaded = false; @@ -232,13 +232,13 @@ void PublicForwardsController::loadMoreRows() { if (_allLoaded) { return; } - _api.request(_apiToken, [=](const Api::PublicForwards::Slice &slice) { + _api.request(_apiToken, [=](const Data::PublicForwardsSlice &slice) { applySlice(slice); }); } void PublicForwardsController::applySlice( - const Api::PublicForwards::Slice &slice) { + const Data::PublicForwardsSlice &slice) { _allLoaded = slice.allLoaded; _apiToken = slice.token; @@ -291,7 +291,7 @@ bool PublicForwardsController::appendRow( } // namespace void AddPublicForwards( - const Api::MessageStatistics &firstSliceHolder, + const Data::PublicForwardsSlice &firstSlice, not_null container, Fn showPeerHistory, not_null peer, @@ -307,13 +307,13 @@ void AddPublicForwards( PublicForwardsController controller; }; const auto state = container->lifetime().make_state(Descriptor{ - firstSliceHolder.firstSlice(), + firstSlice, std::move(showPeerHistory), peer, contextId, }); - if (const auto total = firstSliceHolder.firstSlice().total; total > 0) { + if (const auto total = firstSlice.total; total > 0) { AddSubsectionTitle( container, tr::lng_stats_overview_message_public_share( diff --git a/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.h b/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.h index d2aa31e1f..8520acc4d 100644 --- a/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.h +++ b/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.h @@ -13,18 +13,15 @@ namespace Ui { class VerticalLayout; } // namespace Ui -namespace Api { -class MessageStatistics; -} // namespace Api - namespace Data { +struct PublicForwardsSlice; struct SupergroupStatistics; } // namespace Data namespace Info::Statistics { void AddPublicForwards( - const Api::MessageStatistics &firstSliceHolder, + const Data::PublicForwardsSlice &firstSlice, not_null container, Fn showPeerHistory, not_null peer,