diff --git a/Telegram/SourceFiles/api/api_credits.cpp b/Telegram/SourceFiles/api/api_credits.cpp index d0dc717ea..f969247bb 100644 --- a/Telegram/SourceFiles/api/api_credits.cpp +++ b/Telegram/SourceFiles/api/api_credits.cpp @@ -215,6 +215,10 @@ rpl::producer CreditsTopupOptions::request() { }; } +Data::CreditTopupOptions CreditsTopupOptions::options() const { + return _options; +} + CreditsStatus::CreditsStatus(not_null peer) : _peer(peer) , _api(&peer->session().api().instance()) { @@ -294,10 +298,6 @@ void CreditsHistory::requestSubscriptions( }).send(); } -Data::CreditTopupOptions CreditsTopupOptions::options() const { - return _options; -} - rpl::producer> PremiumPeerBot( not_null session) { const auto username = session->appConfig().get( @@ -385,4 +385,58 @@ Data::CreditsEarnStatistics CreditsEarnStatistics::data() const { return _data; } +CreditsGiveawayOptions::CreditsGiveawayOptions(not_null peer) +: _peer(peer) +, _api(&peer->session().api().instance()) { +} + +rpl::producer CreditsGiveawayOptions::request() { + return [=](auto consumer) { + auto lifetime = rpl::lifetime(); + + using TLOption = MTPStarsGiveawayOption; + + const auto optionsFromTL = [=](const auto &options) { + return ranges::views::all( + options + ) | ranges::views::transform([=](const auto &option) { + return Data::CreditsGiveawayOption{ + .winners = ranges::views::all( + option.data().vwinners().v + ) | ranges::views::transform([](const auto &winner) { + return Data::CreditsGiveawayOption::Winner{ + .users = winner.data().vusers().v, + .perUserStars = winner.data().vper_user_stars().v, + .isDefault = winner.data().is_default(), + }; + }) | ranges::to_vector, + .storeProduct = qs( + option.data().vstore_product().value_or_empty()), + .currency = qs(option.data().vcurrency()), + .amount = option.data().vamount().v, + .credits = option.data().vstars().v, + .yearlyBoosts = option.data().vyearly_boosts().v, + .isExtended = option.data().is_extended(), + .isDefault = option.data().is_default(), + }; + }) | ranges::to_vector; + }; + const auto fail = [=](const MTP::Error &error) { + consumer.put_error_copy(error.type()); + }; + + _api.request(MTPpayments_GetStarsGiveawayOptions( + )).done([=](const MTPVector &result) { + _options = optionsFromTL(result.v); + consumer.put_done(); + }).fail(fail).send(); + + return lifetime; + }; +} + +Data::CreditsGiveawayOptions CreditsGiveawayOptions::options() const { + return _options; +} + } // namespace Api diff --git a/Telegram/SourceFiles/api/api_credits.h b/Telegram/SourceFiles/api/api_credits.h index e038d9c95..d2e819e08 100644 --- a/Telegram/SourceFiles/api/api_credits.h +++ b/Telegram/SourceFiles/api/api_credits.h @@ -36,6 +36,22 @@ private: }; +class CreditsGiveawayOptions final { +public: + CreditsGiveawayOptions(not_null peer); + + [[nodiscard]] rpl::producer request(); + [[nodiscard]] Data::CreditsGiveawayOptions options() const; + +private: + const not_null _peer; + + Data::CreditsGiveawayOptions _options; + + MTP::Sender _api; + +}; + class CreditsStatus final { public: CreditsStatus(not_null peer);