diff --git a/Telegram/SourceFiles/api/api_premium.cpp b/Telegram/SourceFiles/api/api_premium.cpp index 629abc0d03..58950f6f4b 100644 --- a/Telegram/SourceFiles/api/api_premium.cpp +++ b/Telegram/SourceFiles/api/api_premium.cpp @@ -390,18 +390,44 @@ rpl::producer PremiumGiftCodeOptions::request() { }; } +rpl::producer PremiumGiftCodeOptions::applyPrepaid( + const Payments::InvoicePremiumGiftCode &invoice, + uint64 prepaidId) { + return [=](auto consumer) { + auto lifetime = rpl::lifetime(); + const auto channel = _peer->asChannel(); + if (!channel) { + return lifetime; + } + + _api.request(MTPpayments_LaunchPrepaidGiveaway( + _peer->input, + MTP_long(prepaidId), + Payments::InvoicePremiumGiftCodeGiveawayToTL(invoice) + )).done([=](const MTPUpdates &result) { + _peer->session().api().applyUpdates(result); + consumer.put_done(); + }).fail([=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }).send(); + + return lifetime; + }; +} + const std::vector &PremiumGiftCodeOptions::availablePresets() const { return _availablePresets; } +[[nodiscard]] int PremiumGiftCodeOptions::monthsFromPreset(int monthsIndex) { + return _optionsForOnePerson.months[monthsIndex]; +} + Payments::InvoicePremiumGiftCode PremiumGiftCodeOptions::invoice( int users, - int monthsIndex) { + int months) { const auto randomId = base::RandomValue(); - const auto token = Token{ - users, - _optionsForOnePerson.months[monthsIndex], - }; + const auto token = Token{ users, months }; const auto &store = _stores[token]; return Payments::InvoicePremiumGiftCode{ .randomId = randomId, diff --git a/Telegram/SourceFiles/api/api_premium.h b/Telegram/SourceFiles/api/api_premium.h index deb66df806..1199b48194 100644 --- a/Telegram/SourceFiles/api/api_premium.h +++ b/Telegram/SourceFiles/api/api_premium.h @@ -152,9 +152,13 @@ public: [[nodiscard]] rpl::producer request(); [[nodiscard]] Data::SubscriptionOptions options(int amount); [[nodiscard]] const std::vector &availablePresets() const; + [[nodiscard]] int monthsFromPreset(int monthsIndex); [[nodiscard]] Payments::InvoicePremiumGiftCode invoice( int users, - int monthsIndex); + int months); + [[nodiscard]] rpl::producer applyPrepaid( + const Payments::InvoicePremiumGiftCode &invoice, + uint64 prepaidId); [[nodiscard]] int giveawayBoostsPerPremium() const; [[nodiscard]] int giveawayCountriesMax() const; diff --git a/Telegram/SourceFiles/api/api_statistics.cpp b/Telegram/SourceFiles/api/api_statistics.cpp index 25b0473fb9..c5fb3ca764 100644 --- a/Telegram/SourceFiles/api/api_statistics.cpp +++ b/Telegram/SourceFiles/api/api_statistics.cpp @@ -533,6 +533,20 @@ rpl::producer Boosts::request() { }; _boostStatus.link = qs(data.vboost_url()); + if (data.vprepaid_giveaways()) { + _boostStatus.prepaidGiveaway = ranges::views::all( + data.vprepaid_giveaways()->v + ) | ranges::views::transform([](const MTPPrepaidGiveaway &r) { + return Data::BoostPrepaidGiveaway{ + .months = r.data().vmonths().v, + .id = r.data().vid().v, + .quantity = r.data().vquantity().v, + .date = QDateTime::fromSecsSinceEpoch( + r.data().vdate().v), + }; + }) | ranges::to_vector; + } + using namespace Data; requestBoosts({ .gifts = false }, [=](BoostsListSlice &&slice) { _boostStatus.firstSliceBoosts = std::move(slice); diff --git a/Telegram/SourceFiles/data/data_boosts.h b/Telegram/SourceFiles/data/data_boosts.h index a62c70c92e..0dad4b0082 100644 --- a/Telegram/SourceFiles/data/data_boosts.h +++ b/Telegram/SourceFiles/data/data_boosts.h @@ -50,10 +50,18 @@ struct BoostsListSlice final { OffsetToken token; }; +struct BoostPrepaidGiveaway final { + int months = 0; + uint64 id = 0; + int quantity = 0; + QDateTime date; +}; + struct BoostStatus final { BoostsOverview overview; BoostsListSlice firstSliceBoosts; BoostsListSlice firstSliceGifts; + std::vector prepaidGiveaway; QString link; }; diff --git a/Telegram/SourceFiles/payments/payments_form.cpp b/Telegram/SourceFiles/payments/payments_form.cpp index 9d58ad5907..0ad3036691 100644 --- a/Telegram/SourceFiles/payments/payments_form.cpp +++ b/Telegram/SourceFiles/payments/payments_form.cpp @@ -130,6 +130,39 @@ not_null SessionFromId(const InvoiceId &id) { return &giveaway.boostPeer->session(); } +MTPinputStorePaymentPurpose InvoicePremiumGiftCodeGiveawayToTL( + const InvoicePremiumGiftCode &invoice) { + const auto &giveaway = v::get( + invoice.purpose); + using Flag = MTPDinputStorePaymentPremiumGiveaway::Flag; + return MTP_inputStorePaymentPremiumGiveaway( + MTP_flags(Flag() + | (giveaway.onlyNewSubscribers + ? Flag::f_only_new_subscribers + : Flag()) + | (giveaway.additionalChannels.empty() + ? Flag() + : Flag::f_additional_peers) + | (giveaway.countries.empty() + ? Flag() + : Flag::f_countries_iso2)), + giveaway.boostPeer->input, + MTP_vector_from_range(ranges::views::all( + giveaway.additionalChannels + ) | ranges::views::transform([](not_null c) { + return MTPInputPeer(c->input); + })), + MTP_vector_from_range(ranges::views::all( + giveaway.countries + ) | ranges::views::transform([](QString value) { + return MTP_string(value); + })), + MTP_long(invoice.randomId), + MTP_int(giveaway.untilDate), + MTP_string(invoice.currency), + MTP_long(invoice.amount)); +} + Form::Form(InvoiceId id, bool receipt) : _id(id) , _session(SessionFromId(id)) @@ -305,36 +338,8 @@ MTPInputInvoice Form::inputInvoice() const { MTP_long(giftCode.amount)), option); } else { - const auto &giveaway = v::get( - giftCode.purpose); - using Flag = MTPDinputStorePaymentPremiumGiveaway::Flag; return MTP_inputInvoicePremiumGiftCode( - MTP_inputStorePaymentPremiumGiveaway( - MTP_flags(Flag() - | (giveaway.onlyNewSubscribers - ? Flag::f_only_new_subscribers - : Flag()) - | (giveaway.additionalChannels.empty() - ? Flag() - : Flag::f_additional_peers) - | (giveaway.countries.empty() - ? Flag() - : Flag::f_countries_iso2)), - giveaway.boostPeer->input, - MTP_vector_from_range(ranges::views::all( - giveaway.additionalChannels - ) | ranges::views::transform([](not_null c) { - return MTPInputPeer(c->input); - })), - MTP_vector_from_range(ranges::views::all( - giveaway.countries - ) | ranges::views::transform([](QString value) { - return MTP_string(value); - })), - MTP_long(giftCode.randomId), - MTP_int(giveaway.untilDate), - MTP_string(giftCode.currency), - MTP_long(giftCode.amount)), + InvoicePremiumGiftCodeGiveawayToTL(giftCode), option); } } diff --git a/Telegram/SourceFiles/payments/payments_form.h b/Telegram/SourceFiles/payments/payments_form.h index 706f9b81d4..acf3750439 100644 --- a/Telegram/SourceFiles/payments/payments_form.h +++ b/Telegram/SourceFiles/payments/payments_form.h @@ -219,6 +219,9 @@ struct InvoiceId { [[nodiscard]] not_null SessionFromId(const InvoiceId &id); +[[nodiscard]] MTPinputStorePaymentPurpose InvoicePremiumGiftCodeGiveawayToTL( + const InvoicePremiumGiftCode &invoice); + class Form final : public base::has_weak_ptr { public: Form(InvoiceId id, bool receipt);