diff --git a/Telegram/SourceFiles/api/api_statistics.cpp b/Telegram/SourceFiles/api/api_statistics.cpp index 69c7145f58..234fb4ff89 100644 --- a/Telegram/SourceFiles/api/api_statistics.cpp +++ b/Telegram/SourceFiles/api/api_statistics.cpp @@ -110,6 +110,79 @@ namespace { }; } +[[nodiscard]] Data::SupergroupStatistics SupergroupStatisticsFromTL( + const MTPDstats_megagroupStats &data) { + using Senders = MTPStatsGroupTopPoster; + using Administrators = MTPStatsGroupTopAdmin; + using Inviters = MTPStatsGroupTopInviter; + + auto topSenders = ranges::views::all( + data.vtop_posters().v + ) | ranges::views::transform([&](const Senders &tl) { + return Data::StatisticsMessageSenderInfo{ + .userId = UserId(tl.data().vuser_id().v), + .sentMessageCount = tl.data().vmessages().v, + .averageCharacterCount = tl.data().vavg_chars().v, + }; + }) | ranges::to_vector; + auto topAdministrators = ranges::views::all( + data.vtop_admins().v + ) | ranges::views::transform([&](const Administrators &tl) { + return Data::StatisticsAdministratorActionsInfo{ + .userId = UserId(tl.data().vuser_id().v), + .deletedMessageCount = tl.data().vdeleted().v, + .bannedUserCount = tl.data().vkicked().v, + .restrictedUserCount = tl.data().vbanned().v, + }; + }) | ranges::to_vector; + auto topInviters = ranges::views::all( + data.vtop_inviters().v + ) | ranges::views::transform([&](const Inviters &tl) { + return Data::StatisticsInviterInfo{ + .userId = UserId(tl.data().vuser_id().v), + .addedMemberCount = tl.data().vinvitations().v, + }; + }) | ranges::to_vector; + + return { + .startDate = data.vperiod().data().vmin_date().v, + .endDate = data.vperiod().data().vmax_date().v, + + .memberCount = StatisticalValueFromTL(data.vmembers()), + .messageCount = StatisticalValueFromTL(data.vmessages()), + .viewerCount = StatisticalValueFromTL(data.vviewers()), + .senderCount = StatisticalValueFromTL(data.vposters()), + + .memberCountGraph = StatisticalGraphFromTL( + data.vgrowth_graph()), + + .joinGraph = StatisticalGraphFromTL( + data.vmembers_graph()), + + .joinBySourceGraph = StatisticalGraphFromTL( + data.vnew_members_by_source_graph()), + + .languageGraph = StatisticalGraphFromTL( + data.vlanguages_graph()), + + .messageContentGraph = StatisticalGraphFromTL( + data.vmessages_graph()), + + .actionGraph = StatisticalGraphFromTL( + data.vactions_graph()), + + .dayGraph = StatisticalGraphFromTL( + data.vtop_hours_graph()), + + .weekGraph = StatisticalGraphFromTL( + data.vweekdays_graph()), + + .topSenders = std::move(topSenders), + .topAdministrators = std::move(topAdministrators), + .topInviters = std::move(topInviters), + }; +} + } // namespace Statistics::Statistics(not_null api) @@ -135,6 +208,17 @@ rpl::producer Statistics::request( }).fail([=](const MTP::Error &error) { consumer.put_error_copy(error.type()); }).send(); + } else { + _api.request(MTPstats_GetMegagroupStats( + MTP_flags(MTPstats_GetMegagroupStats::Flags(0)), + channel->inputChannel + )).done([=](const MTPstats_MegagroupStats &result) { + _supergroupStats = SupergroupStatisticsFromTL(result.data()); + peer->owner().processUsers(result.data().vusers()); + consumer.put_done(); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).send(); } return lifetime; @@ -173,4 +257,8 @@ Data::ChannelStatistics Statistics::channelStats() const { return _channelStats; } +Data::SupergroupStatistics Statistics::supergroupStats() const { + return _supergroupStats; +} + } // namespace Api diff --git a/Telegram/SourceFiles/api/api_statistics.h b/Telegram/SourceFiles/api/api_statistics.h index 772e79078e..c4b7958354 100644 --- a/Telegram/SourceFiles/api/api_statistics.h +++ b/Telegram/SourceFiles/api/api_statistics.h @@ -27,9 +27,11 @@ public: float64 x); [[nodiscard]] Data::ChannelStatistics channelStats() const; + [[nodiscard]] Data::SupergroupStatistics supergroupStats() const; private: Data::ChannelStatistics _channelStats; + Data::SupergroupStatistics _supergroupStats; MTP::Sender _api; };