diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 4971c2ce1..2d931cffd 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -620,6 +620,13 @@ chatAdministratorRights can_manage_chat:Bool can_change_info:Bool can_post_messa //@payment_link An internal link to be opened for buying Telegram Premium to the user if store payment isn't possible; may be null if direct payment isn't available premiumPaymentOption currency:string amount:int53 discount_percentage:int32 month_count:int32 store_product_id:string payment_link:InternalLinkType = PremiumPaymentOption; +//@description Describes an option for buying or upgrading Telegram Premium for self +//@payment_option Information about the payment option +//@is_current True, if this is the currently used Telegram Premium subscription option +//@is_upgrade True, if the payment option can be used to upgrade the existing Telegram Premium subscription +//@last_transaction_id Identifier of the last in-store transaction for the currently used option +premiumStatePaymentOption payment_option:premiumPaymentOption is_current:Bool is_upgrade:Bool last_transaction_id:string = PremiumStatePaymentOption; + //@description Describes a custom emoji to be shown instead of the Telegram Premium badge @custom_emoji_id Identifier of the custom emoji in stickerFormatTgs format emojiStatus custom_emoji_id:int64 = EmojiStatus; @@ -3814,7 +3821,7 @@ premiumFeaturePromotionAnimation feature:PremiumFeature animation:animation = Pr //@state Text description of the state of the current Premium subscription; may be empty if the current user has no Telegram Premium subscription //@payment_options The list of available options for buying Telegram Premium //@animations The list of available promotion animations for Premium features -premiumState state:formattedText payment_options:vector animations:vector = PremiumState; +premiumState state:formattedText payment_options:vector animations:vector = PremiumState; //@class StorePaymentPurpose @description Describes a purpose of an in-store payment diff --git a/td/telegram/Premium.cpp b/td/telegram/Premium.cpp index 9e2a64e12..88bd0b83b 100644 --- a/td/telegram/Premium.cpp +++ b/td/telegram/Premium.cpp @@ -169,9 +169,9 @@ class GetPremiumPromoQuery final : public Td::ResultHandler { } auto period_options = get_premium_gift_options(std::move(promo->period_options_)); - promise_.set_value(td_api::make_object(get_formatted_text_object(state, true, 0), - get_premium_payment_options_object(period_options), - std::move(animations))); + promise_.set_value(td_api::make_object( + get_formatted_text_object(state, true, 0), get_premium_state_payment_options_object(period_options), + std::move(animations))); } void on_error(Status status) final { diff --git a/td/telegram/PremiumGiftOption.cpp b/td/telegram/PremiumGiftOption.cpp index 651594d53..a83f7c75d 100644 --- a/td/telegram/PremiumGiftOption.cpp +++ b/td/telegram/PremiumGiftOption.cpp @@ -28,10 +28,13 @@ PremiumGiftOption::PremiumGiftOption(telegram_api::object_ptr &&option) : months_(option->months_) + , is_current_(option->current_) + , is_upgrade_(option->can_purchase_upgrade_) , currency_(std::move(option->currency_)) , amount_(option->amount_) , bot_url_(std::move(option->bot_url_)) - , store_product_(std::move(option->store_product_)) { + , store_product_(std::move(option->store_product_)) + , transaction_(std::move(option->transaction_)) { } bool PremiumGiftOption::is_valid() const { @@ -65,6 +68,12 @@ td_api::object_ptr PremiumGiftOption::get_premium_ link_type == nullptr ? nullptr : link_type->get_internal_link_type_object()); } +td_api::object_ptr PremiumGiftOption::get_premium_state_payment_option_object( + const PremiumGiftOption &base_option) const { + return td_api::make_object(get_premium_payment_option_object(base_option), + is_current_, is_upgrade_, transaction_); +} + bool operator<(const PremiumGiftOption &lhs, const PremiumGiftOption &rhs) { return std::tie(lhs.months_, lhs.amount_, lhs.currency_, lhs.store_product_, lhs.bot_url_) < std::tie(rhs.months_, rhs.amount_, rhs.currency_, rhs.store_product_, rhs.bot_url_); @@ -106,4 +115,15 @@ vector> get_premium_payment_opt }); } +vector> get_premium_state_payment_options_object( + const vector &options) { + if (options.empty()) { + return {}; + } + auto base_premium_option_it = std::min_element(options.begin(), options.end()); + return transform(options, [&base_premium_option_it](const auto &option) { + return option.get_premium_state_payment_option_object(*base_premium_option_it); + }); +} + } // namespace td diff --git a/td/telegram/PremiumGiftOption.h b/td/telegram/PremiumGiftOption.h index 3c1d8db88..d5e03b188 100644 --- a/td/telegram/PremiumGiftOption.h +++ b/td/telegram/PremiumGiftOption.h @@ -15,10 +15,13 @@ namespace td { class PremiumGiftOption { int32 months_ = 0; + bool is_current_ = false; + bool is_upgrade_ = false; string currency_; int64 amount_ = 0; string bot_url_; string store_product_; + string transaction_; friend bool operator<(const PremiumGiftOption &lhs, const PremiumGiftOption &rhs); @@ -34,6 +37,9 @@ class PremiumGiftOption { td_api::object_ptr get_premium_payment_option_object( const PremiumGiftOption &base_option) const; + td_api::object_ptr get_premium_state_payment_option_object( + const PremiumGiftOption &base_option) const; + bool is_valid() const; template @@ -55,4 +61,7 @@ vector get_premium_gift_options( vector> get_premium_payment_options_object( const vector &options); +vector> get_premium_state_payment_options_object( + const vector &options); + } // namespace td diff --git a/td/telegram/PremiumGiftOption.hpp b/td/telegram/PremiumGiftOption.hpp index 92f3d4589..3a7d3d313 100644 --- a/td/telegram/PremiumGiftOption.hpp +++ b/td/telegram/PremiumGiftOption.hpp @@ -19,12 +19,16 @@ void PremiumGiftOption::store(StorerT &storer) const { bool has_amount = amount_ != 0; bool has_bot_url = !bot_url_.empty(); bool has_store_product = !store_product_.empty(); + bool has_transaction = !transaction_.empty(); BEGIN_STORE_FLAGS(); STORE_FLAG(has_months); STORE_FLAG(has_currency); STORE_FLAG(has_amount); STORE_FLAG(has_bot_url); STORE_FLAG(has_store_product); + STORE_FLAG(is_current_); + STORE_FLAG(is_upgrade_); + STORE_FLAG(has_transaction); END_STORE_FLAGS(); if (has_months) { td::store(months_, storer); @@ -41,6 +45,9 @@ void PremiumGiftOption::store(StorerT &storer) const { if (has_store_product) { td::store(store_product_, storer); } + if (has_transaction) { + td::store(transaction_, storer); + } } template @@ -50,12 +57,16 @@ void PremiumGiftOption::parse(ParserT &parser) { bool has_amount; bool has_bot_url; bool has_store_product; + bool has_transaction; BEGIN_PARSE_FLAGS(); PARSE_FLAG(has_months); PARSE_FLAG(has_currency); PARSE_FLAG(has_amount); PARSE_FLAG(has_bot_url); PARSE_FLAG(has_store_product); + PARSE_FLAG(is_current_); + PARSE_FLAG(is_upgrade_); + PARSE_FLAG(has_transaction); END_PARSE_FLAGS(); if (has_months) { td::parse(months_, parser); @@ -72,6 +83,9 @@ void PremiumGiftOption::parse(ParserT &parser) { if (has_store_product) { td::parse(store_product_, parser); } + if (has_transaction) { + td::parse(transaction_, parser); + } } } // namespace td