Add cache for resolved phone numbers.

This commit is contained in:
levlam 2022-02-18 17:22:27 +03:00
parent 0939ad3db3
commit 254d74c4a6
2 changed files with 21 additions and 1 deletions

View File

@ -3626,6 +3626,7 @@ void ContactsManager::User::parse(ParserT &parser) {
cache_version = 0;
}
clean_phone_number(phone_number);
if (first_name.empty() && last_name.empty()) {
first_name = phone_number;
}
@ -8527,6 +8528,10 @@ void ContactsManager::on_binlog_user_event(BinlogEvent &&event) {
User *u = add_user(user_id, "on_binlog_user_event");
*u = std::move(log_event.u); // users come from binlog before all other events, so just add them
if (!u->phone_number.empty()) {
resolved_phone_numbers_[u->phone_number] = user_id;
}
u->log_event_id = event.id_;
update_user(u, user_id, true, false);
@ -8655,6 +8660,10 @@ void ContactsManager::on_load_user_from_database(UserId user_id, string value, b
log_event_parse(*u, value).ensure();
if (!u->phone_number.empty()) {
resolved_phone_numbers_[u->phone_number] = user_id;
}
u->is_saved = true;
u->is_status_saved = true;
update_user(u, user_id, true, true);
@ -11073,10 +11082,19 @@ void ContactsManager::on_update_user_phone_number(UserId user_id, string &&phone
}
void ContactsManager::on_update_user_phone_number(User *u, UserId user_id, string &&phone_number) {
clean_phone_number(phone_number);
if (u->phone_number != phone_number) {
if (!u->phone_number.empty()) {
resolved_phone_numbers_.erase(u->phone_number);
}
u->phone_number = std::move(phone_number);
LOG(DEBUG) << "Phone number has changed for " << user_id;
u->is_changed = true;
if (!u->phone_number.empty()) {
resolved_phone_numbers_[u->phone_number] = user_id;
}
}
}

View File

@ -1191,7 +1191,7 @@ class ContactsManager final : public Actor {
static bool is_valid_username(const string &username);
void on_update_user_name(User *u, UserId user_id, string &&first_name, string &&last_name, string &&username);
static void on_update_user_phone_number(User *u, UserId user_id, string &&phone_number);
void on_update_user_phone_number(User *u, UserId user_id, string &&phone_number);
void on_update_user_photo(User *u, UserId user_id, tl_object_ptr<telegram_api::UserProfilePhoto> &&photo,
const char *source);
void on_update_user_is_contact(User *u, UserId user_id, bool is_contact, bool is_mutual_contact);
@ -1734,6 +1734,8 @@ class ContactsManager final : public Actor {
FlatHashMap<ChannelId, vector<DialogParticipant>, ChannelIdHash> cached_channel_participants_;
FlatHashMap<string, UserId> resolved_phone_numbers_;
// bot-administrators only
struct ChannelParticipantInfo {
DialogParticipant participant_;