From 51ea826b6c27f4afd597bbc6b938b89ce7fb84e2 Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 5 Sep 2022 21:04:08 +0300 Subject: [PATCH] Synchronously load custom emoji from database if they are to be shown as an animated emoji. --- td/telegram/StickersManager.cpp | 29 ++++++++++++++++++++++++++--- td/telegram/StickersManager.h | 2 ++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index 1543fb1be..21e078fb1 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -5343,10 +5343,13 @@ 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_ = get_custom_animated_emoji_sticker_id(custom_emoji_id); - if (!disable_animated_emojis_) { - get_custom_emoji_stickers({custom_emoji_id}, true, Promise>()); + if (!disable_animated_emojis_ && custom_emoji_to_sticker_id_.count(custom_emoji_id) == 0) { + load_custom_emoji_sticker_from_database_force(custom_emoji_id); + if (custom_emoji_to_sticker_id_.count(custom_emoji_id) == 0) { + get_custom_emoji_stickers({custom_emoji_id}, false, Promise>()); + } } + emoji_messages.sticker_id_ = get_custom_animated_emoji_sticker_id(custom_emoji_id); } emoji_messages.full_message_ids_.insert(full_message_id); return; @@ -5508,6 +5511,26 @@ bool StickersManager::is_default_emoji_status(int64 custom_emoji_id) { return false; } +void StickersManager::load_custom_emoji_sticker_from_database_force(int64 custom_emoji_id) { + if (!G()->parameters().use_file_db) { + return; + } + + auto value = G()->td_db()->get_sqlite_sync_pmc()->get(get_custom_emoji_database_key(custom_emoji_id)); + if (value.empty()) { + LOG(INFO) << "Failed to load custom emoji " << custom_emoji_id << " from database"; + return; + } + + LOG(INFO) << "Synchronously loaded custom emoji " << custom_emoji_id << " of size " << value.size() + << " from database"; + CustomEmojiLogEvent log_event; + if (log_event_parse(log_event, value).is_error()) { + LOG(ERROR) << "Delete invalid custom emoji " << custom_emoji_id << " value from database"; + G()->td_db()->get_sqlite_sync_pmc()->erase(get_custom_emoji_database_key(custom_emoji_id)); + } +} + void StickersManager::load_custom_emoji_sticker_from_database(int64 custom_emoji_id, Promise &&promise) { CHECK(custom_emoji_id != 0); auto &queries = custom_emoji_load_queries_[custom_emoji_id]; diff --git a/td/telegram/StickersManager.h b/td/telegram/StickersManager.h index efcd510b6..2c0b59610 100644 --- a/td/telegram/StickersManager.h +++ b/td/telegram/StickersManager.h @@ -578,6 +578,8 @@ class StickersManager final : public Actor { static string get_custom_emoji_database_key(int64 custom_emoji_id); + void load_custom_emoji_sticker_from_database_force(int64 custom_emoji_id); + void load_custom_emoji_sticker_from_database(int64 custom_emoji_id, Promise &&promise); void on_load_custom_emoji_from_database(int64 custom_emoji_id, string value);