diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index f6dd5aa46..2919c5ddf 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -478,6 +478,9 @@ premiumPaymentOption currency:string amount:int53 discount_percentage:int32 mont //@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 premiumStatus custom_emoji_id:int64 = PremiumStatus; +//@description Contains a list of premium statuses @premium_statuses The list of premium statuses +premiumStatuses premium_statuses:vector = PremiumStatuses; + //@description Represents a user //@id User identifier @@ -5572,6 +5575,10 @@ getAttachmentMenuBot bot_user_id:int53 = AttachmentMenuBot; toggleBotIsAddedToAttachmentMenu bot_user_id:int53 is_added:Bool = Ok; +//@description Returns default premium statuses +getDefaultPremiumStatuses = PremiumStatuses; + + //@description Downloads a file from the cloud. Download progress and completion of the download will be notified through updateFile updates //@file_id Identifier of the file to download //@priority Priority of the download (1-32). The higher the priority, the earlier the file will be downloaded. If the priorities of two files are equal, then the last one for which downloadFile/addFileToDownloads was called will be downloaded first diff --git a/td/telegram/EmojiStatus.cpp b/td/telegram/EmojiStatus.cpp index 0cb8f2d64..fba750879 100644 --- a/td/telegram/EmojiStatus.cpp +++ b/td/telegram/EmojiStatus.cpp @@ -6,8 +6,55 @@ // #include "td/telegram/EmojiStatus.h" +#include "td/telegram/Global.h" +#include "td/telegram/Td.h" + +#include "td/utils/buffer.h" +#include "td/utils/Status.h" + namespace td { +class GetDefaultEmojiStatusesQuery final : public Td::ResultHandler { + Promise> promise_; + + public: + explicit GetDefaultEmojiStatusesQuery(Promise> &&promise) + : promise_(std::move(promise)) { + } + + void send(int64 hash) { + send_query(G()->net_query_creator().create(telegram_api::account_getDefaultEmojiStatuses(hash))); + } + + void on_result(BufferSlice packet) final { + auto result_ptr = fetch_result(packet); + if (result_ptr.is_error()) { + return on_error(result_ptr.move_as_error()); + } + + auto emoji_statuses_ptr = result_ptr.move_as_ok(); + LOG(INFO) << "Receive result for GetDefaultEmojiStatusesQuery: " << to_string(emoji_statuses_ptr); + + auto result = td_api::make_object(); + if (emoji_statuses_ptr->get_id() == telegram_api::account_emojiStatuses::ID) { + auto emoji_statuses = move_tl_object_as(emoji_statuses_ptr); + for (auto &status : emoji_statuses->statuses_) { + EmojiStatus emoji_status(std::move(status)); + if (emoji_status.is_empty()) { + LOG(ERROR) << "Receive empty default emoji status"; + continue; + } + result->premium_statuses_.push_back(emoji_status.get_premium_status_object()); + } + } + promise_.set_value(std::move(result)); + } + + void on_error(Status status) final { + promise_.set_error(std::move(status)); + } +}; + EmojiStatus::EmojiStatus(const td_api::object_ptr &premium_status) : custom_emoji_id_(premium_status != nullptr ? premium_status->custom_emoji_id_ : 0) { } @@ -39,4 +86,8 @@ StringBuilder &operator<<(StringBuilder &string_builder, const EmojiStatus &emoj return string_builder << "CustomEmoji " << emoji_status.custom_emoji_id_; } +void get_default_emoji_statuses(Td *td, Promise> &&promise) { + td->create_handler(std::move(promise))->send(0); +} + } // namespace td diff --git a/td/telegram/EmojiStatus.h b/td/telegram/EmojiStatus.h index 7f8134c55..c7d76ff46 100644 --- a/td/telegram/EmojiStatus.h +++ b/td/telegram/EmojiStatus.h @@ -10,11 +10,14 @@ #include "td/telegram/telegram_api.h" #include "td/utils/common.h" +#include "td/utils/Promise.h" #include "td/utils/StringBuilder.h" #include "td/utils/tl_helpers.h" namespace td { +class Td; + class EmojiStatus { int64 custom_emoji_id_ = 0; @@ -58,4 +61,6 @@ inline bool operator!=(const EmojiStatus &lhs, const EmojiStatus &rhs) { StringBuilder &operator<<(StringBuilder &string_builder, const EmojiStatus &emoji_status); +void get_default_emoji_statuses(Td *td, Promise> &&promise); + } // namespace td diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index 14d18a7eb..7cc800255 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -6733,6 +6733,12 @@ void Td::on_request(uint64 id, const td_api::setPremiumStatus &request) { contacts_manager_->set_emoji_status(EmojiStatus(request.premium_status_), std::move(promise)); } +void Td::on_request(uint64 id, const td_api::getDefaultPremiumStatuses &request) { + CHECK_IS_USER(); + CREATE_REQUEST_PROMISE(); + get_default_emoji_statuses(this, std::move(promise)); +} + void Td::on_request(uint64 id, td_api::setCommands &request) { CHECK_IS_BOT(); CREATE_OK_REQUEST_PROMISE(); diff --git a/td/telegram/Td.h b/td/telegram/Td.h index 8efb02d9f..f508aa9e1 100644 --- a/td/telegram/Td.h +++ b/td/telegram/Td.h @@ -1014,6 +1014,8 @@ class Td final : public Actor { void on_request(uint64 id, const td_api::setPremiumStatus &request); + void on_request(uint64 id, const td_api::getDefaultPremiumStatuses &request); + void on_request(uint64 id, td_api::setCommands &request); void on_request(uint64 id, td_api::deleteCommands &request); diff --git a/td/telegram/UpdatesManager.cpp b/td/telegram/UpdatesManager.cpp index 370426168..57d397606 100644 --- a/td/telegram/UpdatesManager.cpp +++ b/td/telegram/UpdatesManager.cpp @@ -20,6 +20,7 @@ #include "td/telegram/DialogInviteLink.h" #include "td/telegram/DialogParticipant.h" #include "td/telegram/DownloadManager.h" +#include "td/telegram/EmojiStatus.h" #include "td/telegram/FolderId.h" #include "td/telegram/Global.h" #include "td/telegram/GroupCallManager.h" @@ -1700,6 +1701,7 @@ void UpdatesManager::try_reload_data() { td_->animations_manager_->get_saved_animations(Auto()); td_->contacts_manager_->reload_created_public_dialogs(PublicDialogType::HasUsername, Auto()); td_->contacts_manager_->reload_created_public_dialogs(PublicDialogType::IsLocationBased, Auto()); + get_default_emoji_statuses(td_, Auto()); td_->notification_settings_manager_->reload_saved_ringtones(Auto()); td_->notification_settings_manager_->send_get_scope_notification_settings_query(NotificationSettingsScope::Private, Auto()); diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index 8970c8ca0..c1c281706 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -4477,6 +4477,8 @@ class CliClient final : public Actor { auto premium_status = args.empty() ? nullptr : td_api::make_object(to_integer(args)); send_request(td_api::make_object(std::move(premium_status))); + } else if (op == "gdps") { + send_request(td_api::make_object()); } else if (op == "ccun") { ChatId chat_id; string username;