From d7d9e50e50f76af90f58cf581af2210decc55f14 Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 22 Nov 2021 17:59:55 +0300 Subject: [PATCH 01/17] Remove legacy know_can_report_spam flag. --- td/telegram/MessagesManager.cpp | 26 ++++++++++++-------------- td/telegram/MessagesManager.h | 3 +-- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 7008ea894..4c87d1ef8 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -5181,10 +5181,10 @@ void MessagesManager::Dialog::store(StorerT &storer) const { BEGIN_STORE_FLAGS(); STORE_FLAG(has_draft_message); STORE_FLAG(has_last_database_message); - STORE_FLAG(know_can_report_spam); + STORE_FLAG(false); // legacy_know_can_report_spam STORE_FLAG(can_report_spam); STORE_FLAG(has_first_database_message_id); - STORE_FLAG(false); + STORE_FLAG(false); // legacy_is_pinned STORE_FLAG(has_first_database_message_id_by_index); STORE_FLAG(has_message_count_by_index); STORE_FLAG(has_client_data); @@ -5358,6 +5358,7 @@ void MessagesManager::Dialog::parse(ParserT &parser) { using td::parse; bool has_draft_message; bool has_last_database_message; + bool legacy_know_can_report_spam; bool has_first_database_message_id; bool legacy_is_pinned; bool has_first_database_message_id_by_index; @@ -5388,7 +5389,7 @@ void MessagesManager::Dialog::parse(ParserT &parser) { BEGIN_PARSE_FLAGS(); PARSE_FLAG(has_draft_message); PARSE_FLAG(has_last_database_message); - PARSE_FLAG(know_can_report_spam); + PARSE_FLAG(legacy_know_can_report_spam); PARSE_FLAG(can_report_spam); PARSE_FLAG(has_first_database_message_id); PARSE_FLAG(legacy_is_pinned); @@ -5612,6 +5613,9 @@ void MessagesManager::Dialog::parse(ParserT &parser) { parse(pending_join_request_count, parser); parse(pending_join_request_user_ids, parser); } + if (legacy_know_can_report_spam && !know_action_bar) { + can_report_spam = false; + } } template @@ -7936,7 +7940,7 @@ void MessagesManager::hide_dialog_action_bar(DialogId dialog_id) { void MessagesManager::hide_dialog_action_bar(Dialog *d) { CHECK(d->dialog_id.get_type() != DialogType::SecretChat); - if (!d->know_can_report_spam) { + if (!d->know_action_bar) { return; } if (!d->can_report_spam && !d->can_add_contact && !d->can_block_user && !d->can_share_phone_number && @@ -7976,10 +7980,9 @@ void MessagesManager::remove_dialog_action_bar(DialogId dialog_id, Promise } } - if (!d->know_can_report_spam) { + if (!d->know_action_bar) { return promise.set_error(Status::Error(400, "Can't update chat action bar")); } - if (!d->can_report_spam && !d->can_add_contact && !d->can_block_user && !d->can_share_phone_number && !d->can_report_location && !d->can_unarchive && d->distance < 0 && !d->can_invite_members) { return promise.set_value(Unit()); @@ -8120,10 +8123,10 @@ void MessagesManager::report_dialog(DialogId dialog_id, const vector return promise.set_error(Status::Error(400, "Chat with the user not found")); } - is_dialog_spam_report = user_d->know_can_report_spam; + is_dialog_spam_report = user_d->know_action_bar; can_report_spam = user_d->can_report_spam; } else { - is_dialog_spam_report = d->know_can_report_spam; + is_dialog_spam_report = d->know_action_bar; } } @@ -8212,15 +8215,13 @@ void MessagesManager::on_get_peer_settings(DialogId dialog_id, d->can_block_user == can_block_user && d->can_share_phone_number == can_share_phone_number && d->can_report_location == can_report_location && d->can_unarchive == can_unarchive && d->distance == distance && d->can_invite_members == can_invite_members) { - if (!d->know_action_bar || !d->know_can_report_spam) { - d->know_can_report_spam = true; + if (!d->know_action_bar) { d->know_action_bar = true; on_dialog_updated(d->dialog_id, "on_get_peer_settings"); } return; } - d->know_can_report_spam = true; d->know_action_bar = true; d->can_report_spam = can_report_spam; d->can_add_contact = can_add_contact; @@ -20102,9 +20103,6 @@ td_api::object_ptr MessagesManager::get_chat_action_bar_o } if (!d->know_action_bar) { - if (d->know_can_report_spam && d->dialog_id.get_type() != DialogType::SecretChat && d->can_report_spam) { - return td_api::make_object(false); - } return nullptr; } diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 087837efd..209718ad3 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -1230,9 +1230,8 @@ class MessagesManager final : public Actor { bool is_last_message_deleted_locally = false; - bool know_can_report_spam = false; - bool can_report_spam = false; bool know_action_bar = false; + bool can_report_spam = false; bool can_add_contact = false; bool can_block_user = false; bool can_share_phone_number = false; From d160a77222d0aae96e66fe04d55296f85f793f01 Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 22 Nov 2021 20:13:55 +0300 Subject: [PATCH 02/17] Add separate flag for need_repair_action_bar. --- td/telegram/MessagesManager.cpp | 43 ++++++++++++++++++++++++++------- td/telegram/MessagesManager.h | 3 ++- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 4c87d1ef8..9cb7726b9 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -5250,6 +5250,7 @@ void MessagesManager::Dialog::store(StorerT &storer) const { if (has_flags3) { BEGIN_STORE_FLAGS(); STORE_FLAG(has_pending_join_requests); + STORE_FLAG(need_repair_action_bar); END_STORE_FLAGS(); } @@ -5480,7 +5481,10 @@ void MessagesManager::Dialog::parse(ParserT &parser) { if (has_flags3) { BEGIN_PARSE_FLAGS(); PARSE_FLAG(has_pending_join_requests); + PARSE_FLAG(need_repair_action_bar); END_PARSE_FLAGS(); + } else { + need_repair_action_bar = false; } parse(last_new_message_id, parser); @@ -7890,11 +7894,21 @@ bool MessagesManager::update_dialog_silent_send_message(Dialog *d, bool silent_s return true; } -void MessagesManager::reget_dialog_action_bar(DialogId dialog_id, const char *source) { +void MessagesManager::reget_dialog_action_bar(DialogId dialog_id, const char *source, bool is_repair) { if (G()->close_flag() || !dialog_id.is_valid() || td_->auth_manager_->is_bot()) { return; } + Dialog *d = get_dialog_force(dialog_id, source); + if (d == nullptr) { + return; + } + + if (is_repair && !d->need_repair_action_bar) { + d->need_repair_action_bar = true; + on_dialog_updated(dialog_id, source); + } + LOG(INFO) << "Reget action bar in " << dialog_id << " from " << source; switch (dialog_id.get_type()) { case DialogType::User: @@ -7917,12 +7931,12 @@ void MessagesManager::reget_dialog_action_bar(DialogId dialog_id, const char *so void MessagesManager::repair_dialog_action_bar(Dialog *d, const char *source) { CHECK(d != nullptr); auto dialog_id = d->dialog_id; - d->know_action_bar = false; + d->need_repair_action_bar = true; if (have_input_peer(dialog_id, AccessRights::Read)) { create_actor( "RepairChatActionBarActor", 1.0, PromiseCreator::lambda([actor_id = actor_id(this), dialog_id, source](Result result) { - send_closure(actor_id, &MessagesManager::reget_dialog_action_bar, dialog_id, source); + send_closure(actor_id, &MessagesManager::reget_dialog_action_bar, dialog_id, source, true); })) .release(); } @@ -7943,6 +7957,10 @@ void MessagesManager::hide_dialog_action_bar(Dialog *d) { if (!d->know_action_bar) { return; } + if (d->need_repair_action_bar) { + d->need_repair_action_bar = false; + on_dialog_updated(d->dialog_id, "hide_dialog_action_bar"); + } if (!d->can_report_spam && !d->can_add_contact && !d->can_block_user && !d->can_share_phone_number && !d->can_report_location && !d->can_unarchive && d->distance < 0 && !d->can_invite_members) { return; @@ -7983,6 +8001,10 @@ void MessagesManager::remove_dialog_action_bar(DialogId dialog_id, Promise if (!d->know_action_bar) { return promise.set_error(Status::Error(400, "Can't update chat action bar")); } + if (d->need_repair_action_bar) { + d->need_repair_action_bar = false; + on_dialog_updated(dialog_id, "remove_dialog_action_bar"); + } if (!d->can_report_spam && !d->can_add_contact && !d->can_block_user && !d->can_share_phone_number && !d->can_report_location && !d->can_unarchive && d->distance < 0 && !d->can_invite_members) { return promise.set_value(Unit()); @@ -8215,14 +8237,16 @@ void MessagesManager::on_get_peer_settings(DialogId dialog_id, d->can_block_user == can_block_user && d->can_share_phone_number == can_share_phone_number && d->can_report_location == can_report_location && d->can_unarchive == can_unarchive && d->distance == distance && d->can_invite_members == can_invite_members) { - if (!d->know_action_bar) { + if (!d->know_action_bar || d->need_repair_action_bar) { d->know_action_bar = true; + d->need_repair_action_bar = false; on_dialog_updated(d->dialog_id, "on_get_peer_settings"); } return; } d->know_action_bar = true; + d->need_repair_action_bar = false; d->can_report_spam = can_report_spam; d->can_add_contact = can_add_contact; d->can_block_user = can_block_user; @@ -19936,7 +19960,7 @@ void MessagesManager::open_dialog(Dialog *d) { break; case DialogType::Chat: td_->contacts_manager_->repair_chat_participants(dialog_id.get_chat_id()); - reget_dialog_action_bar(dialog_id, "open_dialog"); + reget_dialog_action_bar(dialog_id, "open_dialog", false); break; case DialogType::Channel: if (!is_broadcast_channel(dialog_id)) { @@ -19948,7 +19972,7 @@ void MessagesManager::open_dialog(Dialog *d) { } } get_channel_difference(dialog_id, d->pts, true, "open_dialog"); - reget_dialog_action_bar(dialog_id, "open_dialog"); + reget_dialog_action_bar(dialog_id, "open_dialog", false); break; case DialogType::SecretChat: { // to repair dialog action bar @@ -34511,10 +34535,11 @@ void MessagesManager::fix_new_dialog(Dialog *d, unique_ptr &&last_datab // asynchronously get dialog message TTL setting from the server get_dialog_info_full(dialog_id, Auto(), "fix_new_dialog init message_ttl_setting"); } - if (!d->know_action_bar && !td_->auth_manager_->is_bot() && dialog_type != DialogType::SecretChat && - dialog_id != get_my_dialog_id() && have_input_peer(dialog_id, AccessRights::Read)) { + if ((!d->know_action_bar || d->need_repair_action_bar) && !td_->auth_manager_->is_bot() && + dialog_type != DialogType::SecretChat && dialog_id != get_my_dialog_id() && + have_input_peer(dialog_id, AccessRights::Read)) { // asynchronously get action bar from the server - reget_dialog_action_bar(dialog_id, "fix_new_dialog"); + reget_dialog_action_bar(dialog_id, "fix_new_dialog", false); } if (d->has_active_group_call && !d->active_group_call_id.is_valid() && !td_->auth_manager_->is_bot()) { repair_dialog_active_group_call_id(dialog_id); diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 209718ad3..0aede562b 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -804,7 +804,7 @@ class MessagesManager final : public Actor { void remove_dialog_action_bar(DialogId dialog_id, Promise &&promise); - void reget_dialog_action_bar(DialogId dialog_id, const char *source); + void reget_dialog_action_bar(DialogId dialog_id, const char *source, bool is_repair = true); void report_dialog(DialogId dialog_id, const vector &message_ids, ReportReason &&reason, Promise &&promise); @@ -1230,6 +1230,7 @@ class MessagesManager final : public Actor { bool is_last_message_deleted_locally = false; + bool need_repair_action_bar = false; bool know_action_bar = false; bool can_report_spam = false; bool can_add_contact = false; From f4d62f9ca427571990f117f16ddfe488a646d16f Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 22 Nov 2021 22:39:59 +0300 Subject: [PATCH 03/17] Add struct DialogActionBar. --- td/telegram/MessagesManager.cpp | 387 +++++++++++++++++--------------- td/telegram/MessagesManager.h | 28 ++- 2 files changed, 224 insertions(+), 191 deletions(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 9cb7726b9..ff306cd2f 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -5169,7 +5169,7 @@ void MessagesManager::Dialog::store(StorerT &storer) const { max_notification_message_id.is_valid() && max_notification_message_id > last_new_message_id; bool has_folder_id = folder_id != FolderId(); bool has_pending_read_channel_inbox = pending_read_channel_inbox_pts != 0; - bool has_distance = distance >= 0; + bool action_bar_has_distance = action_bar == nullptr ? false : action_bar->distance >= 0; bool has_last_yet_unsent_message = last_message_id.is_valid() && last_message_id.is_yet_unsent(); bool has_active_group_call_id = active_group_call_id.is_valid(); bool has_message_ttl_setting = !message_ttl_setting.is_empty(); @@ -5182,7 +5182,7 @@ void MessagesManager::Dialog::store(StorerT &storer) const { STORE_FLAG(has_draft_message); STORE_FLAG(has_last_database_message); STORE_FLAG(false); // legacy_know_can_report_spam - STORE_FLAG(can_report_spam); + STORE_FLAG(action_bar == nullptr ? false : action_bar->can_report_spam); STORE_FLAG(has_first_database_message_id); STORE_FLAG(false); // legacy_is_pinned STORE_FLAG(has_first_database_message_id_by_index); @@ -5220,15 +5220,15 @@ void MessagesManager::Dialog::store(StorerT &storer) const { STORE_FLAG(is_folder_id_inited); STORE_FLAG(has_pending_read_channel_inbox); STORE_FLAG(know_action_bar); - STORE_FLAG(can_add_contact); - STORE_FLAG(can_block_user); - STORE_FLAG(can_share_phone_number); - STORE_FLAG(can_report_location); + STORE_FLAG(action_bar == nullptr ? false : action_bar->can_add_contact); + STORE_FLAG(action_bar == nullptr ? false : action_bar->can_block_user); + STORE_FLAG(action_bar == nullptr ? false : action_bar->can_share_phone_number); + STORE_FLAG(action_bar == nullptr ? false : action_bar->can_report_location); STORE_FLAG(has_scheduled_server_messages); STORE_FLAG(has_scheduled_database_messages); STORE_FLAG(need_repair_channel_server_unread_count); - STORE_FLAG(can_unarchive); - STORE_FLAG(has_distance); + STORE_FLAG(action_bar == nullptr ? false : action_bar->can_unarchive); + STORE_FLAG(action_bar_has_distance); STORE_FLAG(hide_distance); STORE_FLAG(has_last_yet_unsent_message); STORE_FLAG(is_blocked); @@ -5236,7 +5236,7 @@ void MessagesManager::Dialog::store(StorerT &storer) const { STORE_FLAG(has_active_group_call); STORE_FLAG(is_group_call_empty); STORE_FLAG(has_active_group_call_id); - STORE_FLAG(can_invite_members); + STORE_FLAG(action_bar == nullptr ? false : action_bar->can_invite_members); STORE_FLAG(has_message_ttl_setting); STORE_FLAG(is_message_ttl_setting_inited); STORE_FLAG(has_default_join_group_call_as_dialog_id); @@ -5332,8 +5332,8 @@ void MessagesManager::Dialog::store(StorerT &storer) const { store(pending_read_channel_inbox_max_message_id, storer); store(pending_read_channel_inbox_server_unread_count, storer); } - if (has_distance) { - store(distance, storer); + if (action_bar_has_distance) { + store(action_bar->distance, storer); } if (has_active_group_call_id) { store(active_group_call_id, storer); @@ -5380,18 +5380,25 @@ void MessagesManager::Dialog::parse(ParserT &parser) { bool has_max_notification_message_id = false; bool has_folder_id = false; bool has_pending_read_channel_inbox = false; - bool has_distance = false; bool has_active_group_call_id = false; bool has_message_ttl_setting = false; bool has_default_join_group_call_as_dialog_id = false; bool has_theme_name = false; bool has_flags3 = false; bool has_pending_join_requests = false; + bool action_bar_can_report_spam = false; + bool action_bar_can_add_contact = false; + bool action_bar_can_block_user = false; + bool action_bar_can_share_phone_number = false; + bool action_bar_can_report_location = false; + bool action_bar_can_unarchive = false; + bool action_bar_has_distance = false; + bool action_bar_can_invite_members = false; BEGIN_PARSE_FLAGS(); PARSE_FLAG(has_draft_message); PARSE_FLAG(has_last_database_message); PARSE_FLAG(legacy_know_can_report_spam); - PARSE_FLAG(can_report_spam); + PARSE_FLAG(action_bar_can_report_spam); PARSE_FLAG(has_first_database_message_id); PARSE_FLAG(legacy_is_pinned); PARSE_FLAG(has_first_database_message_id_by_index); @@ -5429,15 +5436,15 @@ void MessagesManager::Dialog::parse(ParserT &parser) { PARSE_FLAG(is_folder_id_inited); PARSE_FLAG(has_pending_read_channel_inbox); PARSE_FLAG(know_action_bar); - PARSE_FLAG(can_add_contact); - PARSE_FLAG(can_block_user); - PARSE_FLAG(can_share_phone_number); - PARSE_FLAG(can_report_location); + PARSE_FLAG(action_bar_can_add_contact); + PARSE_FLAG(action_bar_can_block_user); + PARSE_FLAG(action_bar_can_share_phone_number); + PARSE_FLAG(action_bar_can_report_location); PARSE_FLAG(has_scheduled_server_messages); PARSE_FLAG(has_scheduled_database_messages); PARSE_FLAG(need_repair_channel_server_unread_count); - PARSE_FLAG(can_unarchive); - PARSE_FLAG(has_distance); + PARSE_FLAG(action_bar_can_unarchive); + PARSE_FLAG(action_bar_has_distance); PARSE_FLAG(hide_distance); PARSE_FLAG(had_last_yet_unsent_message); PARSE_FLAG(is_blocked); @@ -5445,7 +5452,7 @@ void MessagesManager::Dialog::parse(ParserT &parser) { PARSE_FLAG(has_active_group_call); PARSE_FLAG(is_group_call_empty); PARSE_FLAG(has_active_group_call_id); - PARSE_FLAG(can_invite_members); + PARSE_FLAG(action_bar_can_invite_members); PARSE_FLAG(has_message_ttl_setting); PARSE_FLAG(is_message_ttl_setting_inited); PARSE_FLAG(has_default_join_group_call_as_dialog_id); @@ -5457,22 +5464,15 @@ void MessagesManager::Dialog::parse(ParserT &parser) { END_PARSE_FLAGS(); } else { is_folder_id_inited = false; - know_action_bar = false; - can_add_contact = false; - can_block_user = false; - can_share_phone_number = false; - can_report_location = false; has_scheduled_server_messages = false; has_scheduled_database_messages = false; need_repair_channel_server_unread_count = false; - can_unarchive = false; hide_distance = false; had_last_yet_unsent_message = false; is_blocked = false; is_is_blocked_inited = false; has_active_group_call = false; is_group_call_empty = false; - can_invite_members = false; is_message_ttl_setting_inited = false; has_bots = false; is_has_bots_inited = false; @@ -5598,8 +5598,9 @@ void MessagesManager::Dialog::parse(ParserT &parser) { parse(pending_read_channel_inbox_max_message_id, parser); parse(pending_read_channel_inbox_server_unread_count, parser); } - if (has_distance) { - parse(distance, parser); + int32 action_bar_distance = -1; + if (action_bar_has_distance) { + parse(action_bar_distance, parser); } if (has_active_group_call_id) { parse(active_group_call_id, parser); @@ -5618,7 +5619,13 @@ void MessagesManager::Dialog::parse(ParserT &parser) { parse(pending_join_request_user_ids, parser); } if (legacy_know_can_report_spam && !know_action_bar) { - can_report_spam = false; + action_bar_can_report_spam = false; + } + if (know_action_bar) { + action_bar = + create_action_bar(action_bar_can_report_spam, action_bar_can_add_contact, action_bar_can_block_user, + action_bar_can_share_phone_number, action_bar_can_report_location, action_bar_can_unarchive, + hide_distance ? -1 : action_bar_distance, action_bar_can_invite_members); } } @@ -7961,19 +7968,11 @@ void MessagesManager::hide_dialog_action_bar(Dialog *d) { d->need_repair_action_bar = false; on_dialog_updated(d->dialog_id, "hide_dialog_action_bar"); } - if (!d->can_report_spam && !d->can_add_contact && !d->can_block_user && !d->can_share_phone_number && - !d->can_report_location && !d->can_unarchive && d->distance < 0 && !d->can_invite_members) { + if (d->action_bar == nullptr) { return; } - d->can_report_spam = false; - d->can_add_contact = false; - d->can_block_user = false; - d->can_share_phone_number = false; - d->can_report_location = false; - d->can_unarchive = false; - d->distance = -1; - d->can_invite_members = false; + d->action_bar = nullptr; send_update_chat_action_bar(d); } @@ -8005,12 +8004,12 @@ void MessagesManager::remove_dialog_action_bar(DialogId dialog_id, Promise d->need_repair_action_bar = false; on_dialog_updated(dialog_id, "remove_dialog_action_bar"); } - if (!d->can_report_spam && !d->can_add_contact && !d->can_block_user && !d->can_share_phone_number && - !d->can_report_location && !d->can_unarchive && d->distance < 0 && !d->can_invite_members) { + if (d->action_bar == nullptr) { return promise.set_value(Unit()); } - hide_dialog_action_bar(d); + d->action_bar = nullptr; + send_update_chat_action_bar(d); toggle_dialog_report_spam_state_on_server(dialog_id, false, 0, std::move(promise)); } @@ -8135,7 +8134,7 @@ void MessagesManager::report_dialog(DialogId dialog_id, const vector Dialog *user_d = d; bool is_dialog_spam_report = false; - bool can_report_spam = d->can_report_spam; + bool can_report_spam = false; if (reason.is_spam() && message_ids.empty()) { // report from action bar if (dialog_id.get_type() == DialogType::SecretChat) { @@ -8144,12 +8143,9 @@ void MessagesManager::report_dialog(DialogId dialog_id, const vector if (user_d == nullptr) { return promise.set_error(Status::Error(400, "Chat with the user not found")); } - - is_dialog_spam_report = user_d->know_action_bar; - can_report_spam = user_d->can_report_spam; - } else { - is_dialog_spam_report = d->know_action_bar; } + is_dialog_spam_report = user_d->know_action_bar; + can_report_spam = user_d->action_bar != nullptr && user_d->action_bar->can_report_spam; } if (is_dialog_spam_report && can_report_spam) { @@ -8210,6 +8206,40 @@ void MessagesManager::report_dialog_photo(DialogId dialog_id, FileId file_id, Re ->send(dialog_id, file_id, file_view.remote_location().as_input_photo(), std::move(reason)); } +unique_ptr MessagesManager::create_action_bar( + bool can_report_spam, bool can_add_contact, bool can_block_user, bool can_share_phone_number, + bool can_report_location, bool can_unarchive, int32 distance, bool can_invite_members) { + if (!can_report_spam && !can_add_contact && !can_block_user && !can_share_phone_number && !can_report_location && + !can_unarchive && distance < 0 && !can_invite_members) { + return nullptr; + } + + auto action_bar = td::make_unique(); + action_bar->can_report_spam = can_report_spam; + action_bar->can_add_contact = can_add_contact; + action_bar->can_block_user = can_block_user; + action_bar->can_share_phone_number = can_share_phone_number; + action_bar->can_report_location = can_report_location; + action_bar->can_unarchive = can_unarchive; + action_bar->distance = distance >= 0 ? distance : -1; + action_bar->can_invite_members = can_invite_members; + return action_bar; +} + +bool MessagesManager::cmp_dialog_action_bar(const unique_ptr &lhs, + const unique_ptr &rhs) { + if (lhs == nullptr) { + return rhs == nullptr; + } + if (rhs == nullptr) { + return false; + } + return lhs->can_report_spam == rhs->can_report_spam && lhs->can_add_contact == rhs->can_add_contact && + lhs->can_block_user == rhs->can_block_user && lhs->can_share_phone_number == rhs->can_share_phone_number && + lhs->can_report_location == rhs->can_report_location && lhs->can_unarchive == rhs->can_unarchive && + lhs->distance == rhs->distance && lhs->can_invite_members == rhs->can_invite_members; +} + void MessagesManager::on_get_peer_settings(DialogId dialog_id, tl_object_ptr &&peer_settings, bool ignore_privacy_exception) { @@ -8224,19 +8254,17 @@ void MessagesManager::on_get_peer_settings(DialogId dialog_id, return; } - auto can_report_spam = peer_settings->report_spam_; - auto can_add_contact = peer_settings->add_contact_; - auto can_block_user = peer_settings->block_contact_; - auto can_share_phone_number = peer_settings->share_contact_; - auto can_report_location = peer_settings->report_geo_; - auto can_unarchive = peer_settings->autoarchived_; auto distance = (peer_settings->flags_ & telegram_api::peerSettings::GEO_DISTANCE_MASK) != 0 ? peer_settings->geo_distance_ : -1; - auto can_invite_members = peer_settings->invite_members_; - if (d->can_report_spam == can_report_spam && d->can_add_contact == can_add_contact && - d->can_block_user == can_block_user && d->can_share_phone_number == can_share_phone_number && - d->can_report_location == can_report_location && d->can_unarchive == can_unarchive && d->distance == distance && - d->can_invite_members == can_invite_members) { + if (distance < -1 || d->hide_distance) { + distance = -1; + } + auto action_bar = + create_action_bar(peer_settings->report_spam_, peer_settings->add_contact_, peer_settings->block_contact_, + peer_settings->share_contact_, peer_settings->report_geo_, peer_settings->autoarchived_, + distance, peer_settings->invite_members_); + + if (cmp_dialog_action_bar(d->action_bar, action_bar)) { if (!d->know_action_bar || d->need_repair_action_bar) { d->know_action_bar = true; d->need_repair_action_bar = false; @@ -8247,14 +8275,7 @@ void MessagesManager::on_get_peer_settings(DialogId dialog_id, d->know_action_bar = true; d->need_repair_action_bar = false; - d->can_report_spam = can_report_spam; - d->can_add_contact = can_add_contact; - d->can_block_user = can_block_user; - d->can_share_phone_number = can_share_phone_number; - d->can_report_location = can_report_location; - d->can_unarchive = can_unarchive; - d->distance = distance < 0 ? -1 : distance; - d->can_invite_members = can_invite_members; + d->action_bar = std::move(action_bar); fix_dialog_action_bar(d); @@ -8263,48 +8284,51 @@ void MessagesManager::on_get_peer_settings(DialogId dialog_id, void MessagesManager::fix_dialog_action_bar(Dialog *d) { CHECK(d != nullptr); - if (!d->know_action_bar) { + auto action_bar = d->action_bar.get(); + if (action_bar == nullptr) { return; } auto dialog_type = d->dialog_id.get_type(); - if (d->distance >= 0 && dialog_type != DialogType::User) { - LOG(ERROR) << "Receive distance " << d->distance << " to " << d->dialog_id; - d->distance = -1; + if (action_bar->distance >= 0 && dialog_type != DialogType::User) { + LOG(ERROR) << "Receive distance " << action_bar->distance << " to " << d->dialog_id; + action_bar->distance = -1; } - if (d->can_report_location) { + if (action_bar->can_report_location) { if (dialog_type != DialogType::Channel) { LOG(ERROR) << "Receive can_report_location in " << d->dialog_id; - d->can_report_location = false; - } else if (d->can_report_spam || d->can_add_contact || d->can_block_user || d->can_share_phone_number || - d->can_unarchive || d->can_invite_members) { - LOG(ERROR) << "Receive action bar " << d->can_report_spam << "/" << d->can_add_contact << "/" << d->can_block_user - << "/" << d->can_share_phone_number << "/" << d->can_report_location << "/" << d->can_unarchive << "/" - << d->can_invite_members; - d->can_report_spam = false; - d->can_add_contact = false; - d->can_block_user = false; - d->can_share_phone_number = false; - d->can_unarchive = false; - d->can_invite_members = false; - CHECK(d->distance == -1); + action_bar->can_report_location = false; + } else if (action_bar->can_report_spam || action_bar->can_add_contact || action_bar->can_block_user || + action_bar->can_share_phone_number || action_bar->can_unarchive || action_bar->can_invite_members) { + LOG(ERROR) << "Receive action bar " << action_bar->can_report_spam << "/" << action_bar->can_add_contact << "/" + << action_bar->can_block_user << "/" << action_bar->can_share_phone_number << "/" + << action_bar->can_report_location << "/" << action_bar->can_unarchive << "/" + << action_bar->can_invite_members; + action_bar->can_report_spam = false; + action_bar->can_add_contact = false; + action_bar->can_block_user = false; + action_bar->can_share_phone_number = false; + action_bar->can_unarchive = false; + action_bar->can_invite_members = false; + CHECK(action_bar->distance == -1); } } - if (d->can_invite_members) { + if (action_bar->can_invite_members) { if (dialog_type != DialogType::Chat && (dialog_type != DialogType::Channel || is_broadcast_channel(d->dialog_id))) { LOG(ERROR) << "Receive can_invite_members in " << d->dialog_id; - d->can_invite_members = false; - } else if (d->can_report_spam || d->can_add_contact || d->can_block_user || d->can_share_phone_number || - d->can_unarchive) { - LOG(ERROR) << "Receive action bar " << d->can_report_spam << "/" << d->can_add_contact << "/" << d->can_block_user - << "/" << d->can_share_phone_number << "/" << d->can_unarchive << "/" << d->can_invite_members; - d->can_report_spam = false; - d->can_add_contact = false; - d->can_block_user = false; - d->can_share_phone_number = false; - d->can_unarchive = false; - CHECK(d->distance == -1); + action_bar->can_invite_members = false; + } else if (action_bar->can_report_spam || action_bar->can_add_contact || action_bar->can_block_user || + action_bar->can_share_phone_number || action_bar->can_unarchive) { + LOG(ERROR) << "Receive action bar " << action_bar->can_report_spam << "/" << action_bar->can_add_contact << "/" + << action_bar->can_block_user << "/" << action_bar->can_share_phone_number << "/" + << action_bar->can_unarchive << "/" << action_bar->can_invite_members; + action_bar->can_report_spam = false; + action_bar->can_add_contact = false; + action_bar->can_block_user = false; + action_bar->can_share_phone_number = false; + action_bar->can_unarchive = false; + CHECK(action_bar->distance == -1); } } if (dialog_type == DialogType::User) { @@ -8314,69 +8338,71 @@ void MessagesManager::fix_dialog_action_bar(Dialog *d) { bool is_deleted = td_->contacts_manager_->is_user_deleted(user_id); bool is_contact = td_->contacts_manager_->is_user_contact(user_id); if (is_me || is_blocked) { - d->can_report_spam = false; - d->can_unarchive = false; + action_bar->can_report_spam = false; + action_bar->can_unarchive = false; } if (is_me || is_blocked || is_deleted) { - d->can_share_phone_number = false; + action_bar->can_share_phone_number = false; } if (is_me || is_blocked || is_deleted || is_contact) { - d->can_block_user = false; - d->can_add_contact = false; + action_bar->can_block_user = false; + action_bar->can_add_contact = false; } } if (d->folder_id != FolderId::archive()) { - d->can_unarchive = false; + action_bar->can_unarchive = false; } - if (d->can_share_phone_number) { - CHECK(!d->can_report_location); - CHECK(!d->can_invite_members); + if (action_bar->can_share_phone_number) { + CHECK(!action_bar->can_report_location); + CHECK(!action_bar->can_invite_members); if (dialog_type != DialogType::User) { LOG(ERROR) << "Receive can_share_phone_number in " << d->dialog_id; - d->can_share_phone_number = false; - } else if (d->can_report_spam || d->can_add_contact || d->can_block_user || d->can_unarchive || d->distance >= 0) { - LOG(ERROR) << "Receive action bar " << d->can_report_spam << "/" << d->can_add_contact << "/" << d->can_block_user - << "/" << d->can_share_phone_number << "/" << d->can_unarchive << "/" << d->distance; - d->can_report_spam = false; - d->can_add_contact = false; - d->can_block_user = false; - d->can_unarchive = false; + action_bar->can_share_phone_number = false; + } else if (action_bar->can_report_spam || action_bar->can_add_contact || action_bar->can_block_user || + action_bar->can_unarchive || action_bar->distance >= 0) { + LOG(ERROR) << "Receive action bar " << action_bar->can_report_spam << "/" << action_bar->can_add_contact << "/" + << action_bar->can_block_user << "/" << action_bar->can_share_phone_number << "/" + << action_bar->can_unarchive << "/" << action_bar->distance; + action_bar->can_report_spam = false; + action_bar->can_add_contact = false; + action_bar->can_block_user = false; + action_bar->can_unarchive = false; } } - if (d->can_block_user) { - CHECK(!d->can_report_location); - CHECK(!d->can_invite_members); - CHECK(!d->can_share_phone_number); + if (action_bar->can_block_user) { + CHECK(!action_bar->can_report_location); + CHECK(!action_bar->can_invite_members); + CHECK(!action_bar->can_share_phone_number); if (dialog_type != DialogType::User) { LOG(ERROR) << "Receive can_block_user in " << d->dialog_id; - d->can_block_user = false; - } else if (!d->can_report_spam || !d->can_add_contact) { - LOG(ERROR) << "Receive action bar " << d->can_report_spam << "/" << d->can_add_contact << "/" - << d->can_block_user; - d->can_report_spam = true; - d->can_add_contact = true; + action_bar->can_block_user = false; + } else if (!action_bar->can_report_spam || !action_bar->can_add_contact) { + LOG(ERROR) << "Receive action bar " << action_bar->can_report_spam << "/" << action_bar->can_add_contact << "/" + << action_bar->can_block_user; + action_bar->can_report_spam = true; + action_bar->can_add_contact = true; } } - if (d->can_add_contact) { - CHECK(!d->can_report_location); - CHECK(!d->can_invite_members); - CHECK(!d->can_share_phone_number); + if (action_bar->can_add_contact) { + CHECK(!action_bar->can_report_location); + CHECK(!action_bar->can_invite_members); + CHECK(!action_bar->can_share_phone_number); if (dialog_type != DialogType::User) { LOG(ERROR) << "Receive can_add_contact in " << d->dialog_id; - d->can_add_contact = false; - } else if (d->can_report_spam != d->can_block_user) { - LOG(ERROR) << "Receive action bar " << d->can_report_spam << "/" << d->can_add_contact << "/" - << d->can_block_user; - d->can_report_spam = false; - d->can_block_user = false; - d->can_unarchive = false; + action_bar->can_add_contact = false; + } else if (action_bar->can_report_spam != action_bar->can_block_user) { + LOG(ERROR) << "Receive action bar " << action_bar->can_report_spam << "/" << action_bar->can_add_contact << "/" + << action_bar->can_block_user; + action_bar->can_report_spam = false; + action_bar->can_block_user = false; + action_bar->can_unarchive = false; } } - if (!d->can_block_user) { - d->distance = -1; + if (!action_bar->can_block_user) { + action_bar->distance = -1; } - if (!d->can_report_spam) { - d->can_unarchive = false; + if (!action_bar->can_report_spam) { + action_bar->can_unarchive = false; } } @@ -20126,45 +20152,46 @@ td_api::object_ptr MessagesManager::get_chat_action_bar_o return get_chat_action_bar_object(user_d, d->folder_id != FolderId::archive()); } - if (!d->know_action_bar) { + auto action_bar = d->action_bar.get(); + if (action_bar == nullptr) { return nullptr; } - if (d->can_report_location) { + if (action_bar->can_report_location) { CHECK(d->dialog_id.get_type() == DialogType::Channel); - CHECK(!d->can_share_phone_number && !d->can_block_user && !d->can_add_contact && !d->can_report_spam && - !d->can_invite_members); + CHECK(!action_bar->can_share_phone_number && !action_bar->can_block_user && !action_bar->can_add_contact && + !action_bar->can_report_spam && !action_bar->can_invite_members); return td_api::make_object(); } - if (d->can_invite_members) { - CHECK(!d->can_share_phone_number && !d->can_block_user && !d->can_add_contact && !d->can_report_spam); + if (action_bar->can_invite_members) { + CHECK(!action_bar->can_share_phone_number && !action_bar->can_block_user && !action_bar->can_add_contact && + !action_bar->can_report_spam); return td_api::make_object(); } - if (d->can_share_phone_number) { + if (action_bar->can_share_phone_number) { CHECK(d->dialog_id.get_type() == DialogType::User); - CHECK(!d->can_block_user && !d->can_add_contact && !d->can_report_spam); + CHECK(!action_bar->can_block_user && !action_bar->can_add_contact && !action_bar->can_report_spam); return td_api::make_object(); } if (hide_unarchive) { - if (d->can_add_contact) { + if (action_bar->can_add_contact) { return td_api::make_object(); } else { return nullptr; } } - if (d->can_block_user) { + if (action_bar->can_block_user) { CHECK(d->dialog_id.get_type() == DialogType::User); - CHECK(d->can_report_spam && d->can_add_contact); - auto distance = d->hide_distance ? -1 : d->distance; - return td_api::make_object(d->can_unarchive, distance); + CHECK(action_bar->can_report_spam && action_bar->can_add_contact); + return td_api::make_object(action_bar->can_unarchive, action_bar->distance); } - if (d->can_add_contact) { + if (action_bar->can_add_contact) { CHECK(d->dialog_id.get_type() == DialogType::User); - CHECK(!d->can_report_spam); + CHECK(!action_bar->can_report_spam); return td_api::make_object(); } - if (d->can_report_spam) { - return td_api::make_object(d->can_unarchive); + if (action_bar->can_report_spam) { + return td_api::make_object(action_bar->can_unarchive); } return nullptr; } @@ -30175,14 +30202,8 @@ void MessagesManager::set_dialog_is_blocked(Dialog *d, bool is_blocked) { if (d->know_action_bar) { if (is_blocked) { - if (d->can_report_spam || d->can_share_phone_number || d->can_block_user || d->can_add_contact || - d->can_unarchive || d->distance >= 0) { - d->can_report_spam = false; - d->can_share_phone_number = false; - d->can_block_user = false; - d->can_add_contact = false; - d->can_unarchive = false; - d->distance = -1; + if (d->action_bar != nullptr) { + d->action_bar = nullptr; send_update_chat_action_bar(d); } } else { @@ -30525,17 +30546,17 @@ void MessagesManager::do_set_dialog_folder_id(Dialog *d, FolderId folder_id) { auto user_id = td_->contacts_manager_->get_secret_chat_user_id(d->dialog_id.get_secret_chat_id()); if (d->is_update_new_chat_sent && user_id.is_valid()) { const Dialog *user_d = get_dialog(DialogId(user_id)); - if (user_d != nullptr && user_d->can_unarchive && user_d->know_action_bar) { + if (user_d != nullptr && user_d->action_bar != nullptr && user_d->action_bar->can_unarchive) { send_closure( G()->td(), &Td::send_update, td_api::make_object(d->dialog_id.get(), get_chat_action_bar_object(d))); } } - } else if (d->can_unarchive && folder_id != FolderId::archive()) { - d->can_unarchive = false; - d->can_report_spam = false; - d->can_block_user = false; - // keep d->can_add_contact + } else if (d->action_bar != nullptr && d->action_bar->can_unarchive && folder_id != FolderId::archive()) { + d->action_bar->can_unarchive = false; + d->action_bar->can_report_spam = false; + d->action_bar->can_block_user = false; + // keep d->action_bar->can_add_contact send_update_chat_action_bar(d); } @@ -30810,11 +30831,11 @@ void MessagesManager::on_dialog_user_is_contact_updated(DialogId dialog_id, bool if (d != nullptr && d->is_update_new_chat_sent) { if (d->know_action_bar) { if (is_contact) { - if (d->can_block_user || d->can_add_contact) { - d->can_block_user = false; - d->can_add_contact = false; - // keep d->can_unarchive - d->distance = -1; + if (d->action_bar != nullptr && (d->action_bar->can_block_user || d->action_bar->can_add_contact)) { + d->action_bar->can_block_user = false; + d->action_bar->can_add_contact = false; + // keep d->action_bar->can_unarchive + d->action_bar->distance = -1; send_update_chat_action_bar(d); } } else { @@ -30842,11 +30863,12 @@ void MessagesManager::on_dialog_user_is_deleted_updated(DialogId dialog_id, bool if (d != nullptr && d->is_update_new_chat_sent) { if (d->know_action_bar) { if (is_deleted) { - if (d->can_share_phone_number || d->can_block_user || d->can_add_contact || d->distance >= 0) { - d->can_share_phone_number = false; - d->can_block_user = false; - d->can_add_contact = false; - d->distance = -1; + if (d->action_bar != nullptr && (d->action_bar->can_share_phone_number || d->action_bar->can_block_user || + d->action_bar->can_add_contact || d->action_bar->distance >= 0)) { + d->action_bar->can_share_phone_number = false; + d->action_bar->can_block_user = false; + d->action_bar->can_add_contact = false; + d->action_bar->distance = -1; send_update_chat_action_bar(d); } } else { @@ -36888,7 +36910,8 @@ void MessagesManager::try_hide_distance(DialogId dialog_id, const Message *m) { d->hide_distance = true; on_dialog_updated(dialog_id, "try_hide_distance"); - if (d->distance != -1) { + if (d->action_bar->distance != -1) { + d->action_bar->distance = -1; send_update_chat_action_bar(d); } } diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 0aede562b..6e101f947 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -1154,6 +1154,18 @@ class MessagesManager final : public Actor { void parse(ParserT &parser); }; + struct DialogActionBar { + int32 distance = -1; // distance to the peer + + bool can_report_spam = false; + bool can_add_contact = false; + bool can_block_user = false; + bool can_share_phone_number = false; + bool can_report_location = false; + bool can_unarchive = false; + bool can_invite_members = false; + }; + struct Dialog { DialogId dialog_id; MessageId last_new_message_id; // identifier of the last known server message received from update, there should be @@ -1181,6 +1193,7 @@ class MessagesManager final : public Actor { DialogNotificationSettings notification_settings; MessageTtlSetting message_ttl_setting; unique_ptr draft_message; + unique_ptr action_bar; LogEventIdWithGeneration save_draft_message_log_event_id; LogEventIdWithGeneration save_notification_settings_log_event_id; std::unordered_map read_history_log_event_ids; @@ -1201,8 +1214,6 @@ class MessagesManager final : public Actor { MessageId max_unavailable_message_id; // maximum unavailable message identifier for dialogs with cleared/unavailable history - int32 distance = -1; // distance to the peer - int32 last_clear_history_date = 0; MessageId last_clear_history_message_id; int64 order = DEFAULT_ORDER; @@ -1232,14 +1243,7 @@ class MessagesManager final : public Actor { bool need_repair_action_bar = false; bool know_action_bar = false; - bool can_report_spam = false; - bool can_add_contact = false; - bool can_block_user = false; - bool can_share_phone_number = false; - bool can_report_location = false; - bool can_unarchive = false; bool hide_distance = false; - bool can_invite_members = false; bool is_opened = false; bool was_opened = false; @@ -2557,6 +2561,12 @@ class MessagesManager final : public Actor { void add_dialog_last_database_message(Dialog *d, unique_ptr &&last_database_message); + static unique_ptr create_action_bar(bool can_report_spam, bool can_add_contact, bool can_block_user, + bool can_share_phone_number, bool can_report_location, + bool can_unarchive, int32 distance, bool can_invite_members); + + static bool cmp_dialog_action_bar(const unique_ptr &lhs, const unique_ptr &rhs); + void fix_dialog_action_bar(Dialog *d); td_api::object_ptr get_chat_type_object(DialogId dialog_id) const; From 6b1833a259ea0752bc9d4309d43fc5afef9ac597 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 23 Nov 2021 00:24:18 +0300 Subject: [PATCH 04/17] Move DialogActionBar to a separate header. --- CMakeLists.txt | 2 + td/telegram/DialogActionBar.cpp | 83 +++++++++++++++++++++++++ td/telegram/DialogActionBar.h | 37 ++++++++++++ td/telegram/MessagesManager.cpp | 103 +++++--------------------------- td/telegram/MessagesManager.h | 22 +------ 5 files changed, 140 insertions(+), 107 deletions(-) create mode 100644 td/telegram/DialogActionBar.cpp create mode 100644 td/telegram/DialogActionBar.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 7690676eb..2c0b60d0c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -301,6 +301,7 @@ set(TDLIB_SOURCE td/telegram/DeviceTokenManager.cpp td/telegram/DhCache.cpp td/telegram/DialogAction.cpp + td/telegram/DialogActionBar.cpp td/telegram/DialogAdministrator.cpp td/telegram/DialogDb.cpp td/telegram/DialogEventLog.cpp @@ -485,6 +486,7 @@ set(TDLIB_SOURCE td/telegram/DhCache.h td/telegram/DhConfig.h td/telegram/DialogAction.h + td/telegram/DialogActionBar.h td/telegram/DialogAdministrator.h td/telegram/DialogDate.h td/telegram/DialogDb.h diff --git a/td/telegram/DialogActionBar.cpp b/td/telegram/DialogActionBar.cpp new file mode 100644 index 000000000..7e7ed2c6a --- /dev/null +++ b/td/telegram/DialogActionBar.cpp @@ -0,0 +1,83 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2021 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#include "td/telegram/DialogActionBar.h" + +namespace td { + +unique_ptr DialogActionBar::create(bool can_report_spam, bool can_add_contact, bool can_block_user, + bool can_share_phone_number, bool can_report_location, + bool can_unarchive, int32 distance, bool can_invite_members) { + if (!can_report_spam && !can_add_contact && !can_block_user && !can_share_phone_number && !can_report_location && + !can_unarchive && distance < 0 && !can_invite_members) { + return nullptr; + } + + auto action_bar = make_unique(); + action_bar->can_report_spam = can_report_spam; + action_bar->can_add_contact = can_add_contact; + action_bar->can_block_user = can_block_user; + action_bar->can_share_phone_number = can_share_phone_number; + action_bar->can_report_location = can_report_location; + action_bar->can_unarchive = can_unarchive; + action_bar->distance = distance >= 0 ? distance : -1; + action_bar->can_invite_members = can_invite_members; + return action_bar; +} + +td_api::object_ptr DialogActionBar::get_chat_action_bar_object(DialogType dialog_type, + bool hide_unarchive) const { + if (can_report_location) { + CHECK(dialog_type == DialogType::Channel); + CHECK(!can_share_phone_number && !can_block_user && !can_add_contact && !can_report_spam && !can_invite_members); + return td_api::make_object(); + } + if (can_invite_members) { + CHECK(!can_share_phone_number && !can_block_user && !can_add_contact && !can_report_spam); + return td_api::make_object(); + } + if (can_share_phone_number) { + CHECK(dialog_type == DialogType::User); + CHECK(!can_block_user && !can_add_contact && !can_report_spam); + return td_api::make_object(); + } + if (hide_unarchive) { + if (can_add_contact) { + return td_api::make_object(); + } else { + return nullptr; + } + } + if (can_block_user) { + CHECK(dialog_type == DialogType::User); + CHECK(can_report_spam && can_add_contact); + return td_api::make_object(can_unarchive, distance); + } + if (can_add_contact) { + CHECK(dialog_type == DialogType::User); + CHECK(!can_report_spam); + return td_api::make_object(); + } + if (can_report_spam) { + return td_api::make_object(can_unarchive); + } + return nullptr; +} + +bool operator==(const unique_ptr &lhs, const unique_ptr &rhs) { + if (lhs == nullptr) { + return rhs == nullptr; + } + if (rhs == nullptr) { + return false; + } + return lhs->can_report_spam == rhs->can_report_spam && lhs->can_add_contact == rhs->can_add_contact && + lhs->can_block_user == rhs->can_block_user && lhs->can_share_phone_number == rhs->can_share_phone_number && + lhs->can_report_location == rhs->can_report_location && lhs->can_unarchive == rhs->can_unarchive && + lhs->distance == rhs->distance && lhs->can_invite_members == rhs->can_invite_members; +} + +} // namespace td diff --git a/td/telegram/DialogActionBar.h b/td/telegram/DialogActionBar.h new file mode 100644 index 000000000..f4c622378 --- /dev/null +++ b/td/telegram/DialogActionBar.h @@ -0,0 +1,37 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2021 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#pragma once + +#include "td/telegram/DialogId.h" +#include "td/telegram/td_api.h" + +#include "td/utils/common.h" + +namespace td { + +struct DialogActionBar { + int32 distance = -1; // distance to the peer + + bool can_report_spam = false; + bool can_add_contact = false; + bool can_block_user = false; + bool can_share_phone_number = false; + bool can_report_location = false; + bool can_unarchive = false; + bool can_invite_members = false; + + static unique_ptr create(bool can_report_spam, bool can_add_contact, bool can_block_user, + bool can_share_phone_number, bool can_report_location, bool can_unarchive, + int32 distance, bool can_invite_members); + + td_api::object_ptr get_chat_action_bar_object(DialogType dialog_type, + bool hide_unarchive) const; +}; + +bool operator==(const unique_ptr &lhs, const unique_ptr &rhs); + +} // namespace td diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index ff306cd2f..118959e9f 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -11,6 +11,7 @@ #include "td/telegram/ConfigShared.h" #include "td/telegram/ContactsManager.h" #include "td/telegram/Dependencies.h" +#include "td/telegram/DialogActionBar.h" #include "td/telegram/DialogDb.h" #include "td/telegram/DialogFilter.h" #include "td/telegram/DialogFilter.hpp" @@ -5622,10 +5623,10 @@ void MessagesManager::Dialog::parse(ParserT &parser) { action_bar_can_report_spam = false; } if (know_action_bar) { - action_bar = - create_action_bar(action_bar_can_report_spam, action_bar_can_add_contact, action_bar_can_block_user, - action_bar_can_share_phone_number, action_bar_can_report_location, action_bar_can_unarchive, - hide_distance ? -1 : action_bar_distance, action_bar_can_invite_members); + action_bar = DialogActionBar::create(action_bar_can_report_spam, action_bar_can_add_contact, + action_bar_can_block_user, action_bar_can_share_phone_number, + action_bar_can_report_location, action_bar_can_unarchive, + hide_distance ? -1 : action_bar_distance, action_bar_can_invite_members); } } @@ -8206,40 +8207,6 @@ void MessagesManager::report_dialog_photo(DialogId dialog_id, FileId file_id, Re ->send(dialog_id, file_id, file_view.remote_location().as_input_photo(), std::move(reason)); } -unique_ptr MessagesManager::create_action_bar( - bool can_report_spam, bool can_add_contact, bool can_block_user, bool can_share_phone_number, - bool can_report_location, bool can_unarchive, int32 distance, bool can_invite_members) { - if (!can_report_spam && !can_add_contact && !can_block_user && !can_share_phone_number && !can_report_location && - !can_unarchive && distance < 0 && !can_invite_members) { - return nullptr; - } - - auto action_bar = td::make_unique(); - action_bar->can_report_spam = can_report_spam; - action_bar->can_add_contact = can_add_contact; - action_bar->can_block_user = can_block_user; - action_bar->can_share_phone_number = can_share_phone_number; - action_bar->can_report_location = can_report_location; - action_bar->can_unarchive = can_unarchive; - action_bar->distance = distance >= 0 ? distance : -1; - action_bar->can_invite_members = can_invite_members; - return action_bar; -} - -bool MessagesManager::cmp_dialog_action_bar(const unique_ptr &lhs, - const unique_ptr &rhs) { - if (lhs == nullptr) { - return rhs == nullptr; - } - if (rhs == nullptr) { - return false; - } - return lhs->can_report_spam == rhs->can_report_spam && lhs->can_add_contact == rhs->can_add_contact && - lhs->can_block_user == rhs->can_block_user && lhs->can_share_phone_number == rhs->can_share_phone_number && - lhs->can_report_location == rhs->can_report_location && lhs->can_unarchive == rhs->can_unarchive && - lhs->distance == rhs->distance && lhs->can_invite_members == rhs->can_invite_members; -} - void MessagesManager::on_get_peer_settings(DialogId dialog_id, tl_object_ptr &&peer_settings, bool ignore_privacy_exception) { @@ -8260,11 +8227,11 @@ void MessagesManager::on_get_peer_settings(DialogId dialog_id, distance = -1; } auto action_bar = - create_action_bar(peer_settings->report_spam_, peer_settings->add_contact_, peer_settings->block_contact_, - peer_settings->share_contact_, peer_settings->report_geo_, peer_settings->autoarchived_, - distance, peer_settings->invite_members_); + DialogActionBar::create(peer_settings->report_spam_, peer_settings->add_contact_, peer_settings->block_contact_, + peer_settings->share_contact_, peer_settings->report_geo_, peer_settings->autoarchived_, + distance, peer_settings->invite_members_); - if (cmp_dialog_action_bar(d->action_bar, action_bar)) { + if (d->action_bar == action_bar) { if (!d->know_action_bar || d->need_repair_action_bar) { d->know_action_bar = true; d->need_repair_action_bar = false; @@ -20137,63 +20104,25 @@ td_api::object_ptr MessagesManager::get_chat_type_object(Dialo } } -td_api::object_ptr MessagesManager::get_chat_action_bar_object(const Dialog *d, - bool hide_unarchive) const { +td_api::object_ptr MessagesManager::get_chat_action_bar_object(const Dialog *d) const { CHECK(d != nullptr); - if (d->dialog_id.get_type() == DialogType::SecretChat) { + auto dialog_type = d->dialog_id.get_type(); + if (dialog_type == DialogType::SecretChat) { auto user_id = td_->contacts_manager_->get_secret_chat_user_id(d->dialog_id.get_secret_chat_id()); if (!user_id.is_valid()) { return nullptr; } const Dialog *user_d = get_dialog(DialogId(user_id)); - if (user_d == nullptr) { + if (user_d == nullptr || user_d->action_bar == nullptr) { return nullptr; } - return get_chat_action_bar_object(user_d, d->folder_id != FolderId::archive()); + return user_d->action_bar->get_chat_action_bar_object(DialogType::User, d->folder_id != FolderId::archive()); } - auto action_bar = d->action_bar.get(); - if (action_bar == nullptr) { + if (d->action_bar == nullptr) { return nullptr; } - - if (action_bar->can_report_location) { - CHECK(d->dialog_id.get_type() == DialogType::Channel); - CHECK(!action_bar->can_share_phone_number && !action_bar->can_block_user && !action_bar->can_add_contact && - !action_bar->can_report_spam && !action_bar->can_invite_members); - return td_api::make_object(); - } - if (action_bar->can_invite_members) { - CHECK(!action_bar->can_share_phone_number && !action_bar->can_block_user && !action_bar->can_add_contact && - !action_bar->can_report_spam); - return td_api::make_object(); - } - if (action_bar->can_share_phone_number) { - CHECK(d->dialog_id.get_type() == DialogType::User); - CHECK(!action_bar->can_block_user && !action_bar->can_add_contact && !action_bar->can_report_spam); - return td_api::make_object(); - } - if (hide_unarchive) { - if (action_bar->can_add_contact) { - return td_api::make_object(); - } else { - return nullptr; - } - } - if (action_bar->can_block_user) { - CHECK(d->dialog_id.get_type() == DialogType::User); - CHECK(action_bar->can_report_spam && action_bar->can_add_contact); - return td_api::make_object(action_bar->can_unarchive, action_bar->distance); - } - if (action_bar->can_add_contact) { - CHECK(d->dialog_id.get_type() == DialogType::User); - CHECK(!action_bar->can_report_spam); - return td_api::make_object(); - } - if (action_bar->can_report_spam) { - return td_api::make_object(action_bar->can_unarchive); - } - return nullptr; + return d->action_bar->get_chat_action_bar_object(dialog_type, false); } string MessagesManager::get_dialog_theme_name(const Dialog *d) const { diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 6e101f947..1d8a84cc6 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -86,6 +86,7 @@ namespace td { struct BinlogEvent; struct Dependencies; +struct DialogActionBar; class DialogFilter; class DraftMessage; struct InputMessageContent; @@ -1154,18 +1155,6 @@ class MessagesManager final : public Actor { void parse(ParserT &parser); }; - struct DialogActionBar { - int32 distance = -1; // distance to the peer - - bool can_report_spam = false; - bool can_add_contact = false; - bool can_block_user = false; - bool can_share_phone_number = false; - bool can_report_location = false; - bool can_unarchive = false; - bool can_invite_members = false; - }; - struct Dialog { DialogId dialog_id; MessageId last_new_message_id; // identifier of the last known server message received from update, there should be @@ -2561,18 +2550,11 @@ class MessagesManager final : public Actor { void add_dialog_last_database_message(Dialog *d, unique_ptr &&last_database_message); - static unique_ptr create_action_bar(bool can_report_spam, bool can_add_contact, bool can_block_user, - bool can_share_phone_number, bool can_report_location, - bool can_unarchive, int32 distance, bool can_invite_members); - - static bool cmp_dialog_action_bar(const unique_ptr &lhs, const unique_ptr &rhs); - void fix_dialog_action_bar(Dialog *d); td_api::object_ptr get_chat_type_object(DialogId dialog_id) const; - td_api::object_ptr get_chat_action_bar_object(const Dialog *d, - bool hide_unarchive = false) const; + td_api::object_ptr get_chat_action_bar_object(const Dialog *d) const; string get_dialog_theme_name(const Dialog *d) const; From 6c1429f74c645776e981f93aa140892d055d136f Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 23 Nov 2021 07:45:32 +0300 Subject: [PATCH 05/17] Move fix_dialog_action_bar to DialogActionBar.cpp. --- td/telegram/DialogActionBar.cpp | 117 ++++++++++++++++++++++++++++- td/telegram/DialogActionBar.h | 5 ++ td/telegram/MessagesManager.cpp | 127 ++------------------------------ td/telegram/MessagesManager.h | 2 +- 4 files changed, 128 insertions(+), 123 deletions(-) diff --git a/td/telegram/DialogActionBar.cpp b/td/telegram/DialogActionBar.cpp index 7e7ed2c6a..c231d947c 100644 --- a/td/telegram/DialogActionBar.cpp +++ b/td/telegram/DialogActionBar.cpp @@ -6,13 +6,16 @@ // #include "td/telegram/DialogActionBar.h" +#include "td/telegram/ContactsManager.h" +#include "td/telegram/Td.h" + namespace td { unique_ptr DialogActionBar::create(bool can_report_spam, bool can_add_contact, bool can_block_user, bool can_share_phone_number, bool can_report_location, bool can_unarchive, int32 distance, bool can_invite_members) { if (!can_report_spam && !can_add_contact && !can_block_user && !can_share_phone_number && !can_report_location && - !can_unarchive && distance < 0 && !can_invite_members) { + !can_invite_members) { return nullptr; } @@ -28,6 +31,118 @@ unique_ptr DialogActionBar::create(bool can_report_spam, bool c return action_bar; } +void DialogActionBar::fix(Td *td, DialogId dialog_id, bool is_dialog_blocked, FolderId folder_id) { + auto dialog_type = dialog_id.get_type(); + if (distance >= 0 && dialog_type != DialogType::User) { + LOG(ERROR) << "Receive distance " << distance << " to " << dialog_id; + distance = -1; + } + + if (can_report_location) { + if (dialog_type != DialogType::Channel) { + LOG(ERROR) << "Receive can_report_location in " << dialog_id; + can_report_location = false; + } else if (can_report_spam || can_add_contact || can_block_user || can_share_phone_number || can_unarchive || + can_invite_members) { + LOG(ERROR) << "Receive action bar " << can_report_spam << "/" << can_add_contact << "/" << can_block_user << "/" + << can_share_phone_number << "/" << can_report_location << "/" << can_unarchive << "/" + << can_invite_members; + can_report_spam = false; + can_add_contact = false; + can_block_user = false; + can_share_phone_number = false; + can_unarchive = false; + can_invite_members = false; + CHECK(distance == -1); + } + } + if (can_invite_members) { + if (dialog_type != DialogType::Chat && + (dialog_type != DialogType::Channel || td->contacts_manager_->get_channel_type(dialog_id.get_channel_id()) == + ContactsManager::ChannelType::Broadcast)) { + LOG(ERROR) << "Receive can_invite_members in " << dialog_id; + can_invite_members = false; + } else if (can_report_spam || can_add_contact || can_block_user || can_share_phone_number || can_unarchive) { + LOG(ERROR) << "Receive action bar " << can_report_spam << "/" << can_add_contact << "/" << can_block_user << "/" + << can_share_phone_number << "/" << can_unarchive << "/" << can_invite_members; + can_report_spam = false; + can_add_contact = false; + can_block_user = false; + can_share_phone_number = false; + can_unarchive = false; + CHECK(distance == -1); + } + } + if (dialog_type == DialogType::User) { + auto user_id = dialog_id.get_user_id(); + bool is_me = user_id == td->contacts_manager_->get_my_id(); + bool is_deleted = td->contacts_manager_->is_user_deleted(user_id); + bool is_contact = td->contacts_manager_->is_user_contact(user_id); + if (is_me || is_dialog_blocked) { + can_report_spam = false; + can_unarchive = false; + } + if (is_me || is_dialog_blocked || is_deleted) { + can_share_phone_number = false; + } + if (is_me || is_dialog_blocked || is_deleted || is_contact) { + can_block_user = false; + can_add_contact = false; + } + } + if (folder_id != FolderId::archive()) { + can_unarchive = false; + } + if (can_share_phone_number) { + CHECK(!can_report_location); + CHECK(!can_invite_members); + if (dialog_type != DialogType::User) { + LOG(ERROR) << "Receive can_share_phone_number in " << dialog_id; + can_share_phone_number = false; + } else if (can_report_spam || can_add_contact || can_block_user || can_unarchive || distance >= 0) { + LOG(ERROR) << "Receive action bar " << can_report_spam << "/" << can_add_contact << "/" << can_block_user << "/" + << can_share_phone_number << "/" << can_unarchive << "/" << distance; + can_report_spam = false; + can_add_contact = false; + can_block_user = false; + can_unarchive = false; + } + } + if (can_block_user) { + CHECK(!can_report_location); + CHECK(!can_invite_members); + CHECK(!can_share_phone_number); + if (dialog_type != DialogType::User) { + LOG(ERROR) << "Receive can_block_user in " << dialog_id; + can_block_user = false; + } else if (!can_report_spam || !can_add_contact) { + LOG(ERROR) << "Receive action bar " << can_report_spam << "/" << can_add_contact << "/" << can_block_user; + can_report_spam = true; + can_add_contact = true; + } + } + if (can_add_contact) { + CHECK(!can_report_location); + CHECK(!can_invite_members); + CHECK(!can_share_phone_number); + if (dialog_type != DialogType::User) { + LOG(ERROR) << "Receive can_add_contact in " << dialog_id; + can_add_contact = false; + } else if (can_report_spam != can_block_user) { + LOG(ERROR) << "Receive action bar " << can_report_spam << "/" << can_add_contact << "/" << can_block_user; + can_report_spam = false; + can_block_user = false; + can_unarchive = false; + } + } + if (!can_block_user) { + distance = -1; + } + if (!can_report_spam) { + can_unarchive = false; + } +} + td_api::object_ptr DialogActionBar::get_chat_action_bar_object(DialogType dialog_type, bool hide_unarchive) const { if (can_report_location) { diff --git a/td/telegram/DialogActionBar.h b/td/telegram/DialogActionBar.h index f4c622378..6b542ea3c 100644 --- a/td/telegram/DialogActionBar.h +++ b/td/telegram/DialogActionBar.h @@ -7,12 +7,15 @@ #pragma once #include "td/telegram/DialogId.h" +#include "td/telegram/FolderId.h" #include "td/telegram/td_api.h" #include "td/utils/common.h" namespace td { +class Td; + struct DialogActionBar { int32 distance = -1; // distance to the peer @@ -30,6 +33,8 @@ struct DialogActionBar { td_api::object_ptr get_chat_action_bar_object(DialogType dialog_type, bool hide_unarchive) const; + + void fix(Td *td, DialogId dialog_id, bool is_dialog_blocked, FolderId folder_id); }; bool operator==(const unique_ptr &lhs, const unique_ptr &rhs); diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 118959e9f..ada8aefde 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -8231,6 +8231,8 @@ void MessagesManager::on_get_peer_settings(DialogId dialog_id, peer_settings->share_contact_, peer_settings->report_geo_, peer_settings->autoarchived_, distance, peer_settings->invite_members_); + fix_dialog_action_bar(d, action_bar.get()); + if (d->action_bar == action_bar) { if (!d->know_action_bar || d->need_repair_action_bar) { d->know_action_bar = true; @@ -8244,133 +8246,16 @@ void MessagesManager::on_get_peer_settings(DialogId dialog_id, d->need_repair_action_bar = false; d->action_bar = std::move(action_bar); - fix_dialog_action_bar(d); - send_update_chat_action_bar(d); } -void MessagesManager::fix_dialog_action_bar(Dialog *d) { - CHECK(d != nullptr); - auto action_bar = d->action_bar.get(); +void MessagesManager::fix_dialog_action_bar(const Dialog *d, DialogActionBar *action_bar) { if (action_bar == nullptr) { return; } - auto dialog_type = d->dialog_id.get_type(); - if (action_bar->distance >= 0 && dialog_type != DialogType::User) { - LOG(ERROR) << "Receive distance " << action_bar->distance << " to " << d->dialog_id; - action_bar->distance = -1; - } - - if (action_bar->can_report_location) { - if (dialog_type != DialogType::Channel) { - LOG(ERROR) << "Receive can_report_location in " << d->dialog_id; - action_bar->can_report_location = false; - } else if (action_bar->can_report_spam || action_bar->can_add_contact || action_bar->can_block_user || - action_bar->can_share_phone_number || action_bar->can_unarchive || action_bar->can_invite_members) { - LOG(ERROR) << "Receive action bar " << action_bar->can_report_spam << "/" << action_bar->can_add_contact << "/" - << action_bar->can_block_user << "/" << action_bar->can_share_phone_number << "/" - << action_bar->can_report_location << "/" << action_bar->can_unarchive << "/" - << action_bar->can_invite_members; - action_bar->can_report_spam = false; - action_bar->can_add_contact = false; - action_bar->can_block_user = false; - action_bar->can_share_phone_number = false; - action_bar->can_unarchive = false; - action_bar->can_invite_members = false; - CHECK(action_bar->distance == -1); - } - } - if (action_bar->can_invite_members) { - if (dialog_type != DialogType::Chat && (dialog_type != DialogType::Channel || is_broadcast_channel(d->dialog_id))) { - LOG(ERROR) << "Receive can_invite_members in " << d->dialog_id; - action_bar->can_invite_members = false; - } else if (action_bar->can_report_spam || action_bar->can_add_contact || action_bar->can_block_user || - action_bar->can_share_phone_number || action_bar->can_unarchive) { - LOG(ERROR) << "Receive action bar " << action_bar->can_report_spam << "/" << action_bar->can_add_contact << "/" - << action_bar->can_block_user << "/" << action_bar->can_share_phone_number << "/" - << action_bar->can_unarchive << "/" << action_bar->can_invite_members; - action_bar->can_report_spam = false; - action_bar->can_add_contact = false; - action_bar->can_block_user = false; - action_bar->can_share_phone_number = false; - action_bar->can_unarchive = false; - CHECK(action_bar->distance == -1); - } - } - if (dialog_type == DialogType::User) { - auto user_id = d->dialog_id.get_user_id(); - bool is_me = user_id == td_->contacts_manager_->get_my_id(); - bool is_blocked = d->is_blocked; - bool is_deleted = td_->contacts_manager_->is_user_deleted(user_id); - bool is_contact = td_->contacts_manager_->is_user_contact(user_id); - if (is_me || is_blocked) { - action_bar->can_report_spam = false; - action_bar->can_unarchive = false; - } - if (is_me || is_blocked || is_deleted) { - action_bar->can_share_phone_number = false; - } - if (is_me || is_blocked || is_deleted || is_contact) { - action_bar->can_block_user = false; - action_bar->can_add_contact = false; - } - } - if (d->folder_id != FolderId::archive()) { - action_bar->can_unarchive = false; - } - if (action_bar->can_share_phone_number) { - CHECK(!action_bar->can_report_location); - CHECK(!action_bar->can_invite_members); - if (dialog_type != DialogType::User) { - LOG(ERROR) << "Receive can_share_phone_number in " << d->dialog_id; - action_bar->can_share_phone_number = false; - } else if (action_bar->can_report_spam || action_bar->can_add_contact || action_bar->can_block_user || - action_bar->can_unarchive || action_bar->distance >= 0) { - LOG(ERROR) << "Receive action bar " << action_bar->can_report_spam << "/" << action_bar->can_add_contact << "/" - << action_bar->can_block_user << "/" << action_bar->can_share_phone_number << "/" - << action_bar->can_unarchive << "/" << action_bar->distance; - action_bar->can_report_spam = false; - action_bar->can_add_contact = false; - action_bar->can_block_user = false; - action_bar->can_unarchive = false; - } - } - if (action_bar->can_block_user) { - CHECK(!action_bar->can_report_location); - CHECK(!action_bar->can_invite_members); - CHECK(!action_bar->can_share_phone_number); - if (dialog_type != DialogType::User) { - LOG(ERROR) << "Receive can_block_user in " << d->dialog_id; - action_bar->can_block_user = false; - } else if (!action_bar->can_report_spam || !action_bar->can_add_contact) { - LOG(ERROR) << "Receive action bar " << action_bar->can_report_spam << "/" << action_bar->can_add_contact << "/" - << action_bar->can_block_user; - action_bar->can_report_spam = true; - action_bar->can_add_contact = true; - } - } - if (action_bar->can_add_contact) { - CHECK(!action_bar->can_report_location); - CHECK(!action_bar->can_invite_members); - CHECK(!action_bar->can_share_phone_number); - if (dialog_type != DialogType::User) { - LOG(ERROR) << "Receive can_add_contact in " << d->dialog_id; - action_bar->can_add_contact = false; - } else if (action_bar->can_report_spam != action_bar->can_block_user) { - LOG(ERROR) << "Receive action bar " << action_bar->can_report_spam << "/" << action_bar->can_add_contact << "/" - << action_bar->can_block_user; - action_bar->can_report_spam = false; - action_bar->can_block_user = false; - action_bar->can_unarchive = false; - } - } - if (!action_bar->can_block_user) { - action_bar->distance = -1; - } - if (!action_bar->can_report_spam) { - action_bar->can_unarchive = false; - } + CHECK(d != nullptr); + action_bar->fix(td_, d->dialog_id, d->is_blocked, d->folder_id); } Result MessagesManager::get_login_button_url(FullMessageId full_message_id, int64 button_id) { @@ -34423,7 +34308,7 @@ MessagesManager::Dialog *MessagesManager::add_new_dialog(unique_ptr &&d, Dialog *dialog = dialog_it->second.get(); - fix_dialog_action_bar(dialog); + fix_dialog_action_bar(dialog, dialog->action_bar.get()); send_update_new_chat(dialog); diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 1d8a84cc6..8a75f1ac9 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -2550,7 +2550,7 @@ class MessagesManager final : public Actor { void add_dialog_last_database_message(Dialog *d, unique_ptr &&last_database_message); - void fix_dialog_action_bar(Dialog *d); + void fix_dialog_action_bar(const Dialog *d, DialogActionBar *action_bar); td_api::object_ptr get_chat_type_object(DialogId dialog_id) const; From 8fd9d89ec3a8c8ddb397e0bb769ef059630d008c Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 23 Nov 2021 09:27:30 +0300 Subject: [PATCH 06/17] Move DialogActionBar modifiers to DialogActionBar.cpp. --- td/telegram/DialogActionBar.cpp | 45 +++++++++++++++++++++++++++++++++ td/telegram/DialogActionBar.h | 8 ++++++ td/telegram/MessagesManager.cpp | 22 +++------------- 3 files changed, 57 insertions(+), 18 deletions(-) diff --git a/td/telegram/DialogActionBar.cpp b/td/telegram/DialogActionBar.cpp index c231d947c..e360d8d94 100644 --- a/td/telegram/DialogActionBar.cpp +++ b/td/telegram/DialogActionBar.cpp @@ -182,6 +182,51 @@ td_api::object_ptr DialogActionBar::get_chat_action_bar_o return nullptr; } +bool DialogActionBar::on_dialog_unarchived() { + if (!can_unarchive) { + return false; + } + + can_unarchive = false; + can_report_spam = false; + can_block_user = false; + // keep can_add_contact + return true; +} + +bool DialogActionBar::on_user_contact_added() { + if (!can_block_user && !can_add_contact) { + return false; + } + + can_block_user = false; + can_add_contact = false; + // keep can_unarchive + distance = -1; + return true; +} + +bool DialogActionBar::on_user_deleted() { + if (!can_share_phone_number && !can_block_user && !can_add_contact && distance < 0) { + return false; + } + + can_share_phone_number = false; + can_block_user = false; + can_add_contact = false; + distance = -1; + return true; +} + +bool DialogActionBar::on_outgoing_message() { + if (distance < 0) { + return false; + } + + distance = -1; + return true; +} + bool operator==(const unique_ptr &lhs, const unique_ptr &rhs) { if (lhs == nullptr) { return rhs == nullptr; diff --git a/td/telegram/DialogActionBar.h b/td/telegram/DialogActionBar.h index 6b542ea3c..9492f21df 100644 --- a/td/telegram/DialogActionBar.h +++ b/td/telegram/DialogActionBar.h @@ -35,6 +35,14 @@ struct DialogActionBar { bool hide_unarchive) const; void fix(Td *td, DialogId dialog_id, bool is_dialog_blocked, FolderId folder_id); + + bool on_dialog_unarchived(); + + bool on_user_contact_added(); + + bool on_user_deleted(); + + bool on_outgoing_message(); }; bool operator==(const unique_ptr &lhs, const unique_ptr &rhs); diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index ada8aefde..56ca214ae 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -30366,11 +30366,7 @@ void MessagesManager::do_set_dialog_folder_id(Dialog *d, FolderId folder_id) { td_api::make_object(d->dialog_id.get(), get_chat_action_bar_object(d))); } } - } else if (d->action_bar != nullptr && d->action_bar->can_unarchive && folder_id != FolderId::archive()) { - d->action_bar->can_unarchive = false; - d->action_bar->can_report_spam = false; - d->action_bar->can_block_user = false; - // keep d->action_bar->can_add_contact + } else if (folder_id != FolderId::archive() && d->action_bar != nullptr && d->action_bar->on_dialog_unarchived()) { send_update_chat_action_bar(d); } @@ -30645,11 +30641,7 @@ void MessagesManager::on_dialog_user_is_contact_updated(DialogId dialog_id, bool if (d != nullptr && d->is_update_new_chat_sent) { if (d->know_action_bar) { if (is_contact) { - if (d->action_bar != nullptr && (d->action_bar->can_block_user || d->action_bar->can_add_contact)) { - d->action_bar->can_block_user = false; - d->action_bar->can_add_contact = false; - // keep d->action_bar->can_unarchive - d->action_bar->distance = -1; + if (d->action_bar != nullptr && d->action_bar->on_user_contact_added()) { send_update_chat_action_bar(d); } } else { @@ -30677,12 +30669,7 @@ void MessagesManager::on_dialog_user_is_deleted_updated(DialogId dialog_id, bool if (d != nullptr && d->is_update_new_chat_sent) { if (d->know_action_bar) { if (is_deleted) { - if (d->action_bar != nullptr && (d->action_bar->can_share_phone_number || d->action_bar->can_block_user || - d->action_bar->can_add_contact || d->action_bar->distance >= 0)) { - d->action_bar->can_share_phone_number = false; - d->action_bar->can_block_user = false; - d->action_bar->can_add_contact = false; - d->action_bar->distance = -1; + if (d->action_bar != nullptr && d->action_bar->on_user_deleted()) { send_update_chat_action_bar(d); } } else { @@ -36724,8 +36711,7 @@ void MessagesManager::try_hide_distance(DialogId dialog_id, const Message *m) { d->hide_distance = true; on_dialog_updated(dialog_id, "try_hide_distance"); - if (d->action_bar->distance != -1) { - d->action_bar->distance = -1; + if (d->action_bar != nullptr && d->action_bar->on_outgoing_message()) { send_update_chat_action_bar(d); } } From c7e641aca86ca87c6513a7603bd1b310b698f370 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 23 Nov 2021 09:35:38 +0300 Subject: [PATCH 07/17] Replace empty action bars with nullptr. --- td/telegram/DialogActionBar.cpp | 5 +++++ td/telegram/DialogActionBar.h | 2 ++ td/telegram/MessagesManager.cpp | 9 ++++++++- td/telegram/MessagesManager.h | 2 +- 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/td/telegram/DialogActionBar.cpp b/td/telegram/DialogActionBar.cpp index e360d8d94..663ec7207 100644 --- a/td/telegram/DialogActionBar.cpp +++ b/td/telegram/DialogActionBar.cpp @@ -31,6 +31,11 @@ unique_ptr DialogActionBar::create(bool can_report_spam, bool c return action_bar; } +bool DialogActionBar::is_empty() const { + return !can_report_spam && !can_add_contact && !can_block_user && !can_share_phone_number && !can_report_location && + !can_invite_members; +} + void DialogActionBar::fix(Td *td, DialogId dialog_id, bool is_dialog_blocked, FolderId folder_id) { auto dialog_type = dialog_id.get_type(); if (distance >= 0 && dialog_type != DialogType::User) { diff --git a/td/telegram/DialogActionBar.h b/td/telegram/DialogActionBar.h index 9492f21df..a3834f63b 100644 --- a/td/telegram/DialogActionBar.h +++ b/td/telegram/DialogActionBar.h @@ -31,6 +31,8 @@ struct DialogActionBar { bool can_share_phone_number, bool can_report_location, bool can_unarchive, int32 distance, bool can_invite_members); + bool is_empty() const; + td_api::object_ptr get_chat_action_bar_object(DialogType dialog_type, bool hide_unarchive) const; diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 56ca214ae..004abd0a3 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -8211,6 +8211,10 @@ void MessagesManager::on_get_peer_settings(DialogId dialog_id, tl_object_ptr &&peer_settings, bool ignore_privacy_exception) { CHECK(peer_settings != nullptr); + if (td_->auth_manager_->is_bot()) { + return; + } + if (dialog_id.get_type() == DialogType::User && !ignore_privacy_exception) { td_->contacts_manager_->on_update_user_need_phone_number_privacy_exception(dialog_id.get_user_id(), peer_settings->need_contacts_exception_); @@ -29040,10 +29044,13 @@ void MessagesManager::send_update_secret_chats_with_user_action_bar(const Dialog }); } -void MessagesManager::send_update_chat_action_bar(const Dialog *d) { +void MessagesManager::send_update_chat_action_bar(Dialog *d) { if (td_->auth_manager_->is_bot()) { return; } + if (d->action_bar != nullptr && d->action_bar->is_empty()) { + d->action_bar = nullptr; + } CHECK(d != nullptr); LOG_CHECK(d->is_update_new_chat_sent) << "Wrong " << d->dialog_id << " in send_update_chat_action_bar"; diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 8a75f1ac9..74d12006a 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -2354,7 +2354,7 @@ class MessagesManager final : public Actor { void send_update_secret_chats_with_user_action_bar(const Dialog *d) const; - void send_update_chat_action_bar(const Dialog *d); + void send_update_chat_action_bar(Dialog *d); void send_update_secret_chats_with_user_theme(const Dialog *d) const; From be303218018c647e6a41ca8f2d56fcdcf2d1265f Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 23 Nov 2021 11:41:35 +0300 Subject: [PATCH 08/17] Add DialogActionBar storer and parser. --- td/telegram/DialogActionBar.h | 37 +++++++++++++++++++++++++++++++++ td/telegram/MessagesManager.cpp | 35 ++++++++++++++++++------------- 2 files changed, 57 insertions(+), 15 deletions(-) diff --git a/td/telegram/DialogActionBar.h b/td/telegram/DialogActionBar.h index a3834f63b..ce9992afb 100644 --- a/td/telegram/DialogActionBar.h +++ b/td/telegram/DialogActionBar.h @@ -11,6 +11,7 @@ #include "td/telegram/td_api.h" #include "td/utils/common.h" +#include "td/utils/tl_helpers.h" namespace td { @@ -45,6 +46,42 @@ struct DialogActionBar { bool on_user_deleted(); bool on_outgoing_message(); + + template + void store(StorerT &storer) const { + bool has_distance = distance >= 0; + BEGIN_STORE_FLAGS(); + STORE_FLAG(can_report_spam); + STORE_FLAG(can_add_contact); + STORE_FLAG(can_block_user); + STORE_FLAG(can_share_phone_number); + STORE_FLAG(can_report_location); + STORE_FLAG(can_unarchive); + STORE_FLAG(can_invite_members); + STORE_FLAG(has_distance); + END_STORE_FLAGS(); + if (has_distance) { + td::store(distance, storer); + } + } + + template + void parse(ParserT &parser) { + bool has_distance; + BEGIN_PARSE_FLAGS(); + PARSE_FLAG(can_report_spam); + PARSE_FLAG(can_add_contact); + PARSE_FLAG(can_block_user); + PARSE_FLAG(can_share_phone_number); + PARSE_FLAG(can_report_location); + PARSE_FLAG(can_unarchive); + PARSE_FLAG(can_invite_members); + PARSE_FLAG(has_distance); + END_PARSE_FLAGS(); + if (has_distance) { + td::parse(distance, parser); + } + } }; bool operator==(const unique_ptr &lhs, const unique_ptr &rhs); diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 004abd0a3..45892463a 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -5170,7 +5170,6 @@ void MessagesManager::Dialog::store(StorerT &storer) const { max_notification_message_id.is_valid() && max_notification_message_id > last_new_message_id; bool has_folder_id = folder_id != FolderId(); bool has_pending_read_channel_inbox = pending_read_channel_inbox_pts != 0; - bool action_bar_has_distance = action_bar == nullptr ? false : action_bar->distance >= 0; bool has_last_yet_unsent_message = last_message_id.is_valid() && last_message_id.is_yet_unsent(); bool has_active_group_call_id = active_group_call_id.is_valid(); bool has_message_ttl_setting = !message_ttl_setting.is_empty(); @@ -5179,11 +5178,12 @@ void MessagesManager::Dialog::store(StorerT &storer) const { bool has_theme_name = !theme_name.empty(); bool has_flags3 = true; bool has_pending_join_requests = pending_join_request_count != 0; + bool has_action_bar = action_bar != nullptr; BEGIN_STORE_FLAGS(); STORE_FLAG(has_draft_message); STORE_FLAG(has_last_database_message); STORE_FLAG(false); // legacy_know_can_report_spam - STORE_FLAG(action_bar == nullptr ? false : action_bar->can_report_spam); + STORE_FLAG(false); // action_bar->can_report_spam STORE_FLAG(has_first_database_message_id); STORE_FLAG(false); // legacy_is_pinned STORE_FLAG(has_first_database_message_id_by_index); @@ -5221,15 +5221,15 @@ void MessagesManager::Dialog::store(StorerT &storer) const { STORE_FLAG(is_folder_id_inited); STORE_FLAG(has_pending_read_channel_inbox); STORE_FLAG(know_action_bar); - STORE_FLAG(action_bar == nullptr ? false : action_bar->can_add_contact); - STORE_FLAG(action_bar == nullptr ? false : action_bar->can_block_user); - STORE_FLAG(action_bar == nullptr ? false : action_bar->can_share_phone_number); - STORE_FLAG(action_bar == nullptr ? false : action_bar->can_report_location); + STORE_FLAG(false); // action_bar->can_add_contact + STORE_FLAG(false); // action_bar->can_block_user + STORE_FLAG(false); // action_bar->can_share_phone_number + STORE_FLAG(false); // action_bar->can_report_location STORE_FLAG(has_scheduled_server_messages); STORE_FLAG(has_scheduled_database_messages); STORE_FLAG(need_repair_channel_server_unread_count); - STORE_FLAG(action_bar == nullptr ? false : action_bar->can_unarchive); - STORE_FLAG(action_bar_has_distance); + STORE_FLAG(false); // action_bar->can_unarchive + STORE_FLAG(false); // action_bar_has_distance STORE_FLAG(hide_distance); STORE_FLAG(has_last_yet_unsent_message); STORE_FLAG(is_blocked); @@ -5237,7 +5237,7 @@ void MessagesManager::Dialog::store(StorerT &storer) const { STORE_FLAG(has_active_group_call); STORE_FLAG(is_group_call_empty); STORE_FLAG(has_active_group_call_id); - STORE_FLAG(action_bar == nullptr ? false : action_bar->can_invite_members); + STORE_FLAG(false); // action_bar->can_invite_members STORE_FLAG(has_message_ttl_setting); STORE_FLAG(is_message_ttl_setting_inited); STORE_FLAG(has_default_join_group_call_as_dialog_id); @@ -5252,6 +5252,7 @@ void MessagesManager::Dialog::store(StorerT &storer) const { BEGIN_STORE_FLAGS(); STORE_FLAG(has_pending_join_requests); STORE_FLAG(need_repair_action_bar); + STORE_FLAG(has_action_bar); END_STORE_FLAGS(); } @@ -5333,9 +5334,6 @@ void MessagesManager::Dialog::store(StorerT &storer) const { store(pending_read_channel_inbox_max_message_id, storer); store(pending_read_channel_inbox_server_unread_count, storer); } - if (action_bar_has_distance) { - store(action_bar->distance, storer); - } if (has_active_group_call_id) { store(active_group_call_id, storer); } @@ -5352,6 +5350,9 @@ void MessagesManager::Dialog::store(StorerT &storer) const { store(pending_join_request_count, storer); store(pending_join_request_user_ids, storer); } + if (has_action_bar) { + store(action_bar, storer); + } } // do not forget to resolve dialog dependencies including dependencies of last_message @@ -5395,6 +5396,7 @@ void MessagesManager::Dialog::parse(ParserT &parser) { bool action_bar_can_unarchive = false; bool action_bar_has_distance = false; bool action_bar_can_invite_members = false; + bool has_action_bar = false; BEGIN_PARSE_FLAGS(); PARSE_FLAG(has_draft_message); PARSE_FLAG(has_last_database_message); @@ -5483,6 +5485,7 @@ void MessagesManager::Dialog::parse(ParserT &parser) { BEGIN_PARSE_FLAGS(); PARSE_FLAG(has_pending_join_requests); PARSE_FLAG(need_repair_action_bar); + PARSE_FLAG(has_action_bar); END_PARSE_FLAGS(); } else { need_repair_action_bar = false; @@ -5619,10 +5622,12 @@ void MessagesManager::Dialog::parse(ParserT &parser) { parse(pending_join_request_count, parser); parse(pending_join_request_user_ids, parser); } - if (legacy_know_can_report_spam && !know_action_bar) { - action_bar_can_report_spam = false; + if (has_action_bar) { + parse(action_bar, parser); } - if (know_action_bar) { + + (void)legacy_know_can_report_spam; + if (know_action_bar && !has_action_bar) { action_bar = DialogActionBar::create(action_bar_can_report_spam, action_bar_can_add_contact, action_bar_can_block_user, action_bar_can_share_phone_number, action_bar_can_report_location, action_bar_can_unarchive, From 46b8aeab97accffce8d2bfb5e5c50c0b62267c91 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 23 Nov 2021 12:05:32 +0300 Subject: [PATCH 09/17] Make DialogActionBar fields private. --- td/telegram/DialogActionBar.cpp | 237 ++++++++++++++++---------------- td/telegram/DialogActionBar.h | 63 +++++---- td/telegram/MessagesManager.cpp | 4 +- td/telegram/MessagesManager.h | 2 +- 4 files changed, 159 insertions(+), 147 deletions(-) diff --git a/td/telegram/DialogActionBar.cpp b/td/telegram/DialogActionBar.cpp index 663ec7207..0fdab829c 100644 --- a/td/telegram/DialogActionBar.cpp +++ b/td/telegram/DialogActionBar.cpp @@ -20,62 +20,62 @@ unique_ptr DialogActionBar::create(bool can_report_spam, bool c } auto action_bar = make_unique(); - action_bar->can_report_spam = can_report_spam; - action_bar->can_add_contact = can_add_contact; - action_bar->can_block_user = can_block_user; - action_bar->can_share_phone_number = can_share_phone_number; - action_bar->can_report_location = can_report_location; - action_bar->can_unarchive = can_unarchive; - action_bar->distance = distance >= 0 ? distance : -1; - action_bar->can_invite_members = can_invite_members; + action_bar->can_report_spam_ = can_report_spam; + action_bar->can_add_contact_ = can_add_contact; + action_bar->can_block_user_ = can_block_user; + action_bar->can_share_phone_number_ = can_share_phone_number; + action_bar->can_report_location_ = can_report_location; + action_bar->can_unarchive_ = can_unarchive; + action_bar->distance_ = distance >= 0 ? distance : -1; + action_bar->can_invite_members_ = can_invite_members; return action_bar; } bool DialogActionBar::is_empty() const { - return !can_report_spam && !can_add_contact && !can_block_user && !can_share_phone_number && !can_report_location && - !can_invite_members; + return !can_report_spam_ && !can_add_contact_ && !can_block_user_ && !can_share_phone_number_ && + !can_report_location_ && !can_invite_members_; } void DialogActionBar::fix(Td *td, DialogId dialog_id, bool is_dialog_blocked, FolderId folder_id) { auto dialog_type = dialog_id.get_type(); - if (distance >= 0 && dialog_type != DialogType::User) { - LOG(ERROR) << "Receive distance " << distance << " to " << dialog_id; - distance = -1; + if (distance_ >= 0 && dialog_type != DialogType::User) { + LOG(ERROR) << "Receive distance_ " << distance_ << " to " << dialog_id; + distance_ = -1; } - if (can_report_location) { + if (can_report_location_) { if (dialog_type != DialogType::Channel) { - LOG(ERROR) << "Receive can_report_location in " << dialog_id; - can_report_location = false; - } else if (can_report_spam || can_add_contact || can_block_user || can_share_phone_number || can_unarchive || - can_invite_members) { - LOG(ERROR) << "Receive action bar " << can_report_spam << "/" << can_add_contact << "/" << can_block_user << "/" - << can_share_phone_number << "/" << can_report_location << "/" << can_unarchive << "/" - << can_invite_members; - can_report_spam = false; - can_add_contact = false; - can_block_user = false; - can_share_phone_number = false; - can_unarchive = false; - can_invite_members = false; - CHECK(distance == -1); + LOG(ERROR) << "Receive can_report_location_ in " << dialog_id; + can_report_location_ = false; + } else if (can_report_spam_ || can_add_contact_ || can_block_user_ || can_share_phone_number_ || can_unarchive_ || + can_invite_members_) { + LOG(ERROR) << "Receive action bar " << can_report_spam_ << "/" << can_add_contact_ << "/" << can_block_user_ + << "/" << can_share_phone_number_ << "/" << can_report_location_ << "/" << can_unarchive_ << "/" + << can_invite_members_; + can_report_spam_ = false; + can_add_contact_ = false; + can_block_user_ = false; + can_share_phone_number_ = false; + can_unarchive_ = false; + can_invite_members_ = false; + CHECK(distance_ == -1); } } - if (can_invite_members) { + if (can_invite_members_) { if (dialog_type != DialogType::Chat && (dialog_type != DialogType::Channel || td->contacts_manager_->get_channel_type(dialog_id.get_channel_id()) == ContactsManager::ChannelType::Broadcast)) { - LOG(ERROR) << "Receive can_invite_members in " << dialog_id; - can_invite_members = false; - } else if (can_report_spam || can_add_contact || can_block_user || can_share_phone_number || can_unarchive) { - LOG(ERROR) << "Receive action bar " << can_report_spam << "/" << can_add_contact << "/" << can_block_user << "/" - << can_share_phone_number << "/" << can_unarchive << "/" << can_invite_members; - can_report_spam = false; - can_add_contact = false; - can_block_user = false; - can_share_phone_number = false; - can_unarchive = false; - CHECK(distance == -1); + LOG(ERROR) << "Receive can_invite_members_ in " << dialog_id; + can_invite_members_ = false; + } else if (can_report_spam_ || can_add_contact_ || can_block_user_ || can_share_phone_number_ || can_unarchive_) { + LOG(ERROR) << "Receive action bar " << can_report_spam_ << "/" << can_add_contact_ << "/" << can_block_user_ + << "/" << can_share_phone_number_ << "/" << can_unarchive_ << "/" << can_invite_members_; + can_report_spam_ = false; + can_add_contact_ = false; + can_block_user_ = false; + can_share_phone_number_ = false; + can_unarchive_ = false; + CHECK(distance_ == -1); } } if (dialog_type == DialogType::User) { @@ -84,151 +84,152 @@ void DialogActionBar::fix(Td *td, DialogId dialog_id, bool is_dialog_blocked, Fo bool is_deleted = td->contacts_manager_->is_user_deleted(user_id); bool is_contact = td->contacts_manager_->is_user_contact(user_id); if (is_me || is_dialog_blocked) { - can_report_spam = false; - can_unarchive = false; + can_report_spam_ = false; + can_unarchive_ = false; } if (is_me || is_dialog_blocked || is_deleted) { - can_share_phone_number = false; + can_share_phone_number_ = false; } if (is_me || is_dialog_blocked || is_deleted || is_contact) { - can_block_user = false; - can_add_contact = false; + can_block_user_ = false; + can_add_contact_ = false; } } if (folder_id != FolderId::archive()) { - can_unarchive = false; + can_unarchive_ = false; } - if (can_share_phone_number) { - CHECK(!can_report_location); - CHECK(!can_invite_members); + if (can_share_phone_number_) { + CHECK(!can_report_location_); + CHECK(!can_invite_members_); if (dialog_type != DialogType::User) { - LOG(ERROR) << "Receive can_share_phone_number in " << dialog_id; - can_share_phone_number = false; - } else if (can_report_spam || can_add_contact || can_block_user || can_unarchive || distance >= 0) { - LOG(ERROR) << "Receive action bar " << can_report_spam << "/" << can_add_contact << "/" << can_block_user << "/" - << can_share_phone_number << "/" << can_unarchive << "/" << distance; - can_report_spam = false; - can_add_contact = false; - can_block_user = false; - can_unarchive = false; + LOG(ERROR) << "Receive can_share_phone_number_ in " << dialog_id; + can_share_phone_number_ = false; + } else if (can_report_spam_ || can_add_contact_ || can_block_user_ || can_unarchive_ || distance_ >= 0) { + LOG(ERROR) << "Receive action bar " << can_report_spam_ << "/" << can_add_contact_ << "/" << can_block_user_ + << "/" << can_share_phone_number_ << "/" << can_unarchive_ << "/" << distance_; + can_report_spam_ = false; + can_add_contact_ = false; + can_block_user_ = false; + can_unarchive_ = false; } } - if (can_block_user) { - CHECK(!can_report_location); - CHECK(!can_invite_members); - CHECK(!can_share_phone_number); + if (can_block_user_) { + CHECK(!can_report_location_); + CHECK(!can_invite_members_); + CHECK(!can_share_phone_number_); if (dialog_type != DialogType::User) { - LOG(ERROR) << "Receive can_block_user in " << dialog_id; - can_block_user = false; - } else if (!can_report_spam || !can_add_contact) { - LOG(ERROR) << "Receive action bar " << can_report_spam << "/" << can_add_contact << "/" << can_block_user; - can_report_spam = true; - can_add_contact = true; + LOG(ERROR) << "Receive can_block_user_ in " << dialog_id; + can_block_user_ = false; + } else if (!can_report_spam_ || !can_add_contact_) { + LOG(ERROR) << "Receive action bar " << can_report_spam_ << "/" << can_add_contact_ << "/" << can_block_user_; + can_report_spam_ = true; + can_add_contact_ = true; } } - if (can_add_contact) { - CHECK(!can_report_location); - CHECK(!can_invite_members); - CHECK(!can_share_phone_number); + if (can_add_contact_) { + CHECK(!can_report_location_); + CHECK(!can_invite_members_); + CHECK(!can_share_phone_number_); if (dialog_type != DialogType::User) { - LOG(ERROR) << "Receive can_add_contact in " << dialog_id; - can_add_contact = false; - } else if (can_report_spam != can_block_user) { - LOG(ERROR) << "Receive action bar " << can_report_spam << "/" << can_add_contact << "/" << can_block_user; - can_report_spam = false; - can_block_user = false; - can_unarchive = false; + LOG(ERROR) << "Receive can_add_contact_ in " << dialog_id; + can_add_contact_ = false; + } else if (can_report_spam_ != can_block_user_) { + LOG(ERROR) << "Receive action bar " << can_report_spam_ << "/" << can_add_contact_ << "/" << can_block_user_; + can_report_spam_ = false; + can_block_user_ = false; + can_unarchive_ = false; } } - if (!can_block_user) { - distance = -1; + if (!can_block_user_) { + distance_ = -1; } - if (!can_report_spam) { - can_unarchive = false; + if (!can_report_spam_) { + can_unarchive_ = false; } } td_api::object_ptr DialogActionBar::get_chat_action_bar_object(DialogType dialog_type, bool hide_unarchive) const { - if (can_report_location) { + if (can_report_location_) { CHECK(dialog_type == DialogType::Channel); - CHECK(!can_share_phone_number && !can_block_user && !can_add_contact && !can_report_spam && !can_invite_members); + CHECK(!can_share_phone_number_ && !can_block_user_ && !can_add_contact_ && !can_report_spam_ && + !can_invite_members_); return td_api::make_object(); } - if (can_invite_members) { - CHECK(!can_share_phone_number && !can_block_user && !can_add_contact && !can_report_spam); + if (can_invite_members_) { + CHECK(!can_share_phone_number_ && !can_block_user_ && !can_add_contact_ && !can_report_spam_); return td_api::make_object(); } - if (can_share_phone_number) { + if (can_share_phone_number_) { CHECK(dialog_type == DialogType::User); - CHECK(!can_block_user && !can_add_contact && !can_report_spam); + CHECK(!can_block_user_ && !can_add_contact_ && !can_report_spam_); return td_api::make_object(); } if (hide_unarchive) { - if (can_add_contact) { + if (can_add_contact_) { return td_api::make_object(); } else { return nullptr; } } - if (can_block_user) { + if (can_block_user_) { CHECK(dialog_type == DialogType::User); - CHECK(can_report_spam && can_add_contact); - return td_api::make_object(can_unarchive, distance); + CHECK(can_report_spam_ && can_add_contact_); + return td_api::make_object(can_unarchive_, distance_); } - if (can_add_contact) { + if (can_add_contact_) { CHECK(dialog_type == DialogType::User); - CHECK(!can_report_spam); + CHECK(!can_report_spam_); return td_api::make_object(); } - if (can_report_spam) { - return td_api::make_object(can_unarchive); + if (can_report_spam_) { + return td_api::make_object(can_unarchive_); } return nullptr; } bool DialogActionBar::on_dialog_unarchived() { - if (!can_unarchive) { + if (!can_unarchive_) { return false; } - can_unarchive = false; - can_report_spam = false; - can_block_user = false; - // keep can_add_contact + can_unarchive_ = false; + can_report_spam_ = false; + can_block_user_ = false; + // keep can_add_contact_ return true; } bool DialogActionBar::on_user_contact_added() { - if (!can_block_user && !can_add_contact) { + if (!can_block_user_ && !can_add_contact_) { return false; } - can_block_user = false; - can_add_contact = false; - // keep can_unarchive - distance = -1; + can_block_user_ = false; + can_add_contact_ = false; + // keep can_unarchive_ + distance_ = -1; return true; } bool DialogActionBar::on_user_deleted() { - if (!can_share_phone_number && !can_block_user && !can_add_contact && distance < 0) { + if (!can_share_phone_number_ && !can_block_user_ && !can_add_contact_ && distance_ < 0) { return false; } - can_share_phone_number = false; - can_block_user = false; - can_add_contact = false; - distance = -1; + can_share_phone_number_ = false; + can_block_user_ = false; + can_add_contact_ = false; + distance_ = -1; return true; } bool DialogActionBar::on_outgoing_message() { - if (distance < 0) { + if (distance_ < 0) { return false; } - distance = -1; + distance_ = -1; return true; } @@ -239,10 +240,10 @@ bool operator==(const unique_ptr &lhs, const unique_ptrcan_report_spam == rhs->can_report_spam && lhs->can_add_contact == rhs->can_add_contact && - lhs->can_block_user == rhs->can_block_user && lhs->can_share_phone_number == rhs->can_share_phone_number && - lhs->can_report_location == rhs->can_report_location && lhs->can_unarchive == rhs->can_unarchive && - lhs->distance == rhs->distance && lhs->can_invite_members == rhs->can_invite_members; + return lhs->can_report_spam_ == rhs->can_report_spam_ && lhs->can_add_contact_ == rhs->can_add_contact_ && + lhs->can_block_user_ == rhs->can_block_user_ && lhs->can_share_phone_number_ == rhs->can_share_phone_number_ && + lhs->can_report_location_ == rhs->can_report_location_ && lhs->can_unarchive_ == rhs->can_unarchive_ && + lhs->distance_ == rhs->distance_ && lhs->can_invite_members_ == rhs->can_invite_members_; } } // namespace td diff --git a/td/telegram/DialogActionBar.h b/td/telegram/DialogActionBar.h index ce9992afb..f395c0daf 100644 --- a/td/telegram/DialogActionBar.h +++ b/td/telegram/DialogActionBar.h @@ -17,23 +17,34 @@ namespace td { class Td; -struct DialogActionBar { - int32 distance = -1; // distance to the peer +class DialogActionBar { + int32 distance_ = -1; // distance to the peer - bool can_report_spam = false; - bool can_add_contact = false; - bool can_block_user = false; - bool can_share_phone_number = false; - bool can_report_location = false; - bool can_unarchive = false; - bool can_invite_members = false; + bool can_report_spam_ = false; + bool can_add_contact_ = false; + bool can_block_user_ = false; + bool can_share_phone_number_ = false; + bool can_report_location_ = false; + bool can_unarchive_ = false; + bool can_invite_members_ = false; + friend bool operator==(const unique_ptr &lhs, const unique_ptr &rhs); + + public: static unique_ptr create(bool can_report_spam, bool can_add_contact, bool can_block_user, bool can_share_phone_number, bool can_report_location, bool can_unarchive, int32 distance, bool can_invite_members); bool is_empty() const; + bool can_report_spam() const { + return can_report_spam_; + } + + bool can_unarchive() const { + return can_unarchive_; + } + td_api::object_ptr get_chat_action_bar_object(DialogType dialog_type, bool hide_unarchive) const; @@ -49,19 +60,19 @@ struct DialogActionBar { template void store(StorerT &storer) const { - bool has_distance = distance >= 0; + bool has_distance = distance_ >= 0; BEGIN_STORE_FLAGS(); - STORE_FLAG(can_report_spam); - STORE_FLAG(can_add_contact); - STORE_FLAG(can_block_user); - STORE_FLAG(can_share_phone_number); - STORE_FLAG(can_report_location); - STORE_FLAG(can_unarchive); - STORE_FLAG(can_invite_members); + STORE_FLAG(can_report_spam_); + STORE_FLAG(can_add_contact_); + STORE_FLAG(can_block_user_); + STORE_FLAG(can_share_phone_number_); + STORE_FLAG(can_report_location_); + STORE_FLAG(can_unarchive_); + STORE_FLAG(can_invite_members_); STORE_FLAG(has_distance); END_STORE_FLAGS(); if (has_distance) { - td::store(distance, storer); + td::store(distance_, storer); } } @@ -69,17 +80,17 @@ struct DialogActionBar { void parse(ParserT &parser) { bool has_distance; BEGIN_PARSE_FLAGS(); - PARSE_FLAG(can_report_spam); - PARSE_FLAG(can_add_contact); - PARSE_FLAG(can_block_user); - PARSE_FLAG(can_share_phone_number); - PARSE_FLAG(can_report_location); - PARSE_FLAG(can_unarchive); - PARSE_FLAG(can_invite_members); + PARSE_FLAG(can_report_spam_); + PARSE_FLAG(can_add_contact_); + PARSE_FLAG(can_block_user_); + PARSE_FLAG(can_share_phone_number_); + PARSE_FLAG(can_report_location_); + PARSE_FLAG(can_unarchive_); + PARSE_FLAG(can_invite_members_); PARSE_FLAG(has_distance); END_PARSE_FLAGS(); if (has_distance) { - td::parse(distance, parser); + td::parse(distance_, parser); } } }; diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 45892463a..a36e712aa 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -8151,7 +8151,7 @@ void MessagesManager::report_dialog(DialogId dialog_id, const vector } } is_dialog_spam_report = user_d->know_action_bar; - can_report_spam = user_d->action_bar != nullptr && user_d->action_bar->can_report_spam; + can_report_spam = user_d->action_bar != nullptr && user_d->action_bar->can_report_spam(); } if (is_dialog_spam_report && can_report_spam) { @@ -30372,7 +30372,7 @@ void MessagesManager::do_set_dialog_folder_id(Dialog *d, FolderId folder_id) { auto user_id = td_->contacts_manager_->get_secret_chat_user_id(d->dialog_id.get_secret_chat_id()); if (d->is_update_new_chat_sent && user_id.is_valid()) { const Dialog *user_d = get_dialog(DialogId(user_id)); - if (user_d != nullptr && user_d->action_bar != nullptr && user_d->action_bar->can_unarchive) { + if (user_d != nullptr && user_d->action_bar != nullptr && user_d->action_bar->can_unarchive()) { send_closure( G()->td(), &Td::send_update, td_api::make_object(d->dialog_id.get(), get_chat_action_bar_object(d))); diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 74d12006a..bc21ba0ed 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -86,7 +86,7 @@ namespace td { struct BinlogEvent; struct Dependencies; -struct DialogActionBar; +class DialogActionBar; class DialogFilter; class DraftMessage; struct InputMessageContent; From 0e96d23e410aee86303a52b6bf1af1d350a3b3aa Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 23 Nov 2021 12:10:49 +0300 Subject: [PATCH 10/17] Rename hide_distance to has_outgoing_messages. --- td/telegram/MessagesManager.cpp | 30 +++++++++++++++--------------- td/telegram/MessagesManager.h | 4 ++-- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index a36e712aa..aec5b3a7f 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -5230,7 +5230,7 @@ void MessagesManager::Dialog::store(StorerT &storer) const { STORE_FLAG(need_repair_channel_server_unread_count); STORE_FLAG(false); // action_bar->can_unarchive STORE_FLAG(false); // action_bar_has_distance - STORE_FLAG(hide_distance); + STORE_FLAG(has_outgoing_messages); STORE_FLAG(has_last_yet_unsent_message); STORE_FLAG(is_blocked); STORE_FLAG(is_is_blocked_inited); @@ -5448,7 +5448,7 @@ void MessagesManager::Dialog::parse(ParserT &parser) { PARSE_FLAG(need_repair_channel_server_unread_count); PARSE_FLAG(action_bar_can_unarchive); PARSE_FLAG(action_bar_has_distance); - PARSE_FLAG(hide_distance); + PARSE_FLAG(has_outgoing_messages); PARSE_FLAG(had_last_yet_unsent_message); PARSE_FLAG(is_blocked); PARSE_FLAG(is_is_blocked_inited); @@ -5470,7 +5470,7 @@ void MessagesManager::Dialog::parse(ParserT &parser) { has_scheduled_server_messages = false; has_scheduled_database_messages = false; need_repair_channel_server_unread_count = false; - hide_distance = false; + has_outgoing_messages = false; had_last_yet_unsent_message = false; is_blocked = false; is_is_blocked_inited = false; @@ -5628,10 +5628,10 @@ void MessagesManager::Dialog::parse(ParserT &parser) { (void)legacy_know_can_report_spam; if (know_action_bar && !has_action_bar) { - action_bar = DialogActionBar::create(action_bar_can_report_spam, action_bar_can_add_contact, - action_bar_can_block_user, action_bar_can_share_phone_number, - action_bar_can_report_location, action_bar_can_unarchive, - hide_distance ? -1 : action_bar_distance, action_bar_can_invite_members); + action_bar = DialogActionBar::create( + action_bar_can_report_spam, action_bar_can_add_contact, action_bar_can_block_user, + action_bar_can_share_phone_number, action_bar_can_report_location, action_bar_can_unarchive, + has_outgoing_messages ? -1 : action_bar_distance, action_bar_can_invite_members); } } @@ -8232,7 +8232,7 @@ void MessagesManager::on_get_peer_settings(DialogId dialog_id, auto distance = (peer_settings->flags_ & telegram_api::peerSettings::GEO_DISTANCE_MASK) != 0 ? peer_settings->geo_distance_ : -1; - if (distance < -1 || d->hide_distance) { + if (distance < -1 || d->has_outgoing_messages) { distance = -1; } auto action_bar = @@ -32870,7 +32870,7 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq update_used_hashtags(dialog_id, m); update_top_dialogs(dialog_id, m); cancel_user_dialog_action(dialog_id, m); - try_hide_distance(dialog_id, m); + update_has_outgoing_messages(dialog_id, m); if (!td_->auth_manager_->is_bot() && d->messages == nullptr && !m->is_outgoing && dialog_id != get_my_dialog_id()) { switch (dialog_type) { @@ -33082,7 +33082,7 @@ MessagesManager::Message *MessagesManager::add_scheduled_message_to_dialog(Dialo if (from_update) { update_sent_message_contents(dialog_id, m); update_used_hashtags(dialog_id, m); - try_hide_distance(dialog_id, m); + update_has_outgoing_messages(dialog_id, m); } if (m->message_id.is_scheduled_server()) { @@ -36692,7 +36692,7 @@ void MessagesManager::update_forward_count(DialogId dialog_id, MessageId message } } -void MessagesManager::try_hide_distance(DialogId dialog_id, const Message *m) { +void MessagesManager::update_has_outgoing_messages(DialogId dialog_id, const Message *m) { CHECK(m != nullptr); if (td_->auth_manager_->is_bot() || (!m->is_outgoing && dialog_id != get_my_dialog_id())) { return; @@ -36709,19 +36709,19 @@ void MessagesManager::try_hide_distance(DialogId dialog_id, const Message *m) { case DialogType::SecretChat: { auto user_id = td_->contacts_manager_->get_secret_chat_user_id(dialog_id.get_secret_chat_id()); if (user_id.is_valid()) { - d = get_dialog_force(DialogId(user_id), "try_hide_distance"); + d = get_dialog_force(DialogId(user_id), "update_has_outgoing_messages"); } break; } default: UNREACHABLE(); } - if (d == nullptr || d->hide_distance) { + if (d == nullptr || d->has_outgoing_messages) { return; } - d->hide_distance = true; - on_dialog_updated(dialog_id, "try_hide_distance"); + d->has_outgoing_messages = true; + on_dialog_updated(dialog_id, "update_has_outgoing_messages"); if (d->action_bar != nullptr && d->action_bar->on_outgoing_message()) { send_update_chat_action_bar(d); diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index bc21ba0ed..f70edd7f0 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -1232,7 +1232,7 @@ class MessagesManager final : public Actor { bool need_repair_action_bar = false; bool know_action_bar = false; - bool hide_distance = false; + bool has_outgoing_messages = false; bool is_opened = false; bool was_opened = false; @@ -3052,7 +3052,7 @@ class MessagesManager final : public Actor { void update_forward_count(DialogId dialog_id, MessageId message_id, int32 update_date); - void try_hide_distance(DialogId dialog_id, const Message *m); + void update_has_outgoing_messages(DialogId dialog_id, const Message *m); string get_message_search_text(const Message *m) const; From 2725f7c58a2e1c33f25b8306eeeb6ca8b2a41247 Mon Sep 17 00:00:00 2001 From: levlam Date: Wed, 24 Nov 2021 12:53:38 +0300 Subject: [PATCH 11/17] Move get_link_user_id to LinkManager. --- td/telegram/LinkManager.cpp | 44 ++++++++++++++++++++++++++++++++ td/telegram/LinkManager.h | 3 +++ td/telegram/MessageEntity.cpp | 48 +++-------------------------------- 3 files changed, 50 insertions(+), 45 deletions(-) diff --git a/td/telegram/LinkManager.cpp b/td/telegram/LinkManager.cpp index d377ebead..c0e75f264 100644 --- a/td/telegram/LinkManager.cpp +++ b/td/telegram/LinkManager.cpp @@ -35,6 +35,8 @@ #include "td/utils/StringBuilder.h" #include "td/utils/Time.h" +#include + namespace td { static bool is_valid_start_parameter(Slice start_parameter) { @@ -1233,6 +1235,48 @@ string LinkManager::get_dialog_invite_link_hash(Slice invite_link) { return get_url_query_hash(link_info.is_tg_, url_query); } +UserId LinkManager::get_link_user_id(Slice url) { + string lower_cased_url = to_lower(url); + url = lower_cased_url; + + Slice link_scheme("tg:"); + if (!begins_with(url, link_scheme)) { + return UserId(); + } + url.remove_prefix(link_scheme.size()); + if (begins_with(url, "//")) { + url.remove_prefix(2); + } + + Slice host("user"); + if (!begins_with(url, host)) { + return UserId(); + } + url.remove_prefix(host.size()); + if (begins_with(url, "/")) { + url.remove_prefix(1); + } + if (!begins_with(url, "?")) { + return UserId(); + } + url.remove_prefix(1); + url.truncate(url.find('#')); + + for (auto parameter : full_split(url, '&')) { + Slice key; + Slice value; + std::tie(key, value) = split(parameter, '='); + if (key == Slice("id")) { + auto r_user_id = to_integer_safe(value); + if (r_user_id.is_error()) { + return UserId(); + } + return UserId(r_user_id.ok()); + } + } + return UserId(); +} + Result LinkManager::get_message_link_info(Slice url) { if (url.empty()) { return Status::Error("URL must be non-empty"); diff --git a/td/telegram/LinkManager.h b/td/telegram/LinkManager.h index e55c7e57f..2bc65a72b 100644 --- a/td/telegram/LinkManager.h +++ b/td/telegram/LinkManager.h @@ -9,6 +9,7 @@ #include "td/telegram/FullMessageId.h" #include "td/telegram/MessageLinkInfo.h" #include "td/telegram/td_api.h" +#include "td/telegram/UserId.h" #include "td/actor/actor.h" #include "td/actor/PromiseFuture.h" @@ -69,6 +70,8 @@ class LinkManager final : public Actor { static string get_dialog_invite_link_hash(Slice invite_link); + static UserId get_link_user_id(Slice url); + static Result get_message_link_info(Slice url); private: diff --git a/td/telegram/MessageEntity.cpp b/td/telegram/MessageEntity.cpp index c091b7ec7..af43bad42 100644 --- a/td/telegram/MessageEntity.cpp +++ b/td/telegram/MessageEntity.cpp @@ -1773,48 +1773,6 @@ string get_first_url(Slice text, const vector &entities) { return string(); } -static UserId get_link_user_id(Slice url) { - string lower_cased_url = to_lower(url); - url = lower_cased_url; - - Slice link_scheme("tg:"); - if (!begins_with(url, link_scheme)) { - return UserId(); - } - url.remove_prefix(link_scheme.size()); - if (begins_with(url, "//")) { - url.remove_prefix(2); - } - - Slice host("user"); - if (!begins_with(url, host)) { - return UserId(); - } - url.remove_prefix(host.size()); - if (begins_with(url, "/")) { - url.remove_prefix(1); - } - if (!begins_with(url, "?")) { - return UserId(); - } - url.remove_prefix(1); - url.truncate(url.find('#')); - - for (auto parameter : full_split(url, '&')) { - Slice key; - Slice value; - std::tie(key, value) = split(parameter, '='); - if (key == Slice("id")) { - auto r_user_id = to_integer_safe(value); - if (r_user_id.is_error()) { - return UserId(); - } - return UserId(r_user_id.ok()); - } - } - return UserId(); -} - Result> parse_markdown(string &text) { string result; vector entities; @@ -1900,7 +1858,7 @@ Result> parse_markdown(string &text) { url.push_back(text[i++]); } } - auto user_id = get_link_user_id(url); + auto user_id = LinkManager::get_link_user_id(url); if (user_id.is_valid()) { entities.emplace_back(entity_offset, entity_length, user_id); } else { @@ -2106,7 +2064,7 @@ static Result> do_parse_markdown_v2(CSlice text, string &r return Status::Error(400, PSLICE() << "Can't find end of a URL at byte offset " << url_begin_pos); } } - user_id = get_link_user_id(url); + user_id = LinkManager::get_link_user_id(url); if (!user_id.is_valid()) { auto r_url = LinkManager::check_link(url); if (r_url.is_error()) { @@ -3056,7 +3014,7 @@ static Result> do_parse_html(CSlice text, string &result) if (url.empty()) { url = result.substr(nested_entities.back().entity_begin_pos); } - auto user_id = get_link_user_id(url); + auto user_id = LinkManager::get_link_user_id(url); if (user_id.is_valid()) { entities.emplace_back(entity_offset, entity_length, user_id); } else { From c49c5954ed5c8ba7b35dc925ae6f9db32cc5f341 Mon Sep 17 00:00:00 2001 From: levlam Date: Thu, 25 Nov 2021 14:18:06 +0300 Subject: [PATCH 12/17] Immediately drop User.is_changed flags after usage. --- td/telegram/ContactsManager.cpp | 15 +++++---------- td/telegram/ContactsManager.h | 1 - 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index feba1b1ed..e408dbbd3 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -9530,6 +9530,7 @@ void ContactsManager::update_user(User *u, UserId user_id, bool from_binlog, boo CHECK(u != nullptr); if (u->is_name_changed || u->is_username_changed || u->is_is_contact_changed) { update_contacts_hints(u, user_id, from_database); + u->is_username_changed = false; } if (u->is_is_contact_changed) { td_->messages_manager_->on_dialog_user_is_contact_updated(DialogId(user_id), u->is_contact); @@ -9540,6 +9541,7 @@ void ContactsManager::update_user(User *u, UserId user_id, bool from_binlog, boo update_user_full(user_full, user_id, "update_user"); } } + u->is_is_contact_changed = false; } if (u->is_is_deleted_changed) { td_->messages_manager_->on_dialog_user_is_deleted_updated(DialogId(user_id), u->is_deleted); @@ -9549,6 +9551,7 @@ void ContactsManager::update_user(User *u, UserId user_id, bool from_binlog, boo drop_user_full(user_id); } } + u->is_is_deleted_changed = false; } if (u->is_name_changed) { auto messages_manager = td_->messages_manager_.get(); @@ -9556,6 +9559,7 @@ void ContactsManager::update_user(User *u, UserId user_id, bool from_binlog, boo for_each_secret_chat_with_user(user_id, [messages_manager](SecretChatId secret_chat_id) { messages_manager->on_dialog_title_updated(DialogId(secret_chat_id)); }); + u->is_name_changed = false; } if (u->is_photo_changed) { auto messages_manager = td_->messages_manager_.get(); @@ -9563,6 +9567,7 @@ void ContactsManager::update_user(User *u, UserId user_id, bool from_binlog, boo for_each_secret_chat_with_user(user_id, [messages_manager](SecretChatId secret_chat_id) { messages_manager->on_dialog_photo_updated(DialogId(secret_chat_id)); }); + u->is_photo_changed = false; } if (u->is_status_changed && user_id != get_my_id()) { auto left_time = get_user_was_online(u, user_id) - G()->server_time_cached(); @@ -9575,9 +9580,6 @@ void ContactsManager::update_user(User *u, UserId user_id, bool from_binlog, boo user_online_timeout_.cancel_timeout(user_id.get()); } } - if (u->is_default_permissions_changed) { - td_->messages_manager_->on_dialog_permissions_updated(DialogId(user_id)); - } if (!td_->auth_manager_->is_bot()) { if (u->restriction_reasons.empty()) { restricted_user_ids_.erase(user_id); @@ -9586,13 +9588,6 @@ void ContactsManager::update_user(User *u, UserId user_id, bool from_binlog, boo } } - u->is_name_changed = false; - u->is_username_changed = false; - u->is_photo_changed = false; - u->is_is_contact_changed = false; - u->is_is_deleted_changed = false; - u->is_default_permissions_changed = false; - if (u->is_deleted) { td_->inline_queries_manager_->remove_recent_inline_bot(user_id, Promise<>()); } diff --git a/td/telegram/ContactsManager.h b/td/telegram/ContactsManager.h index b7336ea02..23e742e67 100644 --- a/td/telegram/ContactsManager.h +++ b/td/telegram/ContactsManager.h @@ -640,7 +640,6 @@ class ContactsManager final : public Actor { bool is_photo_changed = true; bool is_is_contact_changed = true; bool is_is_deleted_changed = true; - bool is_default_permissions_changed = true; bool is_changed = true; // have new changes that need to be sent to the client and database bool need_save_to_database = true; // have new changes that need only to be saved to the database bool is_status_changed = true; From 25baedaa34835b6afe34304a97bb5d57995fb9b1 Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 26 Nov 2021 14:48:43 +0300 Subject: [PATCH 13/17] Move dismiss_suggested_action to SuggestedAction.cpp. --- td/telegram/ContactsManager.cpp | 11 +---------- td/telegram/ContactsManager.h | 2 +- td/telegram/SuggestedAction.cpp | 21 +++++++++++++++++++++ td/telegram/SuggestedAction.h | 4 ++++ td/telegram/Td.cpp | 2 +- 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index e408dbbd3..5a7b91e47 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -7594,17 +7594,8 @@ void ContactsManager::remove_dialog_suggested_action(SuggestedAction action) { } } -void ContactsManager::dismiss_suggested_action(SuggestedAction action, Promise &&promise) { - if (action.is_empty()) { - return promise.set_error(Status::Error(400, "Action must be non-empty")); - } +void ContactsManager::dismiss_dialog_suggested_action(SuggestedAction action, Promise &&promise) { auto dialog_id = action.dialog_id_; - if (dialog_id == DialogId()) { - send_closure_later(G()->config_manager(), &ConfigManager::dismiss_suggested_action, std::move(action), - std::move(promise)); - return; - } - if (!td_->messages_manager_->have_dialog(dialog_id)) { return promise.set_error(Status::Error(400, "Chat not found")); } diff --git a/td/telegram/ContactsManager.h b/td/telegram/ContactsManager.h index 23e742e67..6f00e8ac2 100644 --- a/td/telegram/ContactsManager.h +++ b/td/telegram/ContactsManager.h @@ -418,7 +418,7 @@ class ContactsManager final : public Actor { vector get_inactive_channels(Promise &&promise); - void dismiss_suggested_action(SuggestedAction action, Promise &&promise); + void dismiss_dialog_suggested_action(SuggestedAction action, Promise &&promise); bool is_user_contact(UserId user_id, bool is_mutual = false) const; diff --git a/td/telegram/SuggestedAction.cpp b/td/telegram/SuggestedAction.cpp index 97251965a..57721ffe5 100644 --- a/td/telegram/SuggestedAction.cpp +++ b/td/telegram/SuggestedAction.cpp @@ -7,6 +7,8 @@ #include "td/telegram/SuggestedAction.h" #include "td/telegram/ChannelId.h" +#include "td/telegram/ConfigManager.h" +#include "td/telegram/ContactsManager.h" #include "td/telegram/Global.h" #include "td/telegram/Td.h" @@ -151,4 +153,23 @@ void remove_suggested_action(vector &suggested_actions, Suggest } } +void dismiss_suggested_action(SuggestedAction action, Promise &&promise) { + switch (action.type_) { + case SuggestedAction::Type::Empty: + return promise.set_error(Status::Error(400, "Action must be non-empty")); + case SuggestedAction::Type::EnableArchiveAndMuteNewChats: + case SuggestedAction::Type::CheckPassword: + case SuggestedAction::Type::CheckPhoneNumber: + case SuggestedAction::Type::SeeTicksHint: + return send_closure_later(G()->config_manager(), &ConfigManager::dismiss_suggested_action, std::move(action), + std::move(promise)); + case SuggestedAction::Type::ConvertToGigagroup: + return send_closure_later(G()->contacts_manager(), &ContactsManager::dismiss_dialog_suggested_action, + std::move(action), std::move(promise)); + default: + UNREACHABLE(); + return; + } +} + } // namespace td diff --git a/td/telegram/SuggestedAction.h b/td/telegram/SuggestedAction.h index a4e1b6df6..460a186bc 100644 --- a/td/telegram/SuggestedAction.h +++ b/td/telegram/SuggestedAction.h @@ -9,6 +9,8 @@ #include "td/telegram/DialogId.h" #include "td/telegram/td_api.h" +#include "td/actor/PromiseFuture.h" + #include "td/utils/common.h" #include "td/utils/Slice.h" @@ -70,4 +72,6 @@ void update_suggested_actions(vector &suggested_actions, void remove_suggested_action(vector &suggested_actions, SuggestedAction suggested_action); +void dismiss_suggested_action(SuggestedAction action, Promise &&promise); + } // namespace td diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index 0256df71c..678ea8c1f 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -7643,7 +7643,7 @@ void Td::on_request(uint64 id, td_api::stopPoll &request) { void Td::on_request(uint64 id, const td_api::hideSuggestedAction &request) { CHECK_IS_USER(); CREATE_OK_REQUEST_PROMISE(); - contacts_manager_->dismiss_suggested_action(SuggestedAction(request.action_), std::move(promise)); + dismiss_suggested_action(SuggestedAction(request.action_), std::move(promise)); } void Td::on_request(uint64 id, const td_api::getLoginUrlInfo &request) { From e79ec9469b1aa2f31119ad48ca65d82b7bc7367f Mon Sep 17 00:00:00 2001 From: levlam Date: Sat, 27 Nov 2021 13:36:17 +0300 Subject: [PATCH 14/17] Fix link in sponsoredMessage. --- td/telegram/SponsoredMessageManager.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/td/telegram/SponsoredMessageManager.cpp b/td/telegram/SponsoredMessageManager.cpp index 080a9543b..068e76823 100644 --- a/td/telegram/SponsoredMessageManager.cpp +++ b/td/telegram/SponsoredMessageManager.cpp @@ -168,13 +168,14 @@ td_api::object_ptr SponsoredMessageManager::get_sponso link = td_api::make_object(bot_username, sponsored_message.start_param); break; } - case DialogType::Channel: { - auto channel_id = sponsored_message.sponsor_dialog_id.get_channel_id(); - auto t_me = G()->shared_config().get_option_string("t_me_url", "https://t.me/"); - link = td_api::make_object( - PSTRING() << t_me << "/c" << channel_id.get() << '/' << sponsored_message.server_message_id.get()); + case DialogType::Channel: + if (sponsored_message.server_message_id.is_valid()) { + auto channel_id = sponsored_message.sponsor_dialog_id.get_channel_id(); + auto t_me = G()->shared_config().get_option_string("t_me_url", "https://t.me/"); + link = td_api::make_object( + PSTRING() << t_me << "c/" << channel_id.get() << '/' << sponsored_message.server_message_id.get()); + } break; - } default: break; } From 746c70900b05df664e19000b9fd19e49806c0117 Mon Sep 17 00:00:00 2001 From: levlam Date: Sat, 27 Nov 2021 22:22:51 +0300 Subject: [PATCH 15/17] Use different timeouts for different handshake parts. --- td/mtproto/Handshake.cpp | 21 ++++++++++++++------- td/mtproto/Handshake.h | 3 ++- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/td/mtproto/Handshake.cpp b/td/mtproto/Handshake.cpp index f47d2f8f1..421ad5788 100644 --- a/td/mtproto/Handshake.cpp +++ b/td/mtproto/Handshake.cpp @@ -50,17 +50,20 @@ AuthKeyHandshake::AuthKeyHandshake(int32 dc_id, int32 expires_in) : mode_(expires_in == 0 ? Mode::Main : Mode::Temp) , dc_id_(dc_id) , expires_in_(expires_in) - , timeout_at_(Time::now() + 1e9) { + , start_time_(Time::now()) + , timeout_in_(1e9) { } void AuthKeyHandshake::set_timeout_in(double timeout_in) { - timeout_at_ = Time::now() + timeout_in; + start_time_ = Time::now(); + timeout_in_ = timeout_in; } void AuthKeyHandshake::clear() { last_query_ = BufferSlice(); state_ = Start; - timeout_at_ = Time::now() + 1e9; + start_time_ = Time::now(); + timeout_in_ = 1e9; } bool AuthKeyHandshake::is_ready_for_finish() const { @@ -81,6 +84,10 @@ string AuthKeyHandshake::store_object(const mtproto_api::Object &object) { } Status AuthKeyHandshake::on_res_pq(Slice message, Callback *connection, PublicRsaKeyInterface *public_rsa_key) { + if (Time::now() >= start_time_ + timeout_in_ * 0.6) { + return Status::Error("Handshake ResPQ timeout expired"); + } + TRY_RESULT(res_pq, fetch_result(message, false)); if (res_pq->nonce_ != nonce_) { return Status::Error("Nonce mismatch"); @@ -155,6 +162,10 @@ Status AuthKeyHandshake::on_res_pq(Slice message, Callback *connection, PublicRs } Status AuthKeyHandshake::on_server_dh_params(Slice message, Callback *connection, DhCallback *dh_callback) { + if (Time::now() >= start_time_ + timeout_in_ * 0.8) { + return Status::Error("Handshake DH params timeout expired"); + } + TRY_RESULT(dh_params, fetch_result(message, false)); // server_DH_params_ok#d0e8075c nonce:int128 server_nonce:int128 encrypted_answer:string = Server_DH_Params; @@ -318,10 +329,6 @@ Status AuthKeyHandshake::on_start(Callback *connection) { Status AuthKeyHandshake::on_message(Slice message, Callback *connection, AuthKeyHandshakeContext *context) { Status status = [&] { - if (Time::now() >= timeout_at_) { - return Status::Error("Handshake timeout expired"); - } - switch (state_) { case ResPQ: return on_res_pq(message, connection, context->get_public_rsa_key_interface()); diff --git a/td/mtproto/Handshake.h b/td/mtproto/Handshake.h index b3979ed20..5baf7657d 100644 --- a/td/mtproto/Handshake.h +++ b/td/mtproto/Handshake.h @@ -82,7 +82,8 @@ class AuthKeyHandshake { int32 expires_in_ = 0; double expires_at_ = 0; - double timeout_at_ = 0; + double start_time_ = 0; + double timeout_in_ = 0; AuthKey auth_key_; double server_time_diff_ = 0; From 468fcc25643b6a8c873c14e5cd4c49de9c92f203 Mon Sep 17 00:00:00 2001 From: levlam Date: Sun, 28 Nov 2021 11:49:46 +0300 Subject: [PATCH 16/17] tg_cli: use '.' as currently opened chat. --- td/telegram/cli.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index 571b1f229..9fdde42df 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -440,6 +440,9 @@ class CliClient final : public Actor { if (str == "me") { return my_id_; } + if (str == ".") { + return opened_chat_id_; + } if (str[0] == '@') { str.remove_prefix(1); } @@ -2593,7 +2596,9 @@ class CliClient final : public Actor { } else if (op == "gdialog" || op == "gd") { send_request(td_api::make_object(as_chat_id(args))); } else if (op == "open") { - send_request(td_api::make_object(as_chat_id(args))); + auto chat_id = as_chat_id(args); + opened_chat_id_ = chat_id; + send_request(td_api::make_object(chat_id)); } else if (op == "close") { send_request(td_api::make_object(as_chat_id(args))); } else if (op == "gm") { @@ -4551,6 +4556,7 @@ class CliClient final : public Actor { int64 my_id_ = 0; string schedule_date_; string message_thread_id_; + int64 opened_chat_id_ = 0; ConcurrentScheduler *scheduler_{nullptr}; From 5dc5b473ea22ec89e7ad0fea7d793d5486020c21 Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 29 Nov 2021 15:09:13 +0300 Subject: [PATCH 17/17] Fix cache update in GetChatInviteImportersQuery. --- td/telegram/ContactsManager.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index 5a7b91e47..ef97fabe6 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -1599,6 +1599,7 @@ class GetChatInviteImportersQuery final : public Td::ResultHandler { class GetChatJoinRequestsQuery final : public Td::ResultHandler { Promise> promise_; DialogId dialog_id_; + bool is_full_list_ = false; public: explicit GetChatJoinRequestsQuery(Promise> &&promise) @@ -1608,6 +1609,8 @@ class GetChatJoinRequestsQuery final : public Td::ResultHandler { void send(DialogId dialog_id, const string &invite_link, const string &query, int32 offset_date, UserId offset_user_id, int32 limit) { dialog_id_ = dialog_id; + is_full_list_ = invite_link.empty() && query.empty() && offset_date == 0 && !offset_user_id.is_valid() && limit >= 3; + auto input_peer = td_->messages_manager_->get_input_peer(dialog_id, AccessRights::Write); if (input_peer == nullptr) { return on_error(Status::Error(400, "Can't access the chat")); @@ -1662,8 +1665,10 @@ class GetChatJoinRequestsQuery final : public Td::ResultHandler { join_requests.push_back(td_api::make_object( td_->contacts_manager_->get_user_id_object(user_id, "chatJoinRequest"), request->date_, request->about_)); } - td_->messages_manager_->on_update_dialog_pending_join_requests(dialog_id_, total_count, - std::move(recent_requesters)); + if (is_full_list_) { + td_->messages_manager_->on_update_dialog_pending_join_requests(dialog_id_, total_count, + std::move(recent_requesters)); + } promise_.set_value(td_api::make_object(total_count, std::move(join_requests))); }