From 01573af0de427a76991db72eacef462f06919ee3 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 1 Nov 2023 15:24:38 +0300 Subject: [PATCH] Added initial support of complex boosts list in boosts info. --- Telegram/Resources/langs/lang.strings | 3 + Telegram/SourceFiles/api/api_statistics.cpp | 1 + .../info_statistics_list_controllers.cpp | 103 +++++++++++++++--- 3 files changed, 91 insertions(+), 16 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 6b11445f1..4c42f199a 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -4328,6 +4328,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_boosts_link_subtext" = "Share this link with your subscribers to get more boosts."; "lng_boosts_get_boosts" = "Get Boosts via Gifts"; "lng_boosts_get_boosts_subtext" = "Get more boosts for your channel by gifting Telegram Premium to your subscribers."; +"lng_boosts_list_unclaimed" = "Unclaimed"; +"lng_boosts_list_pending" = "To be distributed"; +"lng_boosts_list_pending_about" = "The recipient will be selected when the giveaway ends."; // Wnd specific diff --git a/Telegram/SourceFiles/api/api_statistics.cpp b/Telegram/SourceFiles/api/api_statistics.cpp index 1231a9303..3d3bc184c 100644 --- a/Telegram/SourceFiles/api/api_statistics.cpp +++ b/Telegram/SourceFiles/api/api_statistics.cpp @@ -554,6 +554,7 @@ void Boosts::requestBoosts( constexpr auto kTlFirstSlice = tl::make_int(kFirstSlice); constexpr auto kTlLimit = tl::make_int(kLimit); _requestId = _api.request(MTPpremium_GetBoostsList( + // MTP_flags(MTPpremium_GetBoostsList::Flag::f_gifts), MTP_flags(0), _peer->input, MTP_string(token.next), diff --git a/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.cpp b/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.cpp index b7f2168c6..cd71cd420 100644 --- a/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.cpp +++ b/Telegram/SourceFiles/info/statistics/info_statistics_list_controllers.cpp @@ -18,6 +18,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_session.h" #include "settings/settings_common.h" #include "ui/effects/toggle_arrow.h" +#include "ui/empty_userpic.h" #include "ui/painter.h" #include "ui/rect.h" #include "ui/widgets/buttons.h" @@ -30,6 +31,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace Info::Statistics { namespace { +constexpr auto kColorIndexUnclaimed = int(3); +constexpr auto kColorIndexPending = int(4); + void AddArrow(not_null parent) { const auto arrow = Ui::CreateChild(parent.get()); arrow->paintRequest( @@ -323,9 +327,14 @@ void PublicForwardsController::appendRow( class BoostRow final : public PeerListRow { public: - using PeerListRow::PeerListRow; + BoostRow(not_null peer, const Data::Boost &boost); + BoostRow(const Data::Boost &boost); - void setMultiplier(int multiplier); + [[nodiscard]] const Data::Boost &boost() const; + [[nodiscard]] QString generateName() override; + + [[nodiscard]] PaintRoundImageCallback generatePaintUserpicCallback( + bool forceRound) override; int paintNameIconGetWidth( Painter &p, @@ -339,10 +348,72 @@ public: bool selected) override; private: + void init(); + void setMultiplier(int multiplier); + + const Data::Boost _boost; + Ui::EmptyUserpic _userpic; QImage _badge; }; +BoostRow::BoostRow(not_null peer, const Data::Boost &boost) +: PeerListRow(peer, UniqueRowIdFromString(boost.id)) +, _boost(boost) +, _userpic(Ui::EmptyUserpic::UserpicColor(0), QString()) { + init(); +} + +BoostRow::BoostRow(const Data::Boost &boost) +: PeerListRow(UniqueRowIdFromString(boost.id)) +, _boost(boost) +, _userpic( + Ui::EmptyUserpic::UserpicColor(boost.isUnclaimed + ? kColorIndexUnclaimed + : kColorIndexPending), + QString()) { + init(); +} + +void BoostRow::init() { + setMultiplier(_boost.multiplier); + constexpr auto kMonthsDivider = int(30 * 86400); + const auto months = (_boost.expiresAt - _boost.date.toSecsSinceEpoch()) + / kMonthsDivider; + auto status = !PeerListRow::special() + ? tr::lng_boosts_list_status( + tr::now, + lt_date, + langDateTime(_boost.date)) + : tr::lng_months_tiny(tr::now, lt_count, months) + + ' ' + + QChar(0x2022) + + ' ' + + langDateTime(_boost.date); + PeerListRow::setCustomStatus(std::move(status)); +} + +const Data::Boost &BoostRow::boost() const { + return _boost; +} + +QString BoostRow::generateName() { + return !PeerListRow::special() + ? PeerListRow::generateName() + : _boost.isUnclaimed + ? tr::lng_boosts_list_unclaimed(tr::now) + : tr::lng_boosts_list_pending(tr::now); +} + +PaintRoundImageCallback BoostRow::generatePaintUserpicCallback(bool force) { + if (!PeerListRow::special()) { + return PeerListRow::generatePaintUserpicCallback(force); + } + return [=](Painter &p, int x, int y, int outerWidth, int size) mutable { + _userpic.paintCircle(p, x, y, outerWidth, size); + }; +} + void BoostRow::setMultiplier(int multiplier) { if (!multiplier) { _badge = QImage(); @@ -480,27 +551,27 @@ void BoostsController::applySlice(const Data::BoostsListSlice &slice) { _allLoaded = slice.allLoaded; _apiToken = slice.token; - const auto formatter = u"MMM d, yyyy"_q; for (const auto &item : slice.list) { - const auto user = session().data().user(item.userId); - if (delegate()->peerListFindRow(user->id.value)) { - continue; - } - auto row = std::make_unique(user); - row->setMultiplier(item.multiplier); - row->setCustomStatus(tr::lng_boosts_list_status( - tr::now, - lt_date, - QLocale().toString(item.date, formatter))); + auto row = [&] { + if (item.userId && !item.isUnclaimed) { + const auto user = session().data().user(item.userId); + return std::make_unique(user, item); + } else { + return std::make_unique(item); + } + }(); delegate()->peerListAppendRow(std::move(row)); } delegate()->peerListRefreshRows(); } void BoostsController::rowClicked(not_null row) { - crl::on_main([=, peer = row->peer()] { - _showPeerInfo(peer); - }); + if (!row->special()) { + crl::on_main([=, peer = row->peer()] { + _showPeerInfo(peer); + }); + return; + } } } // namespace