TDLib: как отправить жирный текст в сообщении? (С ++) - PullRequest
2 голосов
/ 03 мая 2020

Используя официальный пример TDLib C ++, я пытаюсь отправить сообщение с отформатированным текстом уценки.

Вот мой код:

auto send_message = td_api::make_object<td_api::sendMessage>();
send_message->chat_id_ = -1001424068198;
auto message_content = td_api::make_object<td_api::inputMessageText>();

std::string text = "Hello! **how are u?**";
message_content->text_ = td_api::make_object<td_api::formattedText>();     
message_content->text_->text_ = std::move(text);      
send_message->input_message_content_ = std::move(message_content);
send_query(std::move(send_message), {});

Я ожидаю увидеть «Привет! *» 1006 * как дела?"но сообщение приходит так, как оно написано в коде, без применения форматирования уценки.

Я потратил часы на Google, пытаясь выяснить, как заставить TDLib разобрать его.

1 Ответ

1 голос
/ 08 мая 2020

Вы можете использовать td_api::textParseModeMarkdown, td_api::parseTextEntities и td::Client::execute() следующим образом:

using namespace td;

const std::string text = "*bold* _italic_ `code`";

auto textParseMarkdown = td_api::make_object<td_api::textParseModeMarkdown>( 2 );
auto parseTextEntities = td_api::make_object<td_api::parseTextEntities>( text, std::move( textParseMarkdown ) );

td::Client::Request parseRequest { 123, std::move( parseTextEntities ) };
auto parseResponse = td::Client::execute( std::move( parseRequest ) );

auto formattedText = td_api::make_object<td_api::formattedText>();

if ( parseResponse.object->get_id() == td_api::formattedText::ID )
{
    formattedText = td_api::move_object_as<td_api::formattedText>( parseResponse.object );
}
else
{
    std::vector<td_api::object_ptr<td_api::textEntity>> entities;
    formattedText = td_api::make_object<td_api::formattedText>( text, std::move(entities) );
}

std::cout << td_api::to_string( formattedText ) << '\n';

В целях отладки вы можете использовать td_api::to_string() для выгрузки содержимого объекта. Например, выгрузка parseTextEntities, например:

std::cout << td_api::to_string( parseTextEntities ) << '\n';

, даст следующее:

parseTextEntities {
  text = "*bold* _italic_ `code`"
  parse_mode = textParseModeMarkdown {
    version = 2
  }
}
...