From 89e2a2992691b02cbb181f26da4f885633110cb5 Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 25 Aug 2023 18:26:05 +0300 Subject: [PATCH] Add td_api::sendWebAppCustomRequest. --- td/generate/scheme/td_api.tl | 6 +++++ td/telegram/AttachMenuManager.cpp | 38 +++++++++++++++++++++++++++++++ td/telegram/AttachMenuManager.h | 3 +++ td/telegram/Td.cpp | 11 +++++++++ td/telegram/Td.h | 2 ++ td/telegram/cli.cpp | 6 +++++ 6 files changed, 66 insertions(+) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 0a90df9e9..11f44d270 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -8220,6 +8220,12 @@ canBotSendMessages bot_user_id:int53 = Ok; //@description Allows the specified bot to send messages to the user @bot_user_id Identifier of the target bot allowBotToSendMessages bot_user_id:int53 = Ok; +//@description Sends a custom request from a Web App +//@bot_user_id Identifier of the bot +//@method The method name +//@parameters JSON-serialized method parameters +sendWebAppCustomRequest bot_user_id:int53 method:string parameters:string = CustomRequestResult; + //@description Sets the name of a bot. Can be called only if userTypeBot.can_be_edited == true //@bot_user_id Identifier of the target bot diff --git a/td/telegram/AttachMenuManager.cpp b/td/telegram/AttachMenuManager.cpp index fec34ddf1..2ad17f746 100644 --- a/td/telegram/AttachMenuManager.cpp +++ b/td/telegram/AttachMenuManager.cpp @@ -265,6 +265,38 @@ class ProlongWebViewQuery final : public Td::ResultHandler { } }; +class InvokeWebViewCustomMethodQuery final : public Td::ResultHandler { + Promise> promise_; + + public: + explicit InvokeWebViewCustomMethodQuery(Promise> &&promise) + : promise_(std::move(promise)) { + } + + void send(UserId bot_user_id, const string &method, const string ¶meters) { + auto r_input_user = td_->contacts_manager_->get_input_user(bot_user_id); + if (r_input_user.is_error()) { + return on_error(r_input_user.move_as_error()); + } + send_query(G()->net_query_creator().create(telegram_api::bots_invokeWebViewCustomMethod( + r_input_user.move_as_ok(), method, make_tl_object(parameters)))); + } + + void on_result(BufferSlice packet) final { + auto result_ptr = fetch_result(packet); + if (result_ptr.is_error()) { + return on_error(result_ptr.move_as_error()); + } + + auto result = result_ptr.move_as_ok(); + promise_.set_value(td_api::make_object(result->data_)); + } + + void on_error(Status status) final { + promise_.set_error(std::move(status)); + } +}; + class GetAttachMenuBotsQuery final : public Td::ResultHandler { Promise> promise_; @@ -826,6 +858,12 @@ void AttachMenuManager::close_web_view(int64 query_id, Promise &&promise) promise.set_value(Unit()); } +void AttachMenuManager::invoke_web_view_custom_method( + UserId bot_user_id, const string &method, const string ¶meters, + Promise> &&promise) { + td_->create_handler(std::move(promise))->send(bot_user_id, method, parameters); +} + Result AttachMenuManager::get_attach_menu_bot( tl_object_ptr &&bot) { UserId user_id(bot->bot_id_); diff --git a/td/telegram/AttachMenuManager.h b/td/telegram/AttachMenuManager.h index 8b1e4afcb..383b580ee 100644 --- a/td/telegram/AttachMenuManager.h +++ b/td/telegram/AttachMenuManager.h @@ -52,6 +52,9 @@ class AttachMenuManager final : public Actor { void close_web_view(int64 query_id, Promise &&promise); + void invoke_web_view_custom_method(UserId bot_user_id, const string &method, const string ¶meters, + Promise> &&promise); + void reload_attach_menu_bots(Promise &&promise); void get_attach_menu_bot(UserId user_id, Promise> &&promise); diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index daf30c2ce..294844f8b 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -7308,15 +7308,26 @@ void Td::on_request(uint64 id, const td_api::setDefaultChannelAdministratorRight } void Td::on_request(uint64 id, const td_api::canBotSendMessages &request) { + CHECK_IS_USER(); CREATE_OK_REQUEST_PROMISE(); bot_info_manager_->can_bot_send_messages(UserId(request.bot_user_id_), std::move(promise)); } void Td::on_request(uint64 id, const td_api::allowBotToSendMessages &request) { + CHECK_IS_USER(); CREATE_OK_REQUEST_PROMISE(); bot_info_manager_->allow_bot_to_send_messages(UserId(request.bot_user_id_), std::move(promise)); } +void Td::on_request(uint64 id, td_api::sendWebAppCustomRequest &request) { + CHECK_IS_USER(); + CLEAN_INPUT_STRING(request.method_); + CLEAN_INPUT_STRING(request.parameters_); + CREATE_REQUEST_PROMISE(); + attach_menu_manager_->invoke_web_view_custom_method(UserId(request.bot_user_id_), request.method_, + request.parameters_, std::move(promise)); +} + void Td::on_request(uint64 id, td_api::setBotName &request) { CLEAN_INPUT_STRING(request.name_); CREATE_OK_REQUEST_PROMISE(); diff --git a/td/telegram/Td.h b/td/telegram/Td.h index 041b3a996..1a7b76eac 100644 --- a/td/telegram/Td.h +++ b/td/telegram/Td.h @@ -1225,6 +1225,8 @@ class Td final : public Actor { void on_request(uint64 id, const td_api::allowBotToSendMessages &request); + void on_request(uint64 id, td_api::sendWebAppCustomRequest &request); + void on_request(uint64 id, td_api::setBotName &request); void on_request(uint64 id, const td_api::getBotName &request); diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index 92f1640a7..8055947ce 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -5518,6 +5518,12 @@ class CliClient final : public Actor { UserId bot_user_id; get_args(args, bot_user_id); send_request(td_api::make_object(bot_user_id)); + } else if (op == "swacr") { + UserId bot_user_id; + string method; + string parameters; + get_args(args, bot_user_id, method, parameters); + send_request(td_api::make_object(bot_user_id, method, parameters)); } else if (op == "gbi") { UserId bot_user_id; string language_code;