Improve updating animated emoji stickers.

This commit is contained in:
levlam 2021-10-05 18:06:05 +03:00
parent eb20f82730
commit aae781295c
2 changed files with 65 additions and 54 deletions

View File

@ -1405,16 +1405,15 @@ void StickersManager::on_load_special_sticker_set(const SpecialStickerSetType &t
special_sticker_set.is_being_loaded_ = false;
if (type.type_ == SpecialStickerSetType::animated_emoji()) {
return;
}
CHECK(special_sticker_set.id_.is_valid());
auto sticker_set = get_sticker_set(special_sticker_set.id_);
CHECK(sticker_set != nullptr);
CHECK(sticker_set->was_loaded);
if (type.type_ == SpecialStickerSetType::animated_emoji()) {
try_update_animated_emoji_messages();
return;
}
if (type.type_ == SpecialStickerSetType::animated_emoji_click()) {
auto pending_get_requests = std::move(pending_get_animated_emoji_click_stickers_);
reset_to_empty(pending_get_animated_emoji_click_stickers_);
@ -1904,7 +1903,31 @@ tl_object_ptr<td_api::stickerSetInfo> StickersManager::get_sticker_set_info_obje
std::move(stickers));
}
const StickersManager::StickerSet *StickersManager::get_animated_emoji_sticker_set() {
if (td_->auth_manager_->is_bot() || disable_animated_emojis_) {
return nullptr;
}
auto &special_sticker_set = add_special_sticker_set(SpecialStickerSetType::animated_emoji());
if (!special_sticker_set.id_.is_valid()) {
load_special_sticker_set(special_sticker_set);
return nullptr;
}
auto sticker_set = get_sticker_set(special_sticker_set.id_);
CHECK(sticker_set != nullptr);
if (!sticker_set->was_loaded) {
load_special_sticker_set(special_sticker_set);
return nullptr;
}
return sticker_set;
}
std::pair<FileId, int> StickersManager::get_animated_emoji_sticker(const StickerSet *sticker_set, const string &emoji) {
if (sticker_set == nullptr) {
return {};
}
auto emoji_without_modifiers = remove_emoji_modifiers(emoji).str();
auto it = sticker_set->emoji_stickers_map_.find(emoji_without_modifiers);
if (it == sticker_set->emoji_stickers_map_.end()) {
@ -1937,29 +1960,15 @@ std::pair<FileId, int> StickersManager::get_animated_emoji_sticker(const Sticker
}
std::pair<FileId, int> StickersManager::get_animated_emoji_sticker(const string &emoji) {
if (td_->auth_manager_->is_bot() || disable_animated_emojis_) {
return {};
}
auto &special_sticker_set = add_special_sticker_set(SpecialStickerSetType::animated_emoji());
if (!special_sticker_set.id_.is_valid()) {
load_special_sticker_set(special_sticker_set);
return {};
}
auto sticker_set = get_sticker_set(special_sticker_set.id_);
CHECK(sticker_set != nullptr);
if (!sticker_set->was_loaded) {
load_special_sticker_set(special_sticker_set);
return {};
}
return get_animated_emoji_sticker(sticker_set, emoji);
return get_animated_emoji_sticker(get_animated_emoji_sticker_set(), emoji);
}
td_api::object_ptr<td_api::MessageContent> StickersManager::get_message_content_animated_emoji_object(
const string &emoji) {
auto animated_sticker = get_animated_emoji_sticker(emoji);
if (animated_sticker.first.is_valid() && !disable_animated_emojis_) {
auto it = emoji_messages_.find(emoji);
auto animated_sticker =
it != emoji_messages_.end() ? it->second.animated_emoji_sticker : get_animated_emoji_sticker(emoji);
if (animated_sticker.first.is_valid()) {
return td_api::make_object<td_api::messageAnimatedEmoji>(get_sticker_object(animated_sticker.first), emoji);
}
return td_api::make_object<td_api::messageText>(
@ -2881,6 +2890,11 @@ StickerSetId StickersManager::on_get_messages_sticker_set(StickerSetId sticker_s
update_sticker_set(s);
update_load_requests(s, true, Status::OK());
send_update_installed_sticker_sets();
if (set_id == add_special_sticker_set(SpecialStickerSetType::animated_emoji()).id_) {
try_update_animated_emoji_messages();
}
return set_id;
}
@ -2956,6 +2970,7 @@ void StickersManager::on_get_special_sticker_set(const SpecialStickerSetType &ty
<< ' ' << sticker_set.short_name_);
if (type.type_ == SpecialStickerSetType::animated_emoji()) {
G()->shared_config().set_option_string(PSLICE() << type.type_ << "_name", sticker_set.short_name_);
try_update_animated_emoji_messages();
} else if (!type.get_dice_emoji().empty()) {
sticker_set.is_being_loaded_ = true;
}
@ -4053,16 +4068,17 @@ void StickersManager::on_update_sticker_sets() {
}
void StickersManager::try_update_animated_emoji_messages() {
auto sticker_set = get_animated_emoji_sticker_set();
vector<FullMessageId> full_message_ids;
/*
for (const auto &it : emoji_messages_) {
if (get_animated_emoji_sticker(sticker_set, it.first).first.is_valid()) {
for (auto full_message_id : it.second) {
for (auto &it : emoji_messages_) {
auto new_animated_sticker = get_animated_emoji_sticker(sticker_set, it.first);
if (new_animated_sticker != it.second.animated_emoji_sticker) {
it.second.animated_emoji_sticker = new_animated_sticker;
for (auto full_message_id : it.second.full_message_ids) {
full_message_ids.push_back(full_message_id);
}
}
}
*/
for (auto full_message_id : full_message_ids) {
td_->messages_manager_->on_external_update_message_content(full_message_id);
}
@ -4133,26 +4149,12 @@ void StickersManager::register_emoji(const string &emoji, FullMessageId full_mes
}
LOG(INFO) << "Register emoji " << emoji << " from " << full_message_id << " from " << source;
bool is_inserted = emoji_messages_[emoji].insert(full_message_id).second;
LOG_CHECK(is_inserted) << source << " " << emoji << " " << full_message_id;
auto &special_sticker_set = add_special_sticker_set(SpecialStickerSetType::animated_emoji());
bool need_load = false;
if (!special_sticker_set.id_.is_valid()) {
need_load = true;
} else {
auto sticker_set = get_sticker_set(special_sticker_set.id_);
CHECK(sticker_set != nullptr);
need_load = !sticker_set->was_loaded;
}
if (need_load) {
LOG(INFO) << "Waiting for the animated emoji sticker set needed in " << full_message_id;
load_special_sticker_set(special_sticker_set);
} else {
// TODO reload once in a while
// reload_special_sticker_set(special_sticker_set);
auto &emoji_messages = emoji_messages_[emoji];
if (emoji_messages.full_message_ids.empty()) {
emoji_messages.animated_emoji_sticker = get_animated_emoji_sticker(emoji);
}
bool is_inserted = emoji_messages.full_message_ids.insert(full_message_id).second;
LOG_CHECK(is_inserted) << source << ' ' << emoji << ' ' << full_message_id;
}
void StickersManager::unregister_emoji(const string &emoji, FullMessageId full_message_id, const char *source) {
@ -4162,12 +4164,14 @@ void StickersManager::unregister_emoji(const string &emoji, FullMessageId full_m
}
LOG(INFO) << "Unregister emoji " << emoji << " from " << full_message_id << " from " << source;
auto &message_ids = emoji_messages_[emoji];
auto is_deleted = message_ids.erase(full_message_id) > 0;
LOG_CHECK(is_deleted) << source << " " << emoji << " " << full_message_id;
auto it = emoji_messages_.find(emoji);
CHECK(it != emoji_messages_.end());
auto &full_message_ids = it->second.full_message_ids;
auto is_deleted = full_message_ids.erase(full_message_id) > 0;
LOG_CHECK(is_deleted) << source << ' ' << emoji << ' ' << full_message_id;
if (message_ids.empty()) {
emoji_messages_.erase(emoji);
if (full_message_ids.empty()) {
emoji_messages_.erase(it);
}
}

View File

@ -605,6 +605,8 @@ class StickersManager final : public Actor {
static int get_emoji_number(Slice emoji);
const StickerSet *get_animated_emoji_sticker_set();
static std::pair<FileId, int> get_animated_emoji_sticker(const StickerSet *sticker_set, const string &emoji);
std::pair<FileId, int> get_animated_emoji_sticker(const string &emoji);
@ -809,7 +811,12 @@ class StickersManager final : public Actor {
std::unordered_map<int64, string> emoji_suggestions_urls_;
std::unordered_map<string, std::unordered_set<FullMessageId, FullMessageIdHash>> dice_messages_;
std::unordered_map<string, std::unordered_set<FullMessageId, FullMessageIdHash>> emoji_messages_;
struct EmojiMessages {
std::unordered_set<FullMessageId, FullMessageIdHash> full_message_ids;
std::pair<FileId, int> animated_emoji_sticker;
};
std::unordered_map<string, EmojiMessages> emoji_messages_;
string dice_emojis_str_;
vector<string> dice_emojis_;