From 8bbc32e21c5d3767b7061392143ec2e70105b046 Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 1 May 2020 01:21:02 +0300 Subject: [PATCH] Drop UserFull cache when phone number privacy is changed. GitOrigin-RevId: 4ff14b72fa4b903c9358a1a10023e7b5f3775ff8 --- td/telegram/ContactsManager.cpp | 8 +++++++ td/telegram/ContactsManager.h | 2 ++ td/telegram/PrivacyManager.cpp | 37 +++++++++++++++++++++------------ 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index c050b44f..f904cd37 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -6823,6 +6823,14 @@ void ContactsManager::on_update_online_status_privacy() { td_->create_handler()->send(); } +void ContactsManager::on_update_phone_number_privacy() { + // all UserFull.need_phone_number_privacy_exception can be outdated now, + // so mark all of them as expired + for (auto &it : users_full_) { + it.second->expires_at = 0.0; + } +} + UserId ContactsManager::get_user_id(const tl_object_ptr &user) { CHECK(user != nullptr); switch (user->get_id()) { diff --git a/td/telegram/ContactsManager.h b/td/telegram/ContactsManager.h index 60c168ad..6fa1ab75 100644 --- a/td/telegram/ContactsManager.h +++ b/td/telegram/ContactsManager.h @@ -256,6 +256,8 @@ class ContactsManager : public Actor { void on_update_online_status_privacy(); + void on_update_phone_number_privacy(); + void on_channel_unban_timeout(ChannelId channel_id); void check_dialog_username(DialogId dialog_id, const string &username, Promise &&promise); diff --git a/td/telegram/PrivacyManager.cpp b/td/telegram/PrivacyManager.cpp index fd404890..d33c5f74 100644 --- a/td/telegram/PrivacyManager.cpp +++ b/td/telegram/PrivacyManager.cpp @@ -519,23 +519,34 @@ void PrivacyManager::do_update_privacy(UserPrivacySetting user_privacy_setting, info.is_synchronized = true; if (!(info.rules == privacy_rules)) { - if ((from_update || was_synchronized) && user_privacy_setting.type() == UserPrivacySetting::Type::UserStatus && - !G()->close_flag()) { - send_closure_later(G()->contacts_manager(), &ContactsManager::on_update_online_status_privacy); + if ((from_update || was_synchronized) && !G()->close_flag()) { + switch (user_privacy_setting.type()) { + case UserPrivacySetting::Type::UserStatus: { + send_closure_later(G()->contacts_manager(), &ContactsManager::on_update_online_status_privacy); - auto old_restricted = info.rules.get_restricted_user_ids(); - auto new_restricted = privacy_rules.get_restricted_user_ids(); - if (old_restricted != new_restricted) { - // if a user was unrestricted, it is not received from the server anymore - // we need to reget their online status manually - std::vector unrestricted; - std::set_difference(old_restricted.begin(), old_restricted.end(), new_restricted.begin(), new_restricted.end(), - std::back_inserter(unrestricted)); - for (auto &user_id : unrestricted) { - send_closure_later(G()->contacts_manager(), &ContactsManager::reload_user, UserId(user_id), Promise()); + auto old_restricted = info.rules.get_restricted_user_ids(); + auto new_restricted = privacy_rules.get_restricted_user_ids(); + if (old_restricted != new_restricted) { + // if a user was unrestricted, it is not received from the server anymore + // we need to reget their online status manually + std::vector unrestricted; + std::set_difference(old_restricted.begin(), old_restricted.end(), new_restricted.begin(), + new_restricted.end(), std::back_inserter(unrestricted)); + for (auto &user_id : unrestricted) { + send_closure_later(G()->contacts_manager(), &ContactsManager::reload_user, UserId(user_id), + Promise()); + } + } + break; } + case UserPrivacySetting::Type::UserPhoneNumber: + send_closure_later(G()->contacts_manager(), &ContactsManager::on_update_phone_number_privacy); + break; + default: + break; } } + info.rules = std::move(privacy_rules); send_closure(G()->td(), &Td::send_update, make_tl_object(user_privacy_setting.as_td_api(),