【问题标题】:TDLib: how to send bold text in the message? (С++)TDLib:如何在消息中发送粗体文本? (С++)
【发布时间】:2020-05-03 19:27:13
【问题描述】:

使用官方 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), {});

我希望看到“你好!你好吗?”,但消息是用代码编写的,没有应用降价格式。

我在谷歌上花了几个小时试图弄清楚如何强制 TDLib 解析它。

更新:已解决!

感谢 Azeem 的帮助!

使用此示例,以下代码应发送已解析的消息(在 VS 2019 中测试)

void sendMsg(INT64 chatID, INT64 ReplyTo, const char* textMsg) {
const std::string text = textMsg;
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));

if (parseResponse.object->get_id()  == td_api::formattedText::ID) {
    auto formattedText = td_api::make_object<td_api::formattedText>();
    formattedText = td_api::move_object_as<td_api::formattedText>(parseResponse.object);

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

    message_content->text_ = std::move(formattedText);
    send_message->input_message_content_ = std::move(message_content);
    send_message->reply_to_message_id_ = ReplyTo;
    send_query(std::move(send_message), {});
}

}

【问题讨论】:

  • @AlanBirtles 我明白了,谢谢!但是你能指出我如何在代码中使用它吗?那些 TDLib 类有点搞砸了:)
  • 我认为这一切都在文档中。我自己没有使用过这个库
  • @Sargis:在我的代码 sn-p 中,response 不是 object_ptr 类型。它的类型是Response。你需要相应地改变它。
  • @Azeem 非常感谢!!终于我明白了。正确的方法是formattedText = td_api::move_object_as&lt;td_api::formattedText&gt;(parseResponse.object); 所以它的parseResponse.object 而不是parseResponse 这个库太难理解了:))

标签: c++ tdlib


【解决方案1】:

您可以像这样使用td_api::textParseModeMarkdowntd_api::parseTextEntitiestd::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
  }
}

【讨论】:

    猜你喜欢
    • 2021-10-07
    • 1970-01-01
    • 2012-03-19
    • 2018-08-25
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 2021-07-14
    相关资源
    最近更新 更多