diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 5cb031d49..9bfc61ff1 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -6315,6 +6315,9 @@ removeStickerFromSet sticker:InputFile = Ok; getMapThumbnailFile location:location zoom:int32 width:int32 height:int32 scale:int32 chat_id:int53 = File; +//@description Returns information about a limit, increased for Premium users. Returns a 404 error if the limit is unknown @limit_type Type of the limit +getPremiumLimit limit_type:PremiumLimitType = PremiumLimit; + //@description Returns information about features, available to Premium users @source Source of the request; pass null if the method is called from some non-standard source getPremiumFeatures source:PremiumSource = PremiumFeatures; diff --git a/td/telegram/Premium.cpp b/td/telegram/Premium.cpp index 988895c83..b955ae644 100644 --- a/td/telegram/Premium.cpp +++ b/td/telegram/Premium.cpp @@ -9,6 +9,7 @@ #include "td/telegram/ConfigShared.h" #include "td/telegram/Global.h" +#include "td/utils/algorithm.h" #include "td/utils/SliceBuilder.h" namespace td { @@ -26,37 +27,39 @@ const vector &get_premium_limit_keys() { return limit_keys; } +static Slice get_limit_type_key(const td_api::PremiumLimitType *limit_type) { + CHECK(limit_type != nullptr); + switch (limit_type->get_id()) { + case td_api::premiumLimitTypeSupergroupCount::ID: + return Slice("channels"); + case td_api::premiumLimitTypeSavedAnimationCount::ID: + return Slice("saved_gifs"); + case td_api::premiumLimitTypeFavoriteStickerCount::ID: + return Slice("stickers_faved"); + case td_api::premiumLimitTypeChatFilterCount::ID: + return Slice("dialog_filters"); + case td_api::premiumLimitTypeChatFilterChosenChatCount::ID: + return Slice("dialog_filters_chats"); + case td_api::premiumLimitTypePinnedChatCount::ID: + return Slice("dialogs_pinned"); + case td_api::premiumLimitTypePinnedArchivedChatCount::ID: + return Slice("dialogs_folder_pinned"); + case td_api::premiumLimitTypeCreatedPublicChatCount::ID: + return Slice("channels_public"); + case td_api::premiumLimitTypeCaptionLength::ID: + return Slice("caption_length"); + default: + UNREACHABLE(); + return Slice(); + } +} + static string get_premium_source(const td_api::PremiumLimitType *limit_type) { if (limit_type == nullptr) { return string(); } - auto key = [&]() { - switch (limit_type->get_id()) { - case td_api::premiumLimitTypeSupergroupCount::ID: - return "channels"; - case td_api::premiumLimitTypeSavedAnimationCount::ID: - return "saved_gifs"; - case td_api::premiumLimitTypeFavoriteStickerCount::ID: - return "stickers_faved"; - case td_api::premiumLimitTypeChatFilterCount::ID: - return "dialog_filters"; - case td_api::premiumLimitTypeChatFilterChosenChatCount::ID: - return "dialog_filters_chats"; - case td_api::premiumLimitTypePinnedChatCount::ID: - return "dialogs_pinned"; - case td_api::premiumLimitTypePinnedArchivedChatCount::ID: - return "dialogs_folder_pinned"; - case td_api::premiumLimitTypeCreatedPublicChatCount::ID: - return "channels_public"; - case td_api::premiumLimitTypeCaptionLength::ID: - return "caption_length"; - default: - UNREACHABLE(); - return ""; - } - }(); - return PSTRING() << "double_limits__" << key; + return PSTRING() << "double_limits__" << get_limit_type_key(limit_type); } static string get_premium_source(const td_api::PremiumFeature *feature) { @@ -119,6 +122,55 @@ static string get_premium_source(const td_api::object_ptr } } +static td_api::object_ptr get_premium_limit_object(Slice key) { + int32 default_limit = static_cast(G()->shared_config().get_option_integer(PSLICE() << key << "_default")); + int32 premium_limit = static_cast(G()->shared_config().get_option_integer(PSLICE() << key << "_premium")); + if (default_limit <= 0 || premium_limit <= default_limit) { + return nullptr; + } + auto type = [&]() -> td_api::object_ptr { + if (key == "channels_limit") { + return td_api::make_object(); + } + if (key == "saved_gifs_limit") { + return td_api::make_object(); + } + if (key == "stickers_faved_limit") { + return td_api::make_object(); + } + if (key == "dialog_filters_limit") { + return td_api::make_object(); + } + if (key == "dialog_filters_chats_limit") { + return td_api::make_object(); + } + if (key == "dialogs_pinned_limit") { + return td_api::make_object(); + } + if (key == "dialogs_folder_pinned_limit") { + return td_api::make_object(); + } + if (key == "channels_public_limit") { + return td_api::make_object(); + } + if (key == "caption_length_limit") { + return td_api::make_object(); + } + UNREACHABLE(); + return nullptr; + }(); + return td_api::make_object(std::move(type), default_limit, premium_limit); +} + +void get_premium_limit(const td_api::object_ptr &limit_type, + Promise> &&promise) { + if (limit_type == nullptr) { + return promise.set_error(Status::Error(400, "Limit type must be non-empty")); + } + + promise.set_value(get_premium_limit_object(PSLICE() << get_limit_type_key(limit_type.get()) << "_limit")); +} + void get_premium_features(const td_api::object_ptr &source, Promise> &&promise) { auto premium_features = @@ -167,46 +219,8 @@ void get_premium_features(const td_api::object_ptr &sourc } } - auto &limit_keys = get_premium_limit_keys(); - vector> limits; - for (auto key : limit_keys) { - int32 default_limit = static_cast(G()->shared_config().get_option_integer(PSLICE() << key << "_default")); - int32 premium_limit = static_cast(G()->shared_config().get_option_integer(PSLICE() << key << "_premium")); - if (default_limit > 0 && premium_limit > 0) { - auto type = [&]() -> td_api::object_ptr { - if (key == "channels_limit") { - return td_api::make_object(); - } - if (key == "saved_gifs_limit") { - return td_api::make_object(); - } - if (key == "stickers_faved_limit") { - return td_api::make_object(); - } - if (key == "dialog_filters_limit") { - return td_api::make_object(); - } - if (key == "dialog_filters_chats_limit") { - return td_api::make_object(); - } - if (key == "dialogs_pinned_limit") { - return td_api::make_object(); - } - if (key == "dialogs_folder_pinned_limit") { - return td_api::make_object(); - } - if (key == "channels_public_limit") { - return td_api::make_object(); - } - if (key == "caption_length_limit") { - return td_api::make_object(); - } - UNREACHABLE(); - return nullptr; - }(); - limits.push_back(td_api::make_object(std::move(type), default_limit, premium_limit)); - } - } + auto limits = transform(get_premium_limit_keys(), get_premium_limit_object); + td::remove_if(limits, [](auto &limit) { return limit == nullptr; }); auto source_str = get_premium_source(source); // TODO use source_str diff --git a/td/telegram/Premium.h b/td/telegram/Premium.h index 8d3bdaf46..4d1d3b062 100644 --- a/td/telegram/Premium.h +++ b/td/telegram/Premium.h @@ -17,6 +17,9 @@ namespace td { const vector &get_premium_limit_keys(); +void get_premium_limit(const td_api::object_ptr &limit_type, + Promise> &&promise); + void get_premium_features(const td_api::object_ptr &source, Promise> &&promise); diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index 1479dda80..d7f15672d 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -7826,6 +7826,12 @@ void Td::on_request(uint64 id, td_api::removeRecentHashtag &request) { send_closure(hashtag_hints_, &HashtagHints::remove_hashtag, std::move(request.hashtag_), std::move(promise)); } +void Td::on_request(uint64 id, const td_api::getPremiumLimit &request) { + CHECK_IS_USER(); + CREATE_REQUEST_PROMISE(); + get_premium_limit(request.limit_type_, std::move(promise)); +} + void Td::on_request(uint64 id, const td_api::getPremiumFeatures &request) { CHECK_IS_USER(); CREATE_REQUEST_PROMISE(); diff --git a/td/telegram/Td.h b/td/telegram/Td.h index 16e1bdc38..06278a38d 100644 --- a/td/telegram/Td.h +++ b/td/telegram/Td.h @@ -1288,6 +1288,8 @@ class Td final : public Actor { void on_request(uint64 id, td_api::removeRecentHashtag &request); + void on_request(uint64 id, const td_api::getPremiumLimit &request); + void on_request(uint64 id, const td_api::getPremiumFeatures &request); void on_request(uint64 id, td_api::acceptTermsOfService &request); diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index eec94453f..8d0f65095 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -2543,7 +2543,10 @@ class CliClient final : public Actor { execute(td_api::make_object(rand_bool() ? "en" : "", args)); } else if (op == "gadl") { send_request(td_api::make_object()); - } else if (op == "gpfs") { + } else if (op == "gprl") { + auto limit_type = td_api::make_object(); + send_request(td_api::make_object(std::move(limit_type))); + } else if (op == "gprf") { auto source = td_api::make_object("ref"); send_request(td_api::make_object(std::move(source))); } else if (op == "atos") {