diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index e8cd57be8..91ccf5416 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -140,6 +140,8 @@ PRIVATE api/api_polls.h api/api_premium.cpp api/api_premium.h + api/api_premium_option.cpp + api/api_premium_option.h api/api_report.cpp api/api_report.h api/api_ringtones.cpp diff --git a/Telegram/SourceFiles/api/api_premium.cpp b/Telegram/SourceFiles/api/api_premium.cpp index 75febfd10..975d36a65 100644 --- a/Telegram/SourceFiles/api/api_premium.cpp +++ b/Telegram/SourceFiles/api/api_premium.cpp @@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "api/api_premium.h" +#include "api/api_premium_option.h" #include "api/api_text_entities.h" #include "main/main_session.h" #include "data/data_peer_values.h" @@ -86,43 +87,43 @@ void Premium::reloadPromo() { _promoRequestId = _api.request(MTPhelp_GetPremiumPromo( )).done([=](const MTPhelp_PremiumPromo &result) { _promoRequestId = 0; - result.match([&](const MTPDhelp_premiumPromo &data) { - _session->data().processUsers(data.vusers()); - for (const auto &option : data.vperiod_options().v) { - option.match([&](const MTPDpremiumSubscriptionOption &data) { - if (data.vmonths().v == 1) { - _monthlyAmount = data.vamount().v; - _monthlyCurrency = qs(data.vcurrency()); - } - }); + const auto &data = result.data(); + _session->data().processUsers(data.vusers()); + + _subscriptionOptions = SubscriptionOptionsFromTL( + data.vperiod_options().v); + for (const auto &option : data.vperiod_options().v) { + if (option.data().vmonths().v == 1) { + _monthlyAmount = option.data().vamount().v; + _monthlyCurrency = qs(option.data().vcurrency()); } - auto text = TextWithEntities{ - qs(data.vstatus_text()), - EntitiesFromMTP(_session, data.vstatus_entities().v), - }; - _statusText = text; - _statusTextUpdates.fire(std::move(text)); - auto videos = base::flat_map>(); - const auto count = int(std::min( - data.vvideo_sections().v.size(), - data.vvideos().v.size())); - videos.reserve(count); - for (auto i = 0; i != count; ++i) { - const auto document = _session->data().processDocument( - data.vvideos().v[i]); - if ((!document->isVideoFile() && !document->isGifv()) - || !document->supportsStreaming()) { - document->forceIsStreamedAnimation(); - } - videos.emplace( - qs(data.vvideo_sections().v[i]), - document); + } + auto text = TextWithEntities{ + qs(data.vstatus_text()), + EntitiesFromMTP(_session, data.vstatus_entities().v), + }; + _statusText = text; + _statusTextUpdates.fire(std::move(text)); + auto videos = base::flat_map>(); + const auto count = int(std::min( + data.vvideo_sections().v.size(), + data.vvideos().v.size())); + videos.reserve(count); + for (auto i = 0; i != count; ++i) { + const auto document = _session->data().processDocument( + data.vvideos().v[i]); + if ((!document->isVideoFile() && !document->isGifv()) + || !document->supportsStreaming()) { + document->forceIsStreamedAnimation(); } - if (_videos != videos) { - _videos = std::move(videos); - _videosUpdated.fire({}); - } - }); + videos.emplace( + qs(data.vvideo_sections().v[i]), + document); + } + if (_videos != videos) { + _videos = std::move(videos); + _videosUpdated.fire({}); + } }).fail([=] { _promoRequestId = 0; }).send(); @@ -182,4 +183,8 @@ void Premium::reloadCloudSet() { }).send(); } +const Data::SubscriptionOptions &Premium::subscriptionOptions() const { + return _subscriptionOptions; +} + } // namespace Api diff --git a/Telegram/SourceFiles/api/api_premium.h b/Telegram/SourceFiles/api/api_premium.h index 96cfeb22d..358283360 100644 --- a/Telegram/SourceFiles/api/api_premium.h +++ b/Telegram/SourceFiles/api/api_premium.h @@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once +#include "data/data_subscription_option.h" #include "mtproto/sender.h" class ApiWrap; @@ -39,6 +40,9 @@ public: [[nodiscard]] int64 monthlyAmount() const; [[nodiscard]] QString monthlyCurrency() const; + [[nodiscard]] auto subscriptionOptions() const + -> const Data::SubscriptionOptions &; + private: void reloadPromo(); void reloadStickers(); @@ -67,6 +71,8 @@ private: int64 _monthlyAmount = 0; QString _monthlyCurrency; + Data::SubscriptionOptions _subscriptionOptions; + }; } // namespace Api diff --git a/Telegram/SourceFiles/api/api_premium_option.cpp b/Telegram/SourceFiles/api/api_premium_option.cpp new file mode 100644 index 000000000..257a4d12a --- /dev/null +++ b/Telegram/SourceFiles/api/api_premium_option.cpp @@ -0,0 +1,40 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "api/api_premium_option.h" + +#include "ui/text/format_values.h" + +namespace Api { + +constexpr auto kDiscountDivider = 5.; + +Data::SubscriptionOption CreateSubscriptionOption( + int months, + int monthlyAmount, + int64 amount, + const QString ¤cy, + const QString &botUrl) { + const auto discount = [&] { + const auto percent = monthlyAmount * months / float64(amount) - 1.; + return std::round(percent * 100. / kDiscountDivider) + * kDiscountDivider; + }(); + return { + .duration = Ui::FormatTTL(months * 86400 * 31), + .discount = discount + ? QString::fromUtf8("\xe2\x88\x92%1%").arg(discount) + : QString(), + .costPerMonth = Ui::FillAmountAndCurrency( + amount / float64(months), + currency), + .costTotal = Ui::FillAmountAndCurrency(amount, currency), + .botUrl = botUrl, + }; +} + +} // namespace Api diff --git a/Telegram/SourceFiles/api/api_premium_option.h b/Telegram/SourceFiles/api/api_premium_option.h new file mode 100644 index 000000000..f9dce4813 --- /dev/null +++ b/Telegram/SourceFiles/api/api_premium_option.h @@ -0,0 +1,50 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +#include "data/data_subscription_option.h" + +namespace Api { + +[[nodiscard]] Data::SubscriptionOption CreateSubscriptionOption( + int months, + int monthlyAmount, + int64 amount, + const QString ¤cy, + const QString &botUrl); + +template +[[nodiscard]] Data::SubscriptionOptions SubscriptionOptionsFromTL( + const QVector