From 5862f16ce75b24f8507817ef76c765f6052a6726 Mon Sep 17 00:00:00 2001 From: RadRussianRus Date: Sun, 11 Sep 2022 06:19:58 +0300 Subject: [PATCH] [Improvement] Query parameter for tg://resolve links --- .../SourceFiles/core/local_url_handlers.cpp | 7 ++++ .../window/window_session_controller.cpp | 33 ++++++++++++++++--- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/Telegram/SourceFiles/core/local_url_handlers.cpp b/Telegram/SourceFiles/core/local_url_handlers.cpp index 0706da71f..37810a36b 100644 --- a/Telegram/SourceFiles/core/local_url_handlers.cpp +++ b/Telegram/SourceFiles/core/local_url_handlers.cpp @@ -338,6 +338,12 @@ bool ResolveUsernameOrPhone( if (domain == qsl("telegrampassport")) { return ShowPassportForm(controller, params); } else if (!validDomain(domain) && !validPhone(phone)) { + const auto searchParam = params.value(qsl("query")); + if (!searchParam.isEmpty()) { + controller->content()->searchMessages( + searchParam + ' ', + Dialogs::Key()); + } return false; } using ResolveType = Window::ResolveType; @@ -403,6 +409,7 @@ bool ResolveUsernameOrPhone( ? std::make_optional(params.value(u"voicechat"_q)) : std::nullopt), .clickFromMessageId = myContext.itemId, + .searchQuery = params.value(qsl("query")), }); controller->window().activate(); return true; diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index 98bf72d28..90a38f85a 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -372,6 +372,16 @@ void SessionNavigation::showPeerByLinkResolved( const auto user = peer->asUser(); const auto bot = (user && user->isBot()) ? user : nullptr; const auto &replies = info.repliesInfo; + const auto searchQuery = info.searchQuery; + + const auto applySearchQuery = [=] { + parentController()->content()->searchMessages( + searchQuery + ' ', + (peer && !peer->isUser()) + ? peer->owner().history(peer).get() + : Dialogs::Key()); + }; + if (const auto threadId = std::get_if(&replies)) { showRepliesForMessage( session().data().history(peer), @@ -407,6 +417,14 @@ void SessionNavigation::showPeerByLinkResolved( if (bot || peer->isChannel()) { crl::on_main(this, [=] { showPeerHistory(peer->id, params); + if (!searchQuery.isEmpty()) { + applySearchQuery(); + } + }); + } else if (!searchQuery.isEmpty()) { + crl::on_main(this, [=] { + showPeerHistory(peer->id, params); + applySearchQuery(); }); } else { showPeerInfo(peer, params); @@ -428,10 +446,14 @@ void SessionNavigation::showPeerByLinkResolved( if (!attachBotUsername.isEmpty()) { crl::on_main(this, [=] { showPeerHistory(peer->id, params, msgId); - peer->session().attachWebView().request( - peer, - attachBotUsername, - info.attachBotToggleCommand.value_or(QString())); + if (searchQuery.isEmpty()) { + peer->session().attachWebView().request( + peer, + attachBotUsername, + info.attachBotToggleCommand.value_or(QString())); + } else { + applySearchQuery(); + } }); } else if (bot && info.attachBotToggleCommand) { const auto itemId = info.clickFromMessageId; @@ -451,6 +473,9 @@ void SessionNavigation::showPeerByLinkResolved( } else { crl::on_main(this, [=] { showPeerHistory(peer->id, params, msgId); + if (!searchQuery.isEmpty()) { + applySearchQuery(); + } }); } }