diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index 8d0dc7e73..e8659f0d4 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -2382,12 +2382,24 @@ FileId StickersManager::get_animated_emoji_sound_file_id(const string &emoji) co return it->second; } +FileId StickersManager::get_custom_animated_emoji_sticker_id(int64 custom_emoji_id) const { + if (disable_animated_emojis_) { + return {}; + } + + return custom_emoji_to_sticker_id_.get(custom_emoji_id); +} + td_api::object_ptr StickersManager::get_animated_emoji_object(const string &emoji, int64 custom_emoji_id) { + if (disable_animated_emojis_) { + return nullptr; + } + if (custom_emoji_id != 0) { auto it = custom_emoji_messages_.find(custom_emoji_id); - auto sticker_id = - it == custom_emoji_messages_.end() ? custom_emoji_to_sticker_id_.get(custom_emoji_id) : it->second->sticker_id; + auto sticker_id = it == custom_emoji_messages_.end() ? get_custom_animated_emoji_sticker_id(custom_emoji_id) + : it->second->sticker_id; return td_api::make_object(get_sticker_object(sticker_id, true), 0, nullptr); } @@ -4915,6 +4927,22 @@ void StickersManager::on_update_disable_animated_emojis() { reload_special_sticker_set_by_type(SpecialStickerSetType::animated_emoji_click()); } try_update_animated_emoji_messages(); + + vector custom_emoji_ids; + for (auto &it : custom_emoji_messages_) { + custom_emoji_ids.push_back(it.first); + } + for (auto custom_emoji_id : custom_emoji_ids) { + try_update_custom_emoji_messages(custom_emoji_id); + } + + if (!disable_animated_emojis_) { + for (size_t i = 0; i < custom_emoji_ids.size(); i += MAX_GET_CUSTOM_EMOJI_STICKERS) { + auto end_i = i + MAX_GET_CUSTOM_EMOJI_STICKERS; + auto end = end_i < custom_emoji_ids.size() ? custom_emoji_ids.begin() + end_i : custom_emoji_ids.end(); + get_custom_emoji_stickers({custom_emoji_ids.begin() + i, end}, true, Auto()); + } + } } void StickersManager::on_update_sticker_sets() { @@ -4953,7 +4981,7 @@ void StickersManager::try_update_custom_emoji_messages(int64 custom_emoji_id) { } vector full_message_ids; - auto new_sticker_id = custom_emoji_to_sticker_id_.get(custom_emoji_id); + auto new_sticker_id = get_custom_animated_emoji_sticker_id(custom_emoji_id); if (new_sticker_id != it->second->sticker_id) { it->second->sticker_id = new_sticker_id; for (const auto &full_message_id : it->second->full_message_ids) { @@ -5093,8 +5121,10 @@ void StickersManager::register_emoji(const string &emoji, int64 custom_emoji_id, } auto &emoji_messages = *emoji_messages_ptr; if (emoji_messages.full_message_ids.empty()) { - emoji_messages.sticker_id = custom_emoji_to_sticker_id_.get(custom_emoji_id); - get_custom_emoji_stickers({custom_emoji_id}, true, Promise>()); + emoji_messages.sticker_id = get_custom_animated_emoji_sticker_id(custom_emoji_id); + if (!disable_animated_emojis_) { + get_custom_emoji_stickers({custom_emoji_id}, true, Promise>()); + } } bool is_inserted = emoji_messages.full_message_ids.insert(full_message_id).second; LOG_CHECK(is_inserted) << source << ' ' << custom_emoji_id << ' ' << full_message_id; @@ -5280,8 +5310,7 @@ void StickersManager::get_custom_emoji_stickers(vector &&document_ids, bo Promise> &&promise) { TRY_STATUS_PROMISE(promise, G()->close_status()); - constexpr size_t MAX_CUSTOME_EMOJI_IDS = 200; // server-side limit - if (document_ids.size() > MAX_CUSTOME_EMOJI_IDS) { + if (document_ids.size() > MAX_GET_CUSTOM_EMOJI_STICKERS) { return promise.set_error(Status::Error(400, "Too many custom emoji identifiers specified")); } @@ -5463,6 +5492,7 @@ void StickersManager::choose_animated_emoji_click_sticker(const StickerSet *stic } } if (found_stickers.empty()) { + LOG(INFO) << "There is no click effect for " << message_text << " from " << full_message_id; return promise.set_value(nullptr); } diff --git a/td/telegram/StickersManager.h b/td/telegram/StickersManager.h index 147b6293b..da060a67d 100644 --- a/td/telegram/StickersManager.h +++ b/td/telegram/StickersManager.h @@ -370,6 +370,7 @@ class StickersManager final : public Actor { static constexpr int32 MAX_FOUND_STICKERS = 100; // server side limit static constexpr size_t MAX_STICKER_SET_TITLE_LENGTH = 64; // server side limit static constexpr size_t MAX_STICKER_SET_SHORT_NAME_LENGTH = 64; // server side limit + static constexpr size_t MAX_GET_CUSTOM_EMOJI_STICKERS = 200; // server-side limit static constexpr int32 EMOJI_KEYWORDS_UPDATE_DELAY = 3600; static constexpr double MIN_ANIMATED_EMOJI_CLICK_DELAY = 0.2; @@ -743,6 +744,8 @@ class StickersManager final : public Actor { FileId get_animated_emoji_sound_file_id(const string &emoji) const; + FileId get_custom_animated_emoji_sticker_id(int64 custom_emoji_id) const; + td_api::object_ptr get_animated_emoji_object(std::pair animated_sticker, FileId sound_file_id) const;