From 1494d5fcdfb817386aa1cff23852de79d67efa5f Mon Sep 17 00:00:00 2001 From: levlam Date: Sun, 24 Dec 2023 02:30:49 +0300 Subject: [PATCH] Add td_api::getDisallowedChatEmojiStatuses. --- td/generate/scheme/td_api.tl | 5 +++- td/telegram/EmojiStatus.cpp | 5 ++++ td/telegram/EmojiStatus.h | 2 ++ td/telegram/StickerListType.cpp | 4 +++ td/telegram/StickerListType.h | 4 +-- td/telegram/StickersManager.cpp | 47 +++++++++++++++++++++++++++++---- td/telegram/StickersManager.h | 13 ++++++--- td/telegram/Td.cpp | 7 +++++ td/telegram/Td.h | 2 ++ td/telegram/UpdatesManager.cpp | 2 ++ td/telegram/cli.cpp | 2 ++ 11 files changed, 82 insertions(+), 11 deletions(-) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 07e3db6f4..c656e2310 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -769,7 +769,7 @@ profileAccentColor id:int32 light_theme_colors:profileAccentColors dark_theme_co //@expiration_date Point in time (Unix timestamp) when the status will expire; 0 if never emojiStatus custom_emoji_id:int64 expiration_date:int32 = EmojiStatus; -//@description Contains a list of custom emoji identifiers, which can be set as emoji statuses @custom_emoji_ids The list of custom emoji identifiers +//@description Contains a list of custom emoji identifiers for emoji statuses @custom_emoji_ids The list of custom emoji identifiers emojiStatuses custom_emoji_ids:vector = EmojiStatuses; @@ -8281,6 +8281,9 @@ getThemedChatEmojiStatuses = EmojiStatuses; //@description Returns default emoji statuses for chats getDefaultChatEmojiStatuses = EmojiStatuses; +//@description Returns the list of emoji statuses, which can't be used as chat emoji status, even they are from a sticker set with is_allowed_as_chat_emoji_status == true +getDisallowedChatEmojiStatuses = EmojiStatuses; + //@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 diff --git a/td/telegram/EmojiStatus.cpp b/td/telegram/EmojiStatus.cpp index 31103abae..63840c897 100644 --- a/td/telegram/EmojiStatus.cpp +++ b/td/telegram/EmojiStatus.cpp @@ -324,6 +324,11 @@ StringBuilder &operator<<(StringBuilder &string_builder, const EmojiStatus &emoj return string_builder; } +td_api::object_ptr get_emoji_statuses_object(const vector &custom_emoji_ids) { + return td_api::make_object( + transform(custom_emoji_ids, [](CustomEmojiId custom_emoji_id) { return custom_emoji_id.get(); })); +} + void get_default_emoji_statuses(Td *td, Promise> &&promise) { auto statuses = load_emoji_statuses(get_default_emoji_statuses_database_key()); if (statuses.hash_ != -1 && promise) { diff --git a/td/telegram/EmojiStatus.h b/td/telegram/EmojiStatus.h index da043bd80..875554d33 100644 --- a/td/telegram/EmojiStatus.h +++ b/td/telegram/EmojiStatus.h @@ -99,6 +99,8 @@ inline bool operator!=(const EmojiStatus &lhs, const EmojiStatus &rhs) { StringBuilder &operator<<(StringBuilder &string_builder, const EmojiStatus &emoji_status); +td_api::object_ptr get_emoji_statuses_object(const vector &custom_emoji_ids); + void get_default_emoji_statuses(Td *td, Promise> &&promise); void get_default_channel_emoji_statuses(Td *td, Promise> &&promise); diff --git a/td/telegram/StickerListType.cpp b/td/telegram/StickerListType.cpp index 049f5bce3..739330634 100644 --- a/td/telegram/StickerListType.cpp +++ b/td/telegram/StickerListType.cpp @@ -16,6 +16,8 @@ string get_sticker_list_type_database_key(StickerListType sticker_list_type) { return "default_profile_photo_custom_emoji_ids"; case StickerListType::Background: return "default_background_custom_emoji_ids"; + case StickerListType::DisallowedChannelEmojiStatus: + return "disallowed_channel_emoji_status_custom_emoji_ids"; default: UNREACHABLE(); return string(); @@ -30,6 +32,8 @@ StringBuilder &operator<<(StringBuilder &string_builder, StickerListType sticker return string_builder << "default user profile photo custom emoji identifiers"; case StickerListType::Background: return string_builder << "default background custom emoji identifiers"; + case StickerListType::DisallowedChannelEmojiStatus: + return string_builder << "disallowed chat emoji status custom emoji identifiers"; default: UNREACHABLE(); return string_builder; diff --git a/td/telegram/StickerListType.h b/td/telegram/StickerListType.h index 16afdb99b..106671b4d 100644 --- a/td/telegram/StickerListType.h +++ b/td/telegram/StickerListType.h @@ -11,9 +11,9 @@ namespace td { -enum class StickerListType : int32 { DialogPhoto, UserProfilePhoto, Background }; +enum class StickerListType : int32 { DialogPhoto, UserProfilePhoto, Background, DisallowedChannelEmojiStatus }; -static constexpr int32 MAX_STICKER_LIST_TYPE = 3; +static constexpr int32 MAX_STICKER_LIST_TYPE = 4; string get_sticker_list_type_database_key(StickerListType sticker_list_type); diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index 28ba3e36f..025ba69bb 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -14,6 +14,7 @@ #include "td/telegram/Document.h" #include "td/telegram/DocumentsManager.h" #include "td/telegram/EmojiGroup.hpp" +#include "td/telegram/EmojiStatus.h" #include "td/telegram/FileReferenceManager.h" #include "td/telegram/files/FileLocation.h" #include "td/telegram/files/FileManager.h" @@ -1472,6 +1473,9 @@ class GetDefaultDialogPhotoEmojisQuery final : public Td::ResultHandler { case StickerListType::Background: send_query(G()->net_query_creator().create(telegram_api::account_getDefaultBackgroundEmojis(hash))); break; + case StickerListType::DisallowedChannelEmojiStatus: + send_query(G()->net_query_creator().create(telegram_api::account_getChannelRestrictedStatusEmojis(hash))); + break; default: UNREACHABLE(); break; @@ -1485,6 +1489,9 @@ class GetDefaultDialogPhotoEmojisQuery final : public Td::ResultHandler { static_assert(std::is_same::value, ""); + static_assert(std::is_same::value, + ""); auto result_ptr = fetch_result(packet); if (result_ptr.is_error()) { return on_error(result_ptr.move_as_error()); @@ -6349,7 +6356,24 @@ void StickersManager::get_default_custom_emoji_stickers(StickerListType sticker_ auto &queries = default_custom_emoji_ids_load_queries_[index]; queries.push_back(std::move(promise)); - if (queries.size() != 1) { + load_default_custom_emoji_ids(sticker_list_type, force_reload); +} + +void StickersManager::get_sticker_list_emoji_statuses(StickerListType sticker_list_type, bool force_reload, + Promise> &&promise) { + auto index = static_cast(sticker_list_type); + if (are_default_custom_emoji_ids_loaded_[index] && !force_reload) { + return promise.set_value(get_emoji_statuses_object(default_custom_emoji_ids_[index])); + } + + auto &queries = default_emoji_statuses_load_queries_[index]; + queries.push_back(std::move(promise)); + load_default_custom_emoji_ids(sticker_list_type, force_reload); +} + +void StickersManager::load_default_custom_emoji_ids(StickerListType sticker_list_type, bool force_reload) { + auto index = static_cast(sticker_list_type); + if (default_custom_emoji_ids_load_queries_[index].size() + default_emoji_statuses_load_queries_[index].size() != 1) { // query has already been sent, just wait for the result return; } @@ -6396,6 +6420,7 @@ void StickersManager::on_load_default_custom_emoji_ids_from_database(StickerList if (G()->close_flag()) { auto index = static_cast(sticker_list_type); fail_promises(default_custom_emoji_ids_load_queries_[index], Global::request_aborted_error()); + fail_promises(default_emoji_statuses_load_queries_[index], Global::request_aborted_error()); return; } @@ -6421,6 +6446,7 @@ void StickersManager::reload_default_custom_emoji_ids(StickerListType sticker_li if (G()->close_flag()) { auto index = static_cast(sticker_list_type); fail_promises(default_custom_emoji_ids_load_queries_[index], Global::request_aborted_error()); + fail_promises(default_emoji_statuses_load_queries_[index], Global::request_aborted_error()); return; } CHECK(!td_->auth_manager_->is_bot()); @@ -6450,6 +6476,7 @@ void StickersManager::on_get_default_custom_emoji_ids( if (r_emoji_list.is_error()) { fail_promises(default_custom_emoji_ids_load_queries_[index], r_emoji_list.move_as_error()); + fail_promises(default_emoji_statuses_load_queries_[index], r_emoji_list.move_as_error()); return; } @@ -6460,9 +6487,14 @@ void StickersManager::on_get_default_custom_emoji_ids( if (!are_default_custom_emoji_ids_loaded_[index]) { on_get_default_custom_emoji_ids_success(sticker_list_type, {}, 0); } - auto promises = std::move(default_custom_emoji_ids_load_queries_[index]); + auto sticker_promises = std::move(default_custom_emoji_ids_load_queries_[index]); + auto status_promises = std::move(default_emoji_statuses_load_queries_[index]); reset_to_empty(default_custom_emoji_ids_load_queries_[index]); - for (auto &promise : promises) { + reset_to_empty(default_emoji_statuses_load_queries_[index]); + for (auto &promise : sticker_promises) { + CHECK(!promise); + } + for (auto &promise : status_promises) { CHECK(!promise); } return; @@ -6489,11 +6521,16 @@ void StickersManager::on_get_default_custom_emoji_ids_success(StickerListType st default_custom_emoji_ids_hash_[index] = hash; are_default_custom_emoji_ids_loaded_[index] = true; - auto promises = std::move(default_custom_emoji_ids_load_queries_[index]); + auto sticker_promises = std::move(default_custom_emoji_ids_load_queries_[index]); + auto status_promises = std::move(default_emoji_statuses_load_queries_[index]); reset_to_empty(default_custom_emoji_ids_load_queries_[index]); - for (auto &promise : promises) { + reset_to_empty(default_emoji_statuses_load_queries_[index]); + for (auto &promise : sticker_promises) { get_custom_emoji_stickers_unlimited(default_custom_emoji_ids_[index], std::move(promise)); } + for (auto &promise : status_promises) { + promise.set_value(get_emoji_statuses_object(default_custom_emoji_ids_[index])); + } } void StickersManager::get_premium_gift_option_sticker(int32 month_count, bool is_recursive, diff --git a/td/telegram/StickersManager.h b/td/telegram/StickersManager.h index 977b94369..17f58b66b 100644 --- a/td/telegram/StickersManager.h +++ b/td/telegram/StickersManager.h @@ -141,6 +141,9 @@ class StickersManager final : public Actor { void get_default_custom_emoji_stickers(StickerListType sticker_list_type, bool force_reload, Promise> &&promise); + void get_sticker_list_emoji_statuses(StickerListType sticker_list_type, bool force_reload, + Promise> &&promise); + void get_premium_gift_option_sticker(int32 month_count, bool is_recursive, Promise> &&promise); @@ -624,6 +627,8 @@ class StickersManager final : public Actor { void on_load_custom_emoji_from_database(CustomEmojiId custom_emoji_id, string value); + void load_default_custom_emoji_ids(StickerListType sticker_list_type, bool force_reload); + void on_load_default_custom_emoji_ids_from_database(StickerListType sticker_list_type, bool force_reload, string value); @@ -1130,10 +1135,12 @@ class StickersManager final : public Actor { vector>> emoji_group_load_queries_[MAX_EMOJI_GROUP_TYPE]; vector default_custom_emoji_ids_[MAX_STICKER_LIST_TYPE]; - int64 default_custom_emoji_ids_hash_[MAX_STICKER_LIST_TYPE] = {0, 0, 0}; + int64 default_custom_emoji_ids_hash_[MAX_STICKER_LIST_TYPE] = {0, 0, 0, 0}; vector>> default_custom_emoji_ids_load_queries_[MAX_STICKER_LIST_TYPE]; - bool are_default_custom_emoji_ids_loaded_[MAX_STICKER_LIST_TYPE] = {false, false, false}; - bool are_default_custom_emoji_ids_being_loaded_[MAX_STICKER_LIST_TYPE] = {false, false, false}; + vector>> + default_emoji_statuses_load_queries_[MAX_STICKER_LIST_TYPE]; + bool are_default_custom_emoji_ids_loaded_[MAX_STICKER_LIST_TYPE] = {false, false, false, false}; + bool are_default_custom_emoji_ids_being_loaded_[MAX_STICKER_LIST_TYPE] = {false, false, false, false}; WaitFreeHashMap custom_emoji_to_sticker_id_; diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index bf4ae6310..aa2819a9e 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -8103,6 +8103,13 @@ void Td::on_request(uint64 id, const td_api::getDefaultBackgroundCustomEmojiStic stickers_manager_->get_default_custom_emoji_stickers(StickerListType::Background, false, std::move(promise)); } +void Td::on_request(uint64 id, const td_api::getDisallowedChatEmojiStatuses &request) { + CHECK_IS_USER(); + CREATE_REQUEST_PROMISE(); + stickers_manager_->get_sticker_list_emoji_statuses(StickerListType::DisallowedChannelEmojiStatus, false, + std::move(promise)); +} + void Td::on_request(uint64 id, const td_api::getSavedAnimations &request) { CHECK_IS_USER(); CREATE_NO_ARGS_REQUEST(GetSavedAnimationsRequest); diff --git a/td/telegram/Td.h b/td/telegram/Td.h index e899d4c0c..5b98c40a8 100644 --- a/td/telegram/Td.h +++ b/td/telegram/Td.h @@ -1431,6 +1431,8 @@ class Td final : public Actor { void on_request(uint64 id, const td_api::getDefaultBackgroundCustomEmojiStickers &request); + void on_request(uint64 id, const td_api::getDisallowedChatEmojiStatuses &request); + void on_request(uint64 id, const td_api::getFavoriteStickers &request); void on_request(uint64 id, td_api::addFavoriteSticker &request); diff --git a/td/telegram/UpdatesManager.cpp b/td/telegram/UpdatesManager.cpp index 23b71a9e2..b63e4710e 100644 --- a/td/telegram/UpdatesManager.cpp +++ b/td/telegram/UpdatesManager.cpp @@ -2278,6 +2278,8 @@ void UpdatesManager::try_reload_data() { td_->stickers_manager_->reload_special_sticker_set_by_type(SpecialStickerSetType::default_topic_icons()); td_->stickers_manager_->get_default_custom_emoji_stickers(StickerListType::DialogPhoto, true, Auto()); td_->stickers_manager_->get_default_custom_emoji_stickers(StickerListType::UserProfilePhoto, true, Auto()); + td_->stickers_manager_->get_default_custom_emoji_stickers(StickerListType::Background, true, Auto()); + td_->stickers_manager_->get_sticker_list_emoji_statuses(StickerListType::DisallowedChannelEmojiStatus, true, Auto()); td_->story_manager_->reload_active_stories(); td_->story_manager_->reload_all_read_stories(); td_->theme_manager_->reload_accent_colors(); diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index 83f71d33b..5320a2dc4 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -5591,6 +5591,8 @@ class CliClient final : public Actor { send_request(td_api::make_object()); } else if (op == "gdces") { send_request(td_api::make_object()); + } else if (op == "gdices") { + send_request(td_api::make_object()); } else if (op == "ccun") { ChatId chat_id; string username;