diff options
| author | levlam <levlam@telegram.org> | 2026-06-08 20:41:32 +0300 |
|---|---|---|
| committer | levlam <levlam@telegram.org> | 2026-06-08 20:41:32 +0300 |
| commit | 405547b130f1e4acf36afef0eb766074323be7d9 (patch) | |
| tree | fed9121f22401836b87cdb66c9e0a73db203a9c7 | |
| parent | 06b25a96756c5abd9a0bb2dbfb6d99b6d20ec519 (diff) | |
Add sendRichMessageDraft.
| -rw-r--r-- | telegram-bot-api/Client.cpp | 53 | ||||
| -rw-r--r-- | telegram-bot-api/Client.h | 5 |
2 files changed, 58 insertions, 0 deletions
diff --git a/telegram-bot-api/Client.cpp b/telegram-bot-api/Client.cpp index 5bee6b0..5692f3f 100644 --- a/telegram-bot-api/Client.cpp +++ b/telegram-bot-api/Client.cpp @@ -259,6 +259,7 @@ bool Client::init_methods() { methods_.emplace("sendmediagroup", &Client::process_send_media_group_query); methods_.emplace("sendchataction", &Client::process_send_chat_action_query); methods_.emplace("sendmessagedraft", &Client::process_send_message_draft_query); + methods_.emplace("sendrichmessagedraft", &Client::process_send_rich_message_draft_query); methods_.emplace("setmessagereaction", &Client::process_set_message_reaction_query); methods_.emplace("editmessagetext", &Client::process_edit_message_text_query); methods_.emplace("editmessagelivelocation", &Client::process_edit_message_live_location_query); @@ -11459,6 +11460,42 @@ td::Result<td_api::object_ptr<td_api::inputMessageText>> Client::get_input_messa return make_object<td_api::inputMessageText>(std::move(formatted_text), std::move(link_preview_options), false); } +td::Result<td_api::object_ptr<td_api::inputRichMessage>> Client::get_input_rich_message(const Query *query) { + auto rich_message = query->arg("rich_message"); + if (rich_message.empty()) { + return td::Status::Error(400, "Rich message must be non-empty"); + } + + LOG(INFO) << "Parsing JSON object: " << rich_message; + auto r_value = json_decode(rich_message); + if (r_value.is_error()) { + LOG(INFO) << "Can't parse JSON object: " << r_value.error(); + return td::Status::Error(400, "Can't parse rich message JSON object"); + } + + return get_input_rich_message(r_value.move_as_ok()); +} + +td::Result<td_api::object_ptr<td_api::inputRichMessage>> Client::get_input_rich_message(td::JsonValue &&value) { + if (value.type() != td::JsonValue::Type::Object) { + return td::Status::Error(400, "Object expected as rich message"); + } + auto &object = value.get_object(); + TRY_RESULT(is_rtl, object.get_optional_bool_field("is_rtl")); + TRY_RESULT(skip_entity_detection, object.get_optional_bool_field("skip_entity_detection")); + auto result = make_object<td_api::inputRichMessage>(nullptr, is_rtl, !skip_entity_detection); + if (object.has_field("markdown")) { + TRY_RESULT(text, object.get_required_string_field("markdown")); + result->source_ = make_object<td_api::richMessageSourceMarkdown>(text); + } else if (object.has_field("html")) { + TRY_RESULT(text, object.get_required_string_field("html")); + result->source_ = make_object<td_api::richMessageSourceHtml>(text); + } else { + return td::Status::Error(400, "Rich message must be non-empty"); + } + return std::move(result); +} + td::Result<td_api::object_ptr<td_api::location>> Client::get_location(const Query *query) { auto latitude = trim(query->arg("latitude")); if (latitude.empty()) { @@ -13617,6 +13654,22 @@ td::Status Client::process_send_message_draft_query(PromisedQueryPtr &query) { return td::Status::OK(); } +td::Status Client::process_send_rich_message_draft_query(PromisedQueryPtr &query) { + auto chat_id_str = query->arg("chat_id"); + auto forum_topic_id = get_forum_topic_id(query.get(), "message_thread_id"); + auto draft_id = td::to_integer<int64>(query->arg("draft_id")); + TRY_RESULT(rich_message, get_input_rich_message(query.get())); + + check_chat(chat_id_str, AccessRights::Write, std::move(query), + [this, forum_topic_id, draft_id, rich_message = std::move(rich_message)](int64 chat_id, + PromisedQueryPtr query) mutable { + send_request(make_object<td_api::sendRichMessageDraft>(chat_id, forum_topic_id, draft_id, + std::move(rich_message)), + td::make_unique<TdOnOkQueryCallback>(std::move(query))); + }); + return td::Status::OK(); +} + td::Status Client::process_set_message_reaction_query(PromisedQueryPtr &query) { auto chat_id = query->arg("chat_id"); auto message_id = get_message_id(query.get()); diff --git a/telegram-bot-api/Client.h b/telegram-bot-api/Client.h index a582bd4..7391c18 100644 --- a/telegram-bot-api/Client.h +++ b/telegram-bot-api/Client.h @@ -652,6 +652,10 @@ class Client final : public WebhookActor::Callback { td::string text, object_ptr<td_api::linkPreviewOptions> link_preview_options, td::string parse_mode, td::JsonValue &&input_entities); + static td::Result<object_ptr<td_api::inputRichMessage>> get_input_rich_message(const Query *query); + + static td::Result<object_ptr<td_api::inputRichMessage>> get_input_rich_message(td::JsonValue &&value); + static td::Result<object_ptr<td_api::location>> get_location(const Query *query); static td::Result<object_ptr<td_api::location>> get_location(const td::JsonObject &object); @@ -820,6 +824,7 @@ class Client final : public WebhookActor::Callback { td::Status process_send_media_group_query(PromisedQueryPtr &query); td::Status process_send_chat_action_query(PromisedQueryPtr &query); td::Status process_send_message_draft_query(PromisedQueryPtr &query); + td::Status process_send_rich_message_draft_query(PromisedQueryPtr &query); td::Status process_set_message_reaction_query(PromisedQueryPtr &query); td::Status process_edit_message_text_query(PromisedQueryPtr &query); td::Status process_edit_message_live_location_query(PromisedQueryPtr &query); |
