From 177a7eaf43d387add3a374692aa01af4972fdb0a Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 26 Apr 2023 23:58:03 +0300 Subject: [PATCH] Added initial serialization from TL data to statistics data. --- Telegram/SourceFiles/api/api_statistics.cpp | 78 ++++++++++++++++++++- Telegram/SourceFiles/api/api_statistics.h | 8 ++- 2 files changed, 81 insertions(+), 5 deletions(-) diff --git a/Telegram/SourceFiles/api/api_statistics.cpp b/Telegram/SourceFiles/api/api_statistics.cpp index 839fa98fd..62cdf05b4 100644 --- a/Telegram/SourceFiles/api/api_statistics.cpp +++ b/Telegram/SourceFiles/api/api_statistics.cpp @@ -8,20 +8,92 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_statistics.h" #include "apiwrap.h" +#include "data/data_channel.h" #include "data/data_peer.h" #include "main/main_session.h" namespace Api { namespace { + +[[nodiscard]] Data::StatisticalValue StatisticalValueFromTL( + const MTPStatsAbsValueAndPrev &tl) { + const auto current = tl.data().vcurrent().v; + const auto previous = tl.data().vprevious().v; + return Data::StatisticalValue{ + .value = current, + .previousValue = previous, + .growthRatePercentage = previous + ? std::abs((current - previous) / float64(previous) * 100.) + : 0, + }; +} + +[[nodiscard]] Data::ChannelStatistics ChannelStatisticsFromTL( + const MTPDstats_broadcastStats &data) { + const auto &tlUnmuted = data.venabled_notifications().data(); + const auto unmuted = (!tlUnmuted.vtotal().v) + ? 0. + : std::clamp( + tlUnmuted.vpart().v / tlUnmuted.vtotal().v * 100., + 0., + 100.); + using Recent = MTPMessageInteractionCounters; + auto recentMessages = ranges::views::all( + data.vrecent_message_interactions().v + ) | ranges::views::transform([&](const Recent &tl) { + return Data::StatisticsMessageInteractionInfo{ + .messageId = tl.data().vmsg_id().v, + .viewsCount = tl.data().vviews().v, + .forwardsCount = tl.data().vforwards().v, + }; + }) | ranges::to_vector; + return { + .startDate = data.vperiod().data().vmin_date().v, + .endDate = data.vperiod().data().vmax_date().v, + + .memberCount = StatisticalValueFromTL(data.vfollowers()), + .meanViewCount = StatisticalValueFromTL(data.vviews_per_post()), + .meanShareCount = StatisticalValueFromTL(data.vshares_per_post()), + + .enabledNotificationsPercentage = unmuted, + + .recentMessageInteractions = std::move(recentMessages), + }; +} + } // namespace Statistics::Statistics(not_null api) : _api(&api->instance()) { } -rpl::producer<> Statistics::request( - not_null peer) const { - return rpl::never<>(); +rpl::producer Statistics::request( + not_null peer) { + return [=](auto consumer) { + auto lifetime = rpl::lifetime(); + const auto channel = peer->asChannel(); + if (!channel) { + return lifetime; + } + + if (!channel->isMegagroup()) { + _api.request(MTPstats_GetBroadcastStats( + MTP_flags(MTPstats_GetBroadcastStats::Flags(0)), + channel->inputChannel + )).done([=](const MTPstats_BroadcastStats &result) { + _channelStats = ChannelStatisticsFromTL(result.data()); + consumer.put_done(); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).send(); + } + + return lifetime; + }; +} + +Data::ChannelStatistics Statistics::channelStats() const { + return _channelStats; } } // namespace Api diff --git a/Telegram/SourceFiles/api/api_statistics.h b/Telegram/SourceFiles/api/api_statistics.h index 2197c9f82..6591976e7 100644 --- a/Telegram/SourceFiles/api/api_statistics.h +++ b/Telegram/SourceFiles/api/api_statistics.h @@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once +#include "data/data_statistics.h" #include "mtproto/sender.h" class ApiWrap; @@ -18,10 +19,13 @@ class Statistics final { public: explicit Statistics(not_null api); - [[nodiscard]] rpl::producer<> request( - not_null peer) const; + [[nodiscard]] rpl::producer request( + not_null peer); + + [[nodiscard]] Data::ChannelStatistics channelStats() const; private: + Data::ChannelStatistics _channelStats; MTP::Sender _api; };