From e67d2e5db2a4b95a83ab07b83389519a5cec2a63 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 30 Oct 2023 14:41:16 +0300 Subject: [PATCH] Added API support for premium giftcode options. --- Telegram/SourceFiles/api/api_premium.cpp | 96 ++++++++++++++++++- Telegram/SourceFiles/api/api_premium.h | 21 ++++ Telegram/SourceFiles/api/api_premium_option.h | 5 +- 3 files changed, 116 insertions(+), 6 deletions(-) diff --git a/Telegram/SourceFiles/api/api_premium.cpp b/Telegram/SourceFiles/api/api_premium.cpp index 320f3f94a..e03b15b52 100644 --- a/Telegram/SourceFiles/api/api_premium.cpp +++ b/Telegram/SourceFiles/api/api_premium.cpp @@ -9,12 +9,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_premium_option.h" #include "api/api_text_entities.h" -#include "main/main_session.h" -#include "data/data_peer_values.h" -#include "data/data_document.h" -#include "data/data_session.h" -#include "data/data_peer.h" #include "apiwrap.h" +#include "data/data_document.h" +#include "data/data_peer.h" +#include "data/data_peer_values.h" +#include "data/data_session.h" +#include "main/main_session.h" +#include "ui/text/format_values.h" namespace Api { namespace { @@ -31,6 +32,24 @@ namespace { }; } +[[nodiscard]] Data::SubscriptionOptions GiftCodesFromTL( + const QVector &tlOptions) { + auto options = SubscriptionOptionsFromTL(tlOptions); + for (auto i = 0; i < options.size(); i++) { + const auto &tlOption = tlOptions[i].data(); + const auto perUserText = Ui::FillAmountAndCurrency( + tlOption.vamount().v / float64(tlOption.vusers().v), + qs(tlOption.vcurrency()), + false); + options[i].costPerMonth = perUserText + + ' ' + + QChar(0x00D7) + + ' ' + + QString::number(tlOption.vusers().v); + } + return options; +} + } // namespace Premium::Premium(not_null api) @@ -311,4 +330,71 @@ const Data::SubscriptionOptions &Premium::subscriptionOptions() const { return _subscriptionOptions; } +PremiumGiftCodeOptions::PremiumGiftCodeOptions(not_null peer) +: _peer(peer) +, _api(&peer->session().api().instance()) { +} + +rpl::producer PremiumGiftCodeOptions::request() { + return [=](auto consumer) { + auto lifetime = rpl::lifetime(); + const auto channel = _peer->asChannel(); + if (!channel) { + return lifetime; + } + + using TLOption = MTPPremiumGiftCodeOption; + _api.request(MTPpayments_GetPremiumGiftCodeOptions( + MTP_flags( + MTPpayments_GetPremiumGiftCodeOptions::Flag::f_boost_peer), + _peer->input + )).done([=](const MTPVector &result) { + auto tlMapOptions = base::flat_map>(); + for (const auto &tlOption : result.v) { + const auto &data = tlOption.data(); + tlMapOptions[data.vusers().v].push_back(tlOption); + } + for (const auto &[amount, tlOptions] : tlMapOptions) { + if (amount == 1) { + _optionsForOnePerson.currency = qs( + tlOptions.front().data().vcurrency()); + for (const auto &option : tlOptions) { + _optionsForOnePerson.months.push_back( + option.data().vmonths().v); + _optionsForOnePerson.totalCosts.push_back( + option.data().vamount().v); + } + } + _subscriptionOptions[amount] = GiftCodesFromTL(tlOptions); + } + consumer.put_done(); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).send(); + + return lifetime; + }; +} + +Data::SubscriptionOptions PremiumGiftCodeOptions::options(int amount) { + const auto it = _subscriptionOptions.find(amount); + if (it != end(_subscriptionOptions)) { + return it->second; + } else { + auto tlOptions = QVector(); + for (auto i = 0; i < _optionsForOnePerson.months.size(); i++) { + tlOptions.push_back(MTP_premiumGiftCodeOption( + MTP_flags(MTPDpremiumGiftCodeOption::Flags(0)), + MTP_int(amount), + MTP_int(_optionsForOnePerson.months[i]), + MTPstring(), + MTPint(), + MTP_string(_optionsForOnePerson.currency), + MTP_long(_optionsForOnePerson.totalCosts[i] * amount))); + } + _subscriptionOptions[amount] = GiftCodesFromTL(tlOptions); + return _subscriptionOptions[amount]; + } +} + } // namespace Api diff --git a/Telegram/SourceFiles/api/api_premium.h b/Telegram/SourceFiles/api/api_premium.h index 01ed83cc7..95c0dfad1 100644 --- a/Telegram/SourceFiles/api/api_premium.h +++ b/Telegram/SourceFiles/api/api_premium.h @@ -141,4 +141,25 @@ private: }; +class PremiumGiftCodeOptions final { +public: + PremiumGiftCodeOptions(not_null peer); + + [[nodiscard]] rpl::producer request(); + [[nodiscard]] Data::SubscriptionOptions options(int amount); + +private: + const not_null _peer; + using Amount = int; + base::flat_map _subscriptionOptions; + struct { + std::vector months; + std::vector totalCosts; + QString currency; + } _optionsForOnePerson; + + MTP::Sender _api; + +}; + } // namespace Api diff --git a/Telegram/SourceFiles/api/api_premium_option.h b/Telegram/SourceFiles/api/api_premium_option.h index c23eb7876..5758a8cb8 100644 --- a/Telegram/SourceFiles/api/api_premium_option.h +++ b/Telegram/SourceFiles/api/api_premium_option.h @@ -36,7 +36,10 @@ template result.reserve(tlOptions.size()); for (const auto &tlOption : tlOptions) { const auto &option = tlOption.data(); - const auto botUrl = qs(option.vbot_url()); + auto botUrl = QString(); + if constexpr (!std::is_same_v) { + botUrl = qs(option.vbot_url()); + } const auto months = option.vmonths().v; const auto amount = option.vamount().v; const auto currency = qs(option.vcurrency());