Fix updating of Dialog.available_reactions_generation.

This commit is contained in:
levlam 2022-04-11 16:01:30 +03:00
parent 80d57a493f
commit bb8c4ca42c
5 changed files with 37 additions and 9 deletions

View File

@ -5769,6 +5769,10 @@ bool is_active_reaction(Td *td, const string &reaction) {
return td->stickers_manager_->is_active_reaction(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) { 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); send_closure(G()->top_dialog_manager(), &TopDialogManager::on_dialog_used, category, dialog_id, date);
} }

View File

@ -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); 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 on_dialog_used(TopDialogCategory category, DialogId dialog_id, int32 date);
void update_used_hashtags(Td *td, const MessageContent *content); void update_used_hashtags(Td *td, const MessageContent *content);

View File

@ -8123,7 +8123,7 @@ void MessagesManager::set_dialog_available_reactions(Dialog *d, vector<string> &
hide_dialog_message_reactions(d); 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"); on_dialog_updated(d->dialog_id, "set_dialog_available_reactions");
@ -8132,7 +8132,7 @@ void MessagesManager::set_dialog_available_reactions(Dialog *d, vector<string> &
} }
} }
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); CHECK(d != nullptr);
switch (d->dialog_id.get_type()) { switch (d->dialog_id.get_type()) {
case DialogType::Chat: case DialogType::Chat:
@ -8146,11 +8146,17 @@ void MessagesManager::set_dialog_available_reactions_generation(Dialog *d, uint3
break; break;
} }
if (get_active_reactions(d->available_reactions).empty()) { 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 " LOG(INFO) << "Change available reactions generation from " << d->available_reactions_generation << " to "
<< new_generation << " in " << d->dialog_id; << generation << " in " << d->dialog_id;
d->available_reactions_generation = new_generation; d->available_reactions_generation = generation;
} }
void MessagesManager::hide_dialog_message_reactions(Dialog *d) { void MessagesManager::hide_dialog_message_reactions(Dialog *d) {
@ -8200,7 +8206,7 @@ void MessagesManager::set_active_reactions(vector<string> active_reactions) {
if (!old_reactions.empty()) { if (!old_reactions.empty()) {
hide_dialog_message_reactions(d); 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"); on_dialog_updated(d->dialog_id, "set_active_reactions");
} }
send_update_chat_available_reactions(d); 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<MessageId> &message_ids) { void MessagesManager::queue_message_reactions_reload(DialogId dialog_id, const vector<MessageId> &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; auto &message_ids_to_reload = being_reloaded_reactions_[dialog_id].message_ids;
for (auto &message_id : message_ids) { for (auto &message_id : message_ids) {
CHECK(message_id.is_valid()); CHECK(message_id.is_valid());
@ -13004,7 +13011,8 @@ void MessagesManager::init() {
} }
is_inited_ = true; 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(); always_wait_for_mailbox();
@ -23484,7 +23492,7 @@ unique_ptr<MessagesManager::Message> MessagesManager::parse_message(Dialog *d, M
LOG(ERROR) << "Fix available_reactions_generation in " << dialog_id << " from " LOG(ERROR) << "Fix available_reactions_generation in " << dialog_id << " from "
<< d->available_reactions_generation << " to " << m->available_reactions_generation; << d->available_reactions_generation << " to " << m->available_reactions_generation;
hide_dialog_message_reactions(d); 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"); on_dialog_updated(dialog_id, "parse_message");
break; break;
case DialogType::User: case DialogType::User:
@ -37022,6 +37030,19 @@ unique_ptr<MessagesManager::Dialog> MessagesManager::parse_dialog(DialogId dialo
send_get_dialog_query(dialog_id, Auto(), 0, source); 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; return d;
} }

View File

@ -2621,7 +2621,7 @@ class MessagesManager final : public Actor {
void set_dialog_available_reactions(Dialog *d, vector<string> &&available_reactions); void set_dialog_available_reactions(Dialog *d, vector<string> &&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); void hide_dialog_message_reactions(Dialog *d);

View File

@ -26,6 +26,7 @@
#include "td/utils/algorithm.h" #include "td/utils/algorithm.h"
#include "td/utils/buffer.h" #include "td/utils/buffer.h"
#include "td/utils/logging.h" #include "td/utils/logging.h"
#include "td/utils/tl_helpers.h"
namespace td { namespace td {