From 126a20c31888d6c80c9f81c5c6a20e09af7ea65c Mon Sep 17 00:00:00 2001 From: levlam Date: Thu, 3 Jun 2021 20:16:14 +0300 Subject: [PATCH] Reload voice chat when user opens a voice chat link. --- td/telegram/LinkManager.cpp | 30 +++++++++++++++++++----------- td/telegram/MessagesManager.cpp | 13 +++++++++++++ td/telegram/MessagesManager.h | 3 +++ td/telegram/Td.cpp | 2 +- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/td/telegram/LinkManager.cpp b/td/telegram/LinkManager.cpp index 2325fa302..2bce4ec82 100644 --- a/td/telegram/LinkManager.cpp +++ b/td/telegram/LinkManager.cpp @@ -654,31 +654,35 @@ unique_ptr LinkManager::parse_tg_link_query(Slice que // resolve?domain=&post=12345&single return td::make_unique(); } + auto username = get_arg("domain"); for (auto &arg : url_query.args_) { if (arg.first == "voicechat") { // resolve?domain=&voicechat // resolve?domain=&voicechat= - return td::make_unique(get_arg("domain"), arg.second); + if (Scheduler::context() != nullptr) { + send_closure(G()->messages_manager(), &MessagesManager::reload_voice_chat_on_search, username); + } + return td::make_unique(std::move(username), arg.second); } if (arg.first == "start" && is_valid_start_parameter(arg.second)) { // resolve?domain=?start= - return td::make_unique(get_arg("domain"), arg.second); + return td::make_unique(std::move(username), arg.second); } if (arg.first == "startgroup" && is_valid_start_parameter(arg.second)) { // resolve?domain=?startgroup= - return td::make_unique(get_arg("domain"), arg.second); + return td::make_unique(std::move(username), arg.second); } if (arg.first == "game" && !arg.second.empty()) { // resolve?domain=?game= - return td::make_unique(get_arg("domain"), arg.second); + return td::make_unique(std::move(username), arg.second); } } - if (get_arg("domain") == "telegrampassport") { + if (username == "telegrampassport") { // resolve?domain=telegrampassport&bot_id=&scope=&public_key=&nonce= return get_internal_link_passport(url_query.args_); } // resolve?domain= - return td::make_unique(get_arg("domain")); + return td::make_unique(std::move(username)); } } else if (path.size() == 1 && path[0] == "login") { // login?code=123456 @@ -887,27 +891,31 @@ unique_ptr LinkManager::parse_t_me_link_query(Slice q // //12345?single&thread=&comment= return td::make_unique(); } + auto username = path[0]; for (auto &arg : url_query.args_) { if (arg.first == "voicechat") { // /?voicechat // /?voicechat= - return td::make_unique(path[0], arg.second); + if (Scheduler::context() != nullptr) { + send_closure(G()->messages_manager(), &MessagesManager::reload_voice_chat_on_search, username); + } + return td::make_unique(std::move(username), arg.second); } if (arg.first == "start" && is_valid_start_parameter(arg.second)) { // /?start= - return td::make_unique(path[0], arg.second); + return td::make_unique(std::move(username), arg.second); } if (arg.first == "startgroup" && is_valid_start_parameter(arg.second)) { // /?startgroup= - return td::make_unique(path[0], arg.second); + return td::make_unique(std::move(username), arg.second); } if (arg.first == "game" && !arg.second.empty()) { // /?game= - return td::make_unique(path[0], arg.second); + return td::make_unique(std::move(username), arg.second); } } // / - return td::make_unique(path[0]); + return td::make_unique(std::move(username)); } return nullptr; } diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 7569cf33f..72ec3d08d 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -29717,6 +29717,15 @@ DialogId MessagesManager::search_public_dialog(const string &username_to_search, if (dialog_id.is_valid()) { if (have_input_peer(dialog_id, AccessRights::Read)) { + if (!force && reload_voice_chat_on_search_usernames_.count(username)) { + reload_voice_chat_on_search_usernames_.erase(username); + if (dialog_id.get_type() == DialogType::Channel) { + td_->contacts_manager_->reload_channel_full(dialog_id.get_channel_id(), std::move(promise), + "search_public_dialog"); + return DialogId(); + } + } + if (td_->auth_manager_->is_bot()) { force_create_dialog(dialog_id, "search_public_dialog", true); } else { @@ -29743,6 +29752,10 @@ DialogId MessagesManager::search_public_dialog(const string &username_to_search, return DialogId(); } +void MessagesManager::reload_voice_chat_on_search(const string &username) { + reload_voice_chat_on_search_usernames_.insert(clean_username(username)); +} + void MessagesManager::send_get_dialog_notification_settings_query(DialogId dialog_id, Promise &&promise) { if (td_->auth_manager_->is_bot() || dialog_id.get_type() == DialogType::SecretChat) { LOG(WARNING) << "Can't get notification settings for " << dialog_id; diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index ba454df8e..bb329f494 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -364,6 +364,8 @@ class MessagesManager : public Actor { DialogId search_public_dialog(const string &username_to_search, bool force, Promise &&promise); + void reload_voice_chat_on_search(const string &username); + Result send_message( DialogId dialog_id, MessageId top_thread_message_id, MessageId reply_to_message_id, tl_object_ptr &&options, tl_object_ptr &&reply_markup, @@ -3243,6 +3245,7 @@ class MessagesManager : public Actor { std::unordered_map resolved_usernames_; std::unordered_map inaccessible_resolved_usernames_; + std::unordered_set reload_voice_chat_on_search_usernames_; struct PendingOnGetDialogs { FolderId folder_id; diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index dd60945e3..e2cf9ecf9 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -887,7 +887,7 @@ class SearchPublicChatRequest : public RequestActor<> { public: SearchPublicChatRequest(ActorShared td, uint64 request_id, string username) : RequestActor(std::move(td), request_id), username_(std::move(username)) { - set_tries(3); + set_tries(4); // 1 for server request + 1 for reload voice chat + 1 for reload dialog + 1 for result } };