diff --git a/td/telegram/MessageContent.cpp b/td/telegram/MessageContent.cpp index e60a3a5da..d51f2c8b1 100644 --- a/td/telegram/MessageContent.cpp +++ b/td/telegram/MessageContent.cpp @@ -5769,6 +5769,10 @@ bool is_active_reaction(Td *td, const string &reaction) { return td->stickers_manager_->is_active_reaction(reaction); } +void init_stickers_manager(Td *td) { + td->stickers_manager_->init(); +} + void on_dialog_used(TopDialogCategory category, DialogId dialog_id, int32 date) { send_closure(G()->top_dialog_manager(), &TopDialogManager::on_dialog_used, category, dialog_id, date); } diff --git a/td/telegram/MessageContent.h b/td/telegram/MessageContent.h index a80113cc3..edb52d201 100644 --- a/td/telegram/MessageContent.h +++ b/td/telegram/MessageContent.h @@ -250,6 +250,8 @@ bool is_unsent_animated_emoji_click(Td *td, DialogId dialog_id, const DialogActi bool is_active_reaction(Td *td, const string &reaction); +void init_stickers_manager(Td *td); + void on_dialog_used(TopDialogCategory category, DialogId dialog_id, int32 date); void update_used_hashtags(Td *td, const MessageContent *content); diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 40ba1c984..04a74944b 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -8123,7 +8123,7 @@ void MessagesManager::set_dialog_available_reactions(Dialog *d, vector & hide_dialog_message_reactions(d); } - set_dialog_available_reactions_generation(d, d->available_reactions_generation + 1); + set_dialog_next_available_reactions_generation(d, d->available_reactions_generation); } on_dialog_updated(d->dialog_id, "set_dialog_available_reactions"); @@ -8132,7 +8132,7 @@ void MessagesManager::set_dialog_available_reactions(Dialog *d, vector & } } -void MessagesManager::set_dialog_available_reactions_generation(Dialog *d, uint32 new_generation) { +void MessagesManager::set_dialog_next_available_reactions_generation(Dialog *d, uint32 generation) { CHECK(d != nullptr); switch (d->dialog_id.get_type()) { case DialogType::Chat: @@ -8146,11 +8146,17 @@ void MessagesManager::set_dialog_available_reactions_generation(Dialog *d, uint3 break; } if (get_active_reactions(d->available_reactions).empty()) { - new_generation |= 1; + // 0 -> 1 + // 1 -> 3 + generation = generation + (generation & 1) + 1; + } else { + // 0 -> 2 + // 1 -> 2 + generation = generation - (generation & 1) + 2; } LOG(INFO) << "Change available reactions generation from " << d->available_reactions_generation << " to " - << new_generation << " in " << d->dialog_id; - d->available_reactions_generation = new_generation; + << generation << " in " << d->dialog_id; + d->available_reactions_generation = generation; } void MessagesManager::hide_dialog_message_reactions(Dialog *d) { @@ -8200,7 +8206,7 @@ void MessagesManager::set_active_reactions(vector active_reactions) { if (!old_reactions.empty()) { hide_dialog_message_reactions(d); } - set_dialog_available_reactions_generation(d, d->available_reactions_generation + 1); + set_dialog_next_available_reactions_generation(d, d->available_reactions_generation); on_dialog_updated(d->dialog_id, "set_active_reactions"); } send_update_chat_available_reactions(d); @@ -8313,6 +8319,7 @@ void MessagesManager::queue_message_reactions_reload(FullMessageId full_message_ } void MessagesManager::queue_message_reactions_reload(DialogId dialog_id, const vector &message_ids) { + LOG(INFO) << "Queue reload of reactions in " << message_ids << " in " << dialog_id; auto &message_ids_to_reload = being_reloaded_reactions_[dialog_id].message_ids; for (auto &message_id : message_ids) { CHECK(message_id.is_valid()); @@ -13004,7 +13011,8 @@ void MessagesManager::init() { } is_inited_ = true; - td_->notification_settings_manager_->init(); + td_->notification_settings_manager_->init(); // load scope notification settings + init_stickers_manager(td_); // load available reactions always_wait_for_mailbox(); @@ -23484,7 +23492,7 @@ unique_ptr MessagesManager::parse_message(Dialog *d, M LOG(ERROR) << "Fix available_reactions_generation in " << dialog_id << " from " << d->available_reactions_generation << " to " << m->available_reactions_generation; hide_dialog_message_reactions(d); - set_dialog_available_reactions_generation(d, m->available_reactions_generation + 1); + set_dialog_next_available_reactions_generation(d, m->available_reactions_generation); on_dialog_updated(dialog_id, "parse_message"); break; case DialogType::User: @@ -37022,6 +37030,19 @@ unique_ptr MessagesManager::parse_dialog(DialogId dialo send_get_dialog_query(dialog_id, Auto(), 0, source); } + switch (d->dialog_id.get_type()) { + case DialogType::Chat: + case DialogType::Channel: + if (get_active_reactions(d->available_reactions).empty() != ((d->available_reactions_generation & 1) == 1)) { + set_dialog_next_available_reactions_generation(d.get(), d->available_reactions_generation); + } + break; + case DialogType::User: + case DialogType::SecretChat: + default: + break; + } + return d; } diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 097fd8654..a6791f6f7 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -2621,7 +2621,7 @@ class MessagesManager final : public Actor { void set_dialog_available_reactions(Dialog *d, vector &&available_reactions); - void set_dialog_available_reactions_generation(Dialog *d, uint32 new_generation); + void set_dialog_next_available_reactions_generation(Dialog *d, uint32 generation); void hide_dialog_message_reactions(Dialog *d); diff --git a/td/telegram/NotificationSettingsManager.cpp b/td/telegram/NotificationSettingsManager.cpp index ceb1cf793..4c4baac64 100644 --- a/td/telegram/NotificationSettingsManager.cpp +++ b/td/telegram/NotificationSettingsManager.cpp @@ -26,6 +26,7 @@ #include "td/utils/algorithm.h" #include "td/utils/buffer.h" #include "td/utils/logging.h" +#include "td/utils/tl_helpers.h" namespace td {