From 8339a5818e77c4dea44040c2da277e17df50cc33 Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 14 Jan 2022 22:28:28 +0300 Subject: [PATCH] Add td_api::translateMessage. --- td/generate/scheme/td_api.tl | 8 +++++ td/telegram/MessagesManager.cpp | 63 +++++++++++++++++++++++++++++++++ td/telegram/MessagesManager.h | 3 ++ td/telegram/Td.cpp | 9 +++++ td/telegram/Td.h | 2 ++ td/telegram/cli.cpp | 8 +++++ 6 files changed, 93 insertions(+) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index c2b937aa9..afa5d83d7 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -4398,6 +4398,14 @@ getMessageEmbeddingCode chat_id:int53 message_id:int53 for_album:Bool = Text; getMessageLinkInfo url:string = MessageLinkInfo; +//@description Translates a message text or caption to the given language. Returns a 404 error if the translation can't be performed +//@chat_id Identifier of the chat to which the message belongs +//@message_id Identifier of the message +//@from_language_code A two-letter ISO 639-1 language code of the language from which the message is translated. If empty, the language will be detected automatically +//@to_language_code A two-letter ISO 639-1 language code of the language to which the message is translated +translateMessage chat_id:int53 message_id:int53 from_language_code:string to_language_code:string = Text; + + //@description Returns list of message sender identifiers, which can be used to send messages in a chat @chat_id Chat identifier getChatAvailableMessageSenders chat_id:int53 = MessageSenders; diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 3801be63e..f5bf58666 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -680,6 +680,47 @@ class GetMessageReadParticipantsQuery final : public Td::ResultHandler { } }; +class TranslateTextQuery final : public Td::ResultHandler { + Promise> promise_; + + public: + explicit TranslateTextQuery(Promise> &&promise) : promise_(std::move(promise)) { + } + + void send(const string &text, const string &from_language_code, const string &to_language_code) { + int flags = telegram_api::messages_translateText::TEXT_MASK; + if (!from_language_code.empty()) { + flags |= telegram_api::messages_translateText::FROM_LANG_MASK; + } + send_query(G()->net_query_creator().create( + telegram_api::messages_translateText(flags, nullptr, 0, text, from_language_code, to_language_code))); + } + + 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 ptr = result_ptr.move_as_ok(); + LOG(INFO) << "Receive result for TranslateTextQuery: " << to_string(ptr); + switch (ptr->get_id()) { + case telegram_api::messages_translateNoResult::ID: + return promise_.set_value(nullptr); + case telegram_api::messages_translateResultText::ID: { + auto text = telegram_api::move_object_as(ptr); + return promise_.set_value(td_api::make_object(text->text_)); + } + default: + UNREACHABLE(); + } + } + + void on_error(Status status) final { + promise_.set_error(std::move(status)); + } +}; + class ExportChannelMessageLinkQuery final : public Td::ResultHandler { Promise promise_; ChannelId channel_id_; @@ -17675,6 +17716,28 @@ void MessagesManager::on_get_message_viewers(DialogId dialog_id, vector promise.set_value(td_->contacts_manager_->get_users_object(-1, user_ids)); } +void MessagesManager::translate_message(FullMessageId full_message_id, const string &from_language_code, + const string &to_language_code, + Promise> &&promise) { + auto dialog_id = full_message_id.get_dialog_id(); + Dialog *d = get_dialog_force(dialog_id, "translate_message"); + if (d == nullptr) { + return promise.set_error(Status::Error(400, "Chat not found")); + } + + auto m = get_message_force(d, full_message_id.get_message_id(), "translate_message"); + if (m == nullptr) { + return promise.set_error(Status::Error(400, "Message not found")); + } + + const FormattedText *text = get_message_content_text(m->content.get()); + if (text == nullptr) { + return promise.set_error(Status::Error(400, "Message have no text")); + } + + td_->create_handler(std::move(promise))->send(text->text, from_language_code, to_language_code); +} + void MessagesManager::get_dialog_info_full(DialogId dialog_id, Promise &&promise, const char *source) { switch (dialog_id.get_type()) { case DialogType::User: diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index ddc11e06b..1ad6a3baf 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -601,6 +601,9 @@ class MessagesManager final : public Actor { void get_message_viewers(FullMessageId full_message_id, Promise> &&promise); + void translate_message(FullMessageId full_message_id, const string &from_language_code, + const string &to_language_code, Promise> &&promise); + bool is_message_edited_recently(FullMessageId full_message_id, int32 seconds); bool is_deleted_secret_chat(DialogId dialog_id) const; diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index ea581b055..04a77c54b 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -4742,6 +4742,15 @@ void Td::on_request(uint64 id, td_api::getMessageLinkInfo &request) { CREATE_REQUEST(GetMessageLinkInfoRequest, std::move(request.url_)); } +void Td::on_request(uint64 id, td_api::translateMessage &request) { + CHECK_IS_USER(); + CLEAN_INPUT_STRING(request.from_language_code_); + CLEAN_INPUT_STRING(request.to_language_code_); + CREATE_REQUEST_PROMISE(); + messages_manager_->translate_message({DialogId(request.chat_id_), MessageId(request.message_id_)}, + request.from_language_code_, request.to_language_code_, std::move(promise)); +} + void Td::on_request(uint64 id, const td_api::getFile &request) { send_closure(actor_id(this), &Td::send_result, id, file_manager_->get_file_object(FileId(request.file_id_, 0))); } diff --git a/td/telegram/Td.h b/td/telegram/Td.h index ded7a025a..a396664d7 100644 --- a/td/telegram/Td.h +++ b/td/telegram/Td.h @@ -533,6 +533,8 @@ class Td final : public Actor { void on_request(uint64 id, td_api::getMessageLinkInfo &request); + void on_request(uint64 id, td_api::translateMessage &request); + void on_request(uint64 id, const td_api::getFile &request); void on_request(uint64 id, td_api::getRemoteFile &request); diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index 9883e8d19..55552612e 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -2742,6 +2742,14 @@ class CliClient final : public Actor { send_request(td_api::make_object(chat_id, message_id, for_album)); } else if (op == "gmli") { send_request(td_api::make_object(args)); + } else if (op == "tm") { + ChatId chat_id; + MessageId message_id; + string from_language_code; + string to_language_code; + get_args(args, chat_id, message_id, from_language_code, to_language_code); + send_request( + td_api::make_object(chat_id, message_id, from_language_code, to_language_code)); } else if (op == "gf" || op == "GetFile") { send_request(td_api::make_object(as_file_id(args))); } else if (op == "gfdps") {