Add source to reload_user/chat/channel.

This commit is contained in:
levlam 2023-11-08 23:48:27 +03:00
parent 49a75ad084
commit 7039272ae8
6 changed files with 43 additions and 39 deletions

View File

@ -232,7 +232,7 @@ class SetBotInfoQuery final : public Td::ResultHandler {
} }
} }
if (set_name_) { if (set_name_) {
return td_->contacts_manager_->reload_user(bot_user_id_, std::move(promise_)); return td_->contacts_manager_->reload_user(bot_user_id_, std::move(promise_), "SetBotInfoQuery");
} }
// invalidation is enough for bots if name wasn't changed // invalidation is enough for bots if name wasn't changed
promise_.set_value(Unit()); promise_.set_value(Unit());

View File

@ -3162,7 +3162,7 @@ class LeaveChannelQuery final : public Td::ResultHandler {
void on_error(Status status) final { void on_error(Status status) final {
if (status.message() == "USER_NOT_PARTICIPANT") { if (status.message() == "USER_NOT_PARTICIPANT") {
return td_->contacts_manager_->reload_channel(channel_id_, std::move(promise_)); return td_->contacts_manager_->reload_channel(channel_id_, std::move(promise_), "LeaveChannelQuery");
} }
td_->contacts_manager_->on_get_channel_error(channel_id_, status, "LeaveChannelQuery"); td_->contacts_manager_->on_get_channel_error(channel_id_, status, "LeaveChannelQuery");
promise_.set_error(std::move(status)); promise_.set_error(std::move(status));
@ -7828,7 +7828,7 @@ void ContactsManager::on_update_username_is_active(UserId user_id, string &&user
User *u = get_user(user_id); User *u = get_user(user_id);
CHECK(u != nullptr); CHECK(u != nullptr);
if (!u->usernames.can_toggle(username)) { if (!u->usernames.can_toggle(username)) {
return reload_user(user_id, std::move(promise)); return reload_user(user_id, std::move(promise), "on_update_username_is_active");
} }
on_update_user_usernames(u, user_id, u->usernames.toggle(username, is_active)); on_update_user_usernames(u, user_id, u->usernames.toggle(username, is_active));
update_user(u, user_id); update_user(u, user_id);
@ -7840,7 +7840,7 @@ void ContactsManager::on_update_active_usernames_order(UserId user_id, vector<st
User *u = get_user(user_id); User *u = get_user(user_id);
CHECK(u != nullptr); CHECK(u != nullptr);
if (!u->usernames.can_reorder_to(usernames)) { if (!u->usernames.can_reorder_to(usernames)) {
return reload_user(user_id, std::move(promise)); return reload_user(user_id, std::move(promise), "on_update_active_usernames_order");
} }
on_update_user_usernames(u, user_id, u->usernames.reorder_to(std::move(usernames))); on_update_user_usernames(u, user_id, u->usernames.reorder_to(std::move(usernames)));
update_user(u, user_id); update_user(u, user_id);
@ -7981,7 +7981,7 @@ void ContactsManager::on_update_channel_username_is_active(ChannelId channel_id,
auto *c = get_channel(channel_id); auto *c = get_channel(channel_id);
CHECK(c != nullptr); CHECK(c != nullptr);
if (!c->usernames.can_toggle(username)) { if (!c->usernames.can_toggle(username)) {
return reload_channel(channel_id, std::move(promise)); return reload_channel(channel_id, std::move(promise), "on_update_channel_username_is_active");
} }
on_update_channel_usernames(c, channel_id, c->usernames.toggle(username, is_active)); on_update_channel_usernames(c, channel_id, c->usernames.toggle(username, is_active));
update_channel(c, channel_id); update_channel(c, channel_id);
@ -8001,7 +8001,7 @@ void ContactsManager::on_update_channel_active_usernames_order(ChannelId channel
auto *c = get_channel(channel_id); auto *c = get_channel(channel_id);
CHECK(c != nullptr); CHECK(c != nullptr);
if (!c->usernames.can_reorder_to(usernames)) { if (!c->usernames.can_reorder_to(usernames)) {
return reload_channel(channel_id, std::move(promise)); return reload_channel(channel_id, std::move(promise), "on_update_channel_active_usernames_order");
} }
on_update_channel_usernames(c, channel_id, c->usernames.reorder_to(std::move(usernames))); on_update_channel_usernames(c, channel_id, c->usernames.reorder_to(std::move(usernames)));
update_channel(c, channel_id); update_channel(c, channel_id);
@ -10775,7 +10775,7 @@ ContactsManager::User *ContactsManager::get_user_force(UserId user_id, const cha
u = get_user(user_id); u = get_user(user_id);
CHECK(u != nullptr && u->is_received); CHECK(u != nullptr && u->is_received);
reload_user(user_id, Promise<Unit>()); reload_user(user_id, Promise<Unit>(), "get_user_force");
} }
return u; return u;
} }
@ -12106,7 +12106,7 @@ void ContactsManager::update_user(User *u, UserId user_id, bool from_binlog, boo
u->is_repaired = true; u->is_repaired = true;
LOG(INFO) << "Repairing cache of " << user_id; LOG(INFO) << "Repairing cache of " << user_id;
reload_user(user_id, Promise<Unit>()); reload_user(user_id, Promise<Unit>(), "update_user");
} }
if (u->is_full_info_changed) { if (u->is_full_info_changed) {
@ -12168,10 +12168,10 @@ void ContactsManager::update_chat(Chat *c, ChatId chat_id, bool from_binlog, boo
send_closure_later(G()->messages_manager(), &MessagesManager::try_update_dialog_pos, DialogId(chat_id)); send_closure_later(G()->messages_manager(), &MessagesManager::try_update_dialog_pos, DialogId(chat_id));
// reload the chat to repair its status if it is changed back after receiving of outdated data // reload the chat to repair its status if it is changed back after receiving of outdated data
create_actor<SleepActor>("ReloadChatSleepActor", 1.0, create_actor<SleepActor>(
PromiseCreator::lambda([actor_id = actor_id(this), chat_id](Unit) { "ReloadChatSleepActor", 1.0, PromiseCreator::lambda([actor_id = actor_id(this), chat_id](Unit) {
send_closure(actor_id, &ContactsManager::reload_chat, chat_id, Promise<Unit>()); send_closure(actor_id, &ContactsManager::reload_chat, chat_id, Promise<Unit>(), "ReloadChatSleepActor");
})) }))
.release(); .release();
} }
c->is_status_changed = false; c->is_status_changed = false;
@ -12211,7 +12211,7 @@ void ContactsManager::update_chat(Chat *c, ChatId chat_id, bool from_binlog, boo
c->is_repaired = true; c->is_repaired = true;
LOG(INFO) << "Repairing cache of " << chat_id; LOG(INFO) << "Repairing cache of " << chat_id;
reload_chat(chat_id, Promise<Unit>()); reload_chat(chat_id, Promise<Unit>(), "update_chat");
} }
} }
@ -12286,7 +12286,8 @@ void ContactsManager::update_channel(Channel *c, ChannelId channel_id, bool from
// reload the channel to repair its status if it is changed back after receiving of outdated data // reload the channel to repair its status if it is changed back after receiving of outdated data
create_actor<SleepActor>("ReloadChannelSleepActor", 1.0, create_actor<SleepActor>("ReloadChannelSleepActor", 1.0,
PromiseCreator::lambda([actor_id = actor_id(this), channel_id](Unit) { PromiseCreator::lambda([actor_id = actor_id(this), channel_id](Unit) {
send_closure(actor_id, &ContactsManager::reload_channel, channel_id, Promise<Unit>()); send_closure(actor_id, &ContactsManager::reload_channel, channel_id, Promise<Unit>(),
"ReloadChannelSleepActor");
})) }))
.release(); .release();
} }
@ -12387,7 +12388,7 @@ void ContactsManager::update_channel(Channel *c, ChannelId channel_id, bool from
c->is_repaired = true; c->is_repaired = true;
LOG(INFO) << "Repairing cache of " << channel_id; LOG(INFO) << "Repairing cache of " << channel_id;
reload_channel(channel_id, Promise<Unit>()); reload_channel(channel_id, Promise<Unit>(), "update_channel");
} }
} }
@ -14118,14 +14119,14 @@ void ContactsManager::on_set_profile_photo(UserId user_id, tl_object_ptr<telegra
if (have_user) { if (have_user) {
promise.set_value(Unit()); promise.set_value(Unit());
} else { } else {
reload_user(user_id, std::move(promise)); reload_user(user_id, std::move(promise), "on_set_profile_photo");
} }
} }
void ContactsManager::on_delete_profile_photo(int64 profile_photo_id, Promise<Unit> promise) { void ContactsManager::on_delete_profile_photo(int64 profile_photo_id, Promise<Unit> promise) {
bool need_reget_user = delete_my_profile_photo_from_cache(profile_photo_id); bool need_reget_user = delete_my_profile_photo_from_cache(profile_photo_id);
if (need_reget_user && !G()->close_flag()) { if (need_reget_user && !G()->close_flag()) {
return reload_user(get_my_id(), std::move(promise)); return reload_user(get_my_id(), std::move(promise), "on_delete_profile_photo");
} }
promise.set_value(Unit()); promise.set_value(Unit());
@ -15345,7 +15346,7 @@ void ContactsManager::on_update_channel_full_linked_channel_id(ChannelFull *chan
linked_channel->has_linked_channel = false; linked_channel->has_linked_channel = false;
linked_channel->is_changed = true; linked_channel->is_changed = true;
update_channel(linked_channel, channel_full->linked_channel_id); update_channel(linked_channel, channel_full->linked_channel_id);
reload_channel(channel_full->linked_channel_id, Auto()); reload_channel(channel_full->linked_channel_id, Auto(), "on_update_channel_full_linked_channel_id 21");
} }
auto linked_channel_full = auto linked_channel_full =
get_channel_full_force(channel_full->linked_channel_id, true, "on_update_channel_full_linked_channel_id 1"); get_channel_full_force(channel_full->linked_channel_id, true, "on_update_channel_full_linked_channel_id 1");
@ -15368,7 +15369,7 @@ void ContactsManager::on_update_channel_full_linked_channel_id(ChannelFull *chan
linked_channel->has_linked_channel = true; linked_channel->has_linked_channel = true;
linked_channel->is_changed = true; linked_channel->is_changed = true;
update_channel(linked_channel, channel_full->linked_channel_id); update_channel(linked_channel, channel_full->linked_channel_id);
reload_channel(channel_full->linked_channel_id, Auto()); reload_channel(channel_full->linked_channel_id, Auto(), "on_update_channel_full_linked_channel_id 22");
} }
auto linked_channel_full = auto linked_channel_full =
get_channel_full_force(channel_full->linked_channel_id, true, "on_update_channel_full_linked_channel_id 2"); get_channel_full_force(channel_full->linked_channel_id, true, "on_update_channel_full_linked_channel_id 2");
@ -17125,13 +17126,13 @@ bool ContactsManager::is_dialog_info_received_from_server(DialogId dialog_id) co
void ContactsManager::reload_dialog_info(DialogId dialog_id, Promise<Unit> &&promise) { void ContactsManager::reload_dialog_info(DialogId dialog_id, Promise<Unit> &&promise) {
switch (dialog_id.get_type()) { switch (dialog_id.get_type()) {
case DialogType::User: case DialogType::User:
return reload_user(dialog_id.get_user_id(), std::move(promise)); return reload_user(dialog_id.get_user_id(), std::move(promise), "reload_dialog_info");
case DialogType::Chat: case DialogType::Chat:
return reload_chat(dialog_id.get_chat_id(), std::move(promise)); return reload_chat(dialog_id.get_chat_id(), std::move(promise), "reload_dialog_info");
case DialogType::Channel: case DialogType::Channel:
return reload_channel(dialog_id.get_channel_id(), std::move(promise)); return reload_channel(dialog_id.get_channel_id(), std::move(promise), "reload_dialog_info");
default: default:
return promise.set_error(Status::Error("Invalid dialog ID to reload")); return promise.set_error(Status::Error("Invalid chat identifier to reload"));
} }
} }
@ -17214,16 +17215,16 @@ ContactsManager::UserFull *ContactsManager::add_user_full(UserId user_id) {
return user_full_ptr.get(); return user_full_ptr.get();
} }
void ContactsManager::reload_user(UserId user_id, Promise<Unit> &&promise) { void ContactsManager::reload_user(UserId user_id, Promise<Unit> &&promise, const char *source) {
if (!user_id.is_valid()) { if (!user_id.is_valid()) {
return promise.set_error(Status::Error(400, "Invalid user identifier")); return promise.set_error(Status::Error(400, "Invalid user identifier"));
} }
have_user_force(user_id, "reload_user"); have_user_force(user_id, source);
TRY_STATUS_PROMISE(promise, get_input_user(user_id)); TRY_STATUS_PROMISE(promise, get_input_user(user_id));
get_user_queries_.add_query(user_id.get(), std::move(promise), "reload_user"); get_user_queries_.add_query(user_id.get(), std::move(promise), source);
} }
void ContactsManager::load_user_full(UserId user_id, bool force, Promise<Unit> &&promise, const char *source) { void ContactsManager::load_user_full(UserId user_id, bool force, Promise<Unit> &&promise, const char *source) {
@ -17560,14 +17561,14 @@ bool ContactsManager::get_chat(ChatId chat_id, int left_tries, Promise<Unit> &&p
return true; return true;
} }
void ContactsManager::reload_chat(ChatId chat_id, Promise<Unit> &&promise) { void ContactsManager::reload_chat(ChatId chat_id, Promise<Unit> &&promise, const char *source) {
TRY_STATUS_PROMISE(promise, G()->close_status()); TRY_STATUS_PROMISE(promise, G()->close_status());
if (!chat_id.is_valid()) { if (!chat_id.is_valid()) {
return promise.set_error(Status::Error(400, "Invalid basic group identifier")); return promise.set_error(Status::Error(400, "Invalid basic group identifier"));
} }
get_chat_queries_.add_query(chat_id.get(), std::move(promise), "reload_chat"); get_chat_queries_.add_query(chat_id.get(), std::move(promise), source);
} }
const ContactsManager::ChatFull *ContactsManager::get_chat_full(ChatId chat_id) const { const ContactsManager::ChatFull *ContactsManager::get_chat_full(ChatId chat_id) const {
@ -17984,14 +17985,14 @@ bool ContactsManager::get_channel(ChannelId channel_id, int left_tries, Promise<
return true; return true;
} }
void ContactsManager::reload_channel(ChannelId channel_id, Promise<Unit> &&promise) { void ContactsManager::reload_channel(ChannelId channel_id, Promise<Unit> &&promise, const char *source) {
TRY_STATUS_PROMISE(promise, G()->close_status()); TRY_STATUS_PROMISE(promise, G()->close_status());
if (!channel_id.is_valid()) { if (!channel_id.is_valid()) {
return promise.set_error(Status::Error(400, "Invalid supergroup identifier")); return promise.set_error(Status::Error(400, "Invalid supergroup identifier"));
} }
have_channel_force(channel_id, "reload_channel"); have_channel_force(channel_id, source);
auto input_channel = get_input_channel(channel_id); auto input_channel = get_input_channel(channel_id);
if (input_channel == nullptr) { if (input_channel == nullptr) {
// requests with 0 access_hash must not be merged // requests with 0 access_hash must not be merged
@ -18000,7 +18001,7 @@ void ContactsManager::reload_channel(ChannelId channel_id, Promise<Unit> &&promi
return; return;
} }
get_channel_queries_.add_query(channel_id.get(), std::move(promise), "reload_channel"); get_channel_queries_.add_query(channel_id.get(), std::move(promise), source);
} }
const ContactsManager::ChannelFull *ContactsManager::get_channel_full_const(ChannelId channel_id) const { const ContactsManager::ChannelFull *ContactsManager::get_channel_full_const(ChannelId channel_id) const {

View File

@ -610,7 +610,7 @@ class ContactsManager final : public Actor {
static void send_get_me_query(Td *td, Promise<Unit> &&promise); static void send_get_me_query(Td *td, Promise<Unit> &&promise);
UserId get_me(Promise<Unit> &&promise); UserId get_me(Promise<Unit> &&promise);
bool get_user(UserId user_id, int left_tries, Promise<Unit> &&promise); bool get_user(UserId user_id, int left_tries, Promise<Unit> &&promise);
void reload_user(UserId user_id, Promise<Unit> &&promise); void reload_user(UserId user_id, Promise<Unit> &&promise, const char *source);
void load_user_full(UserId user_id, bool force, Promise<Unit> &&promise, const char *source); void load_user_full(UserId user_id, bool force, Promise<Unit> &&promise, const char *source);
FileSourceId get_user_full_file_source_id(UserId user_id); FileSourceId get_user_full_file_source_id(UserId user_id);
void reload_user_full(UserId user_id, Promise<Unit> &&promise, const char *source); void reload_user_full(UserId user_id, Promise<Unit> &&promise, const char *source);
@ -623,7 +623,7 @@ class ContactsManager final : public Actor {
bool have_chat(ChatId chat_id) const; bool have_chat(ChatId chat_id) const;
bool have_chat_force(ChatId chat_id, const char *source); bool have_chat_force(ChatId chat_id, const char *source);
bool get_chat(ChatId chat_id, int left_tries, Promise<Unit> &&promise); bool get_chat(ChatId chat_id, int left_tries, Promise<Unit> &&promise);
void reload_chat(ChatId chat_id, Promise<Unit> &&promise); void reload_chat(ChatId chat_id, Promise<Unit> &&promise, const char *source);
void load_chat_full(ChatId chat_id, bool force, Promise<Unit> &&promise, const char *source); void load_chat_full(ChatId chat_id, bool force, Promise<Unit> &&promise, const char *source);
FileSourceId get_chat_full_file_source_id(ChatId chat_id); FileSourceId get_chat_full_file_source_id(ChatId chat_id);
void reload_chat_full(ChatId chat_id, Promise<Unit> &&promise, const char *source); void reload_chat_full(ChatId chat_id, Promise<Unit> &&promise, const char *source);
@ -643,7 +643,7 @@ class ContactsManager final : public Actor {
bool have_channel(ChannelId channel_id) const; bool have_channel(ChannelId channel_id) const;
bool have_channel_force(ChannelId channel_id, const char *source); bool have_channel_force(ChannelId channel_id, const char *source);
bool get_channel(ChannelId channel_id, int left_tries, Promise<Unit> &&promise); bool get_channel(ChannelId channel_id, int left_tries, Promise<Unit> &&promise);
void reload_channel(ChannelId channel_id, Promise<Unit> &&promise); void reload_channel(ChannelId channel_id, Promise<Unit> &&promise, const char *source);
void load_channel_full(ChannelId channel_id, bool force, Promise<Unit> &&promise, const char *source); void load_channel_full(ChannelId channel_id, bool force, Promise<Unit> &&promise, const char *source);
FileSourceId get_channel_full_file_source_id(ChannelId channel_id); FileSourceId get_channel_full_file_source_id(ChannelId channel_id);
void reload_channel_full(ChannelId channel_id, Promise<Unit> &&promise, const char *source); void reload_channel_full(ChannelId channel_id, Promise<Unit> &&promise, const char *source);

View File

@ -320,11 +320,12 @@ void FileReferenceManager::send_query(Destination dest, FileSourceId file_source
source.photo_id, std::move(promise)); source.photo_id, std::move(promise));
}, },
[&](const FileSourceChatPhoto &source) { [&](const FileSourceChatPhoto &source) {
send_closure_later(G()->contacts_manager(), &ContactsManager::reload_chat, source.chat_id, std::move(promise)); send_closure_later(G()->contacts_manager(), &ContactsManager::reload_chat, source.chat_id, std::move(promise),
"FileSourceChatPhoto");
}, },
[&](const FileSourceChannelPhoto &source) { [&](const FileSourceChannelPhoto &source) {
send_closure_later(G()->contacts_manager(), &ContactsManager::reload_channel, source.channel_id, send_closure_later(G()->contacts_manager(), &ContactsManager::reload_channel, source.channel_id,
std::move(promise)); std::move(promise), "FileSourceChannelPhoto");
}, },
[&](const FileSourceWallpapers &source) { promise.set_error(Status::Error("Can't repair old wallpapers")); }, [&](const FileSourceWallpapers &source) { promise.set_error(Status::Error("Can't repair old wallpapers")); },
[&](const FileSourceWebPage &source) { [&](const FileSourceWebPage &source) {

View File

@ -31275,7 +31275,8 @@ void MessagesManager::on_send_message_fail(int64 random_id, Status error) {
} else if (error.message() == "CHAT_GUEST_SEND_FORBIDDEN") { } else if (error.message() == "CHAT_GUEST_SEND_FORBIDDEN") {
error_code = 400; error_code = 400;
if (dialog_id.get_type() == DialogType::Channel) { if (dialog_id.get_type() == DialogType::Channel) {
td_->contacts_manager_->reload_channel(dialog_id.get_channel_id(), Promise<Unit>()); td_->contacts_manager_->reload_channel(dialog_id.get_channel_id(), Promise<Unit>(),
"CHAT_GUEST_SEND_FORBIDDEN");
} }
} else if (error.message() != "CHANNEL_PUBLIC_GROUP_NA" && error.message() != "USER_IS_BLOCKED" && } else if (error.message() != "CHANNEL_PUBLIC_GROUP_NA" && error.message() != "USER_IS_BLOCKED" &&
error.message() != "USER_BOT_INVALID" && error.message() != "USER_DELETED") { error.message() != "USER_BOT_INVALID" && error.message() != "USER_DELETED") {
@ -32653,7 +32654,7 @@ void MessagesManager::resolve_dialog(const string &username, ChannelId channel_i
send_closure(actor_id, &MessagesManager::on_resolve_dialog, username, channel_id, std::move(promise)); send_closure(actor_id, &MessagesManager::on_resolve_dialog, username, channel_id, std::move(promise));
}); });
if (username.empty()) { if (username.empty()) {
td_->contacts_manager_->reload_channel(channel_id, std::move(query_promise)); td_->contacts_manager_->reload_channel(channel_id, std::move(query_promise), "resolve_dialog");
} else { } else {
send_resolve_dialog_username_query(username, std::move(query_promise)); send_resolve_dialog_username_query(username, std::move(query_promise));
} }

View File

@ -223,7 +223,8 @@ void PrivacyManager::do_update_privacy(UserPrivacySetting user_privacy_setting,
new_restricted.end(), std::back_inserter(unrestricted), new_restricted.end(), std::back_inserter(unrestricted),
[](UserId lhs, UserId rhs) { return lhs.get() < rhs.get(); }); [](UserId lhs, UserId rhs) { return lhs.get() < rhs.get(); });
for (auto &user_id : unrestricted) { for (auto &user_id : unrestricted) {
send_closure_later(G()->contacts_manager(), &ContactsManager::reload_user, user_id, Promise<Unit>()); send_closure_later(G()->contacts_manager(), &ContactsManager::reload_user, user_id, Promise<Unit>(),
"do_update_privacy");
} }
} }
break; break;