From fb7cb1b1d0a4cfb19adbf946cbe86f5c9699d298 Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 15 Sep 2023 18:20:21 +0300 Subject: [PATCH] Add MessagesManager::resolve_dialog. --- td/telegram/MessagesManager.cpp | 103 +++++++++++++++++++------------- td/telegram/MessagesManager.h | 6 +- 2 files changed, 66 insertions(+), 43 deletions(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 74ff61e7f..ab8fd4359 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -18799,53 +18799,24 @@ void MessagesManager::get_message_link_info(Slice url, Promise } auto info = r_message_link_info.move_as_ok(); - CHECK(info.username.empty() == info.channel_id.is_valid()); - - bool have_dialog = info.username.empty() ? td_->contacts_manager_->have_channel_force(info.channel_id) - : resolve_dialog_username(info.username).is_valid(); - if (!have_dialog) { - auto query_promise = PromiseCreator::lambda( - [actor_id = actor_id(this), info, promise = std::move(promise)](Result &&result) mutable { - if (result.is_error()) { - return promise.set_value(std::move(info)); - } - send_closure(actor_id, &MessagesManager::on_get_message_link_dialog, std::move(info), std::move(promise)); - }); - if (info.username.empty()) { - td_->contacts_manager_->reload_channel(info.channel_id, std::move(query_promise)); - } else { - send_resolve_dialog_username_query(info.username, std::move(query_promise)); - } - return; - } - - return on_get_message_link_dialog(std::move(info), std::move(promise)); + auto query_promise = PromiseCreator::lambda( + [actor_id = actor_id(this), info, promise = std::move(promise)](Result &&result) mutable { + if (result.is_error()) { + return promise.set_value(std::move(info)); + } + send_closure(actor_id, &MessagesManager::on_get_message_link_dialog, std::move(info), result.ok(), + std::move(promise)); + }); + resolve_dialog(info.username, info.channel_id, std::move(query_promise)); } -void MessagesManager::on_get_message_link_dialog(MessageLinkInfo &&info, Promise &&promise) { +void MessagesManager::on_get_message_link_dialog(MessageLinkInfo &&info, DialogId dialog_id, + Promise &&promise) { TRY_STATUS_PROMISE(promise, G()->close_status()); - DialogId dialog_id; - if (info.username.empty()) { - if (!td_->contacts_manager_->have_channel(info.channel_id)) { - return promise.set_error(Status::Error(500, "Chat info not found")); - } - - dialog_id = DialogId(info.channel_id); - force_create_dialog(dialog_id, "on_get_message_link_dialog"); - } else { - dialog_id = resolve_dialog_username(info.username); - if (dialog_id.is_valid()) { - force_create_dialog(dialog_id, "on_get_message_link_dialog", true); - } - } Dialog *d = get_dialog_force(dialog_id, "on_get_message_link_dialog"); - if (d == nullptr) { - return promise.set_error(Status::Error(500, "Chat not found")); - } - - auto message_id = info.message_id; - get_message_force_from_server(d, message_id, + CHECK(d != nullptr); + get_message_force_from_server(d, info.message_id, PromiseCreator::lambda([actor_id = actor_id(this), info = std::move(info), dialog_id, promise = std::move(promise)](Result &&result) mutable { if (result.is_error()) { @@ -32603,6 +32574,54 @@ void MessagesManager::send_resolve_dialog_username_query(const string &username, td_->create_handler(std::move(promise))->send(username); } +void MessagesManager::resolve_dialog(const string &username, ChannelId channel_id, Promise promise) { + CHECK(username.empty() == channel_id.is_valid()); + + bool have_dialog = username.empty() ? td_->contacts_manager_->have_channel_force(channel_id) + : resolve_dialog_username(username).is_valid(); + if (!have_dialog) { + auto query_promise = PromiseCreator::lambda( + [actor_id = actor_id(this), username, channel_id, promise = std::move(promise)](Result &&result) mutable { + if (result.is_error()) { + return promise.set_error(result.move_as_error()); + } + send_closure(actor_id, &MessagesManager::on_resolve_dialog, username, channel_id, std::move(promise)); + }); + if (username.empty()) { + td_->contacts_manager_->reload_channel(channel_id, std::move(query_promise)); + } else { + send_resolve_dialog_username_query(username, std::move(query_promise)); + } + return; + } + + return on_resolve_dialog(username, channel_id, std::move(promise)); +} + +void MessagesManager::on_resolve_dialog(const string &username, ChannelId channel_id, Promise &&promise) { + TRY_STATUS_PROMISE(promise, G()->close_status()); + + DialogId dialog_id; + if (username.empty()) { + if (!td_->contacts_manager_->have_channel(channel_id)) { + return promise.set_error(Status::Error(500, "Chat info not found")); + } + + dialog_id = DialogId(channel_id); + force_create_dialog(dialog_id, "on_resolve_dialog"); + } else { + dialog_id = resolve_dialog_username(username); + if (dialog_id.is_valid()) { + force_create_dialog(dialog_id, "on_resolve_dialog", true); + } + } + Dialog *d = get_dialog_force(dialog_id, "on_get_message_link_dialog"); + if (d == nullptr) { + return promise.set_error(Status::Error(500, "Chat not found")); + } + promise.set_value(std::move(dialog_id)); +} + DialogId MessagesManager::resolve_dialog_username(const string &username) const { auto cleaned_username = clean_username(username); auto resolved_username = resolved_usernames_.get(cleaned_username); diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 8034cd66a..acb2c9101 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -434,6 +434,8 @@ class MessagesManager final : public Actor { std::pair> get_recently_opened_dialogs(int32 limit, Promise &&promise); + void resolve_dialog(const string &username, ChannelId channel_id, Promise promise); + DialogId resolve_dialog_username(const string &username) const; DialogId search_public_dialog(const string &username_to_search, bool force, Promise &&promise); @@ -2011,6 +2013,8 @@ class MessagesManager final : public Actor { void send_resolve_dialog_username_query(const string &username, Promise &&promise); + void on_resolve_dialog(const string &username, ChannelId channel_id, Promise &&promise); + int64 generate_new_media_album_id(); static bool can_forward_message(DialogId from_dialog_id, const Message *m); @@ -2904,7 +2908,7 @@ class MessagesManager final : public Actor { void on_restore_missing_message_after_get_difference(FullMessageId full_message_id, MessageId old_message_id, Result result); - void on_get_message_link_dialog(MessageLinkInfo &&info, Promise &&promise); + void on_get_message_link_dialog(MessageLinkInfo &&info, DialogId dialog_id, Promise &&promise); void on_get_message_link_message(MessageLinkInfo &&info, DialogId dialog_id, Promise &&promise);