diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index eb0e847b..bd211b5a 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -2526,10 +2526,6 @@ class GetSupportUserQuery : public Td::ResultHandler { } }; -bool ContactsManager::UserFull::is_bot_info_expired(int32 bot_info_version) const { - return bot_info_version != -1 && (bot_info == nullptr || bot_info->version != bot_info_version); -} - bool ContactsManager::UserFull::is_expired() const { return expires_at < Time::now(); } @@ -8013,6 +8009,20 @@ bool ContactsManager::on_update_user_full_bot_info(UserFull *user_full, UserId u return true; } +bool ContactsManager::is_bot_info_expired(UserId user_id, int32 bot_info_version) { + if (bot_info_version == -1) { + return false; + } + + auto user_full = get_user_full_force(user_id); + if (user_full == nullptr) { + return true; + } + + auto bot_info = user_full->bot_info.get(); + return bot_info == nullptr || bot_info->version != bot_info_version; +} + void ContactsManager::on_get_chat(tl_object_ptr &&chat, const char *source) { LOG(DEBUG) << "Receive from " << source << ' ' << to_string(chat); downcast_call(*chat, [this, source](auto &c) { this->on_chat_update(c, source); }); @@ -10426,7 +10436,7 @@ bool ContactsManager::get_user_full(UserId user_id, Promise &&promise) { send_get_user_full_query(user_id, std::move(input_user), std::move(promise), "get_user_full"); return false; } - if (user_full->is_expired() || user_full->is_bot_info_expired(u->bot_info_version)) { + if (user_full->is_expired() || is_bot_info_expired(user_id, u->bot_info_version)) { auto input_user = get_input_user(user_id); CHECK(input_user != nullptr); if (td_->auth_manager_->is_bot()) { @@ -10658,7 +10668,7 @@ ContactsManager::ChatFull *ContactsManager::add_chat_full(ChatId chat_id) { return chat_full_ptr.get(); } -bool ContactsManager::is_chat_full_outdated(const ChatFull *chat_full, const Chat *c, ChatId chat_id) const { +bool ContactsManager::is_chat_full_outdated(const ChatFull *chat_full, const Chat *c, ChatId chat_id) { CHECK(c != nullptr); CHECK(chat_full != nullptr); if (!c->is_active && chat_full->version == -1) { @@ -10673,14 +10683,9 @@ bool ContactsManager::is_chat_full_outdated(const ChatFull *chat_full, const Cha for (const auto &participant : chat_full->participants) { auto u = get_user(participant.user_id); - if (u != nullptr && u->bot_info_version != -1) { - auto user_full = get_user_full(participant.user_id); - if (user_full == nullptr || user_full->is_bot_info_expired(u->bot_info_version)) { - LOG(INFO) << "Have outdated botInfo for " << participant.user_id << " with version " - << (user_full && user_full->bot_info ? user_full->bot_info->version : -123456789) - << ", but current version is " << u->bot_info_version; - return true; - } + if (u != nullptr && is_bot_info_expired(participant.user_id, u->bot_info_version)) { + LOG(INFO) << "Have outdated botInfo for " << participant.user_id << ", expected version " << u->bot_info_version; + return true; } } @@ -11241,10 +11246,10 @@ DialogParticipant ContactsManager::get_channel_participant(ChannelId channel_id, if (!td_->auth_manager_->is_bot() && is_user_bot(user_id)) { // get BotInfo through UserFull auto u = get_user(user_id); - auto user_full = get_user_full_force(user_id); - if (user_full == nullptr || user_full->is_bot_info_expired(u->bot_info_version)) { + CHECK(u != nullptr); + if (is_bot_info_expired(user_id, u->bot_info_version)) { if (force) { - LOG(ERROR) << "Can't find cached UserFull"; + LOG(ERROR) << "Can't find cached BotInfo"; } else { send_get_user_full_query(user_id, std::move(input_user), std::move(promise), "get_channel_participant"); return DialogParticipant(); diff --git a/td/telegram/ContactsManager.h b/td/telegram/ContactsManager.h index 33d673b3..c00ac5e7 100644 --- a/td/telegram/ContactsManager.h +++ b/td/telegram/ContactsManager.h @@ -613,7 +613,6 @@ class ContactsManager : public Actor { double expires_at = 0.0; - bool is_bot_info_expired(int32 bot_info_version) const; bool is_expired() const; template @@ -1000,6 +999,9 @@ class ContactsManager : public Actor { static bool is_valid_username(const string &username); bool on_update_bot_info(tl_object_ptr &&bot_info); + bool on_update_user_full_bot_info(UserFull *user_full, UserId user_id, int32 bot_info_version, + tl_object_ptr &&bot_info); + bool is_bot_info_expired(UserId user_id, int32 bot_info_version); void on_update_user_name(User *u, UserId user_id, string &&first_name, string &&last_name, string &&username); void on_update_user_phone_number(User *u, UserId user_id, string &&phone_number); @@ -1018,8 +1020,6 @@ class ContactsManager : public Actor { void on_update_user_full_common_chat_count(UserFull *user_full, UserId user_id, int32 common_chat_count); void on_update_user_full_need_phone_number_privacy_exception(UserFull *user_full, UserId user_id, bool need_phone_number_privacy_exception); - bool on_update_user_full_bot_info(UserFull *user_full, UserId user_id, int32 bot_info_version, - tl_object_ptr &&bot_info); void drop_user_photos(UserId user_id, bool is_empty); void drop_user_full(UserId user_id); @@ -1139,7 +1139,7 @@ class ContactsManager : public Actor { void update_chat_full(ChatFull *chat_full, ChatId chat_id, bool from_database = false); void update_channel_full(ChannelFull *channel_full, ChannelId channel_id, bool from_database = false); - bool is_chat_full_outdated(const ChatFull *chat_full, const Chat *c, ChatId chat_id) const; + bool is_chat_full_outdated(const ChatFull *chat_full, const Chat *c, ChatId chat_id); bool is_user_contact(const User *u, UserId user_id) const;