From 01328b88b55f181d987ab663acd434ef8561c4e6 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 9 Jun 2026 12:32:30 +0300 Subject: Add JsonRichBlock. --- telegram-bot-api/Client.cpp | 283 ++++++++++++++++++++++++++++++++++++++++++++ telegram-bot-api/Client.h | 4 + 2 files changed, 287 insertions(+) diff --git a/telegram-bot-api/Client.cpp b/telegram-bot-api/Client.cpp index 3569009..ac17df2 100644 --- a/telegram-bot-api/Client.cpp +++ b/telegram-bot-api/Client.cpp @@ -645,6 +645,34 @@ class Client::JsonVectorEntities final : public td::Jsonable { const Client *client_; }; +class Client::JsonRichBlock final : public td::Jsonable { + public: + JsonRichBlock(const td_api::PageBlock *block, const Client *client) : block_(block), client_(client) { + } + void store(td::JsonValueScope *scope) const; + + private: + const td_api::PageBlock *block_; + const Client *client_; +}; + +class Client::JsonRichBlocks final : public td::Jsonable { + public: + JsonRichBlocks(const td::vector> &blocks, const Client *client) + : blocks_(blocks), client_(client) { + } + void store(td::JsonValueScope *scope) const { + auto array = scope->enter_array(); + for (const auto &block : blocks_) { + array << JsonRichBlock(block.get(), client_); + } + } + + private: + const td::vector> &blocks_; + const Client *client_; +}; + class Client::JsonRichText final : public td::Jsonable { public: JsonRichText(const td_api::RichText *text, const Client *client) : text_(text), client_(client) { @@ -896,6 +924,23 @@ class Client::JsonRichTableCell final : public td::Jsonable { const Client *client_; }; +class Client::JsonRichTableRow final : public td::Jsonable { + public: + JsonRichTableRow(const td::vector> &cells, const Client *client) + : cells_(cells), client_(client) { + } + void store(td::JsonValueScope *scope) const { + auto array = scope->enter_array(); + for (const auto &cell : cells_) { + array << JsonRichTableCell(cell.get(), client_); + } + } + + private: + const td::vector> &cells_; + const Client *client_; +}; + class Client::JsonRichBlockCaption final : public td::Jsonable { public: JsonRichBlockCaption(const td_api::pageBlockCaption *caption, const Client *client) @@ -914,6 +959,31 @@ class Client::JsonRichBlockCaption final : public td::Jsonable { const Client *client_; }; +class Client::JsonRichBlockListItem final : public td::Jsonable { + public: + JsonRichBlockListItem(const td_api::pageBlockListItem *item, const Client *client) : item_(item), client_(client) { + } + void store(td::JsonValueScope *scope) const { + auto object = scope->enter_object(); + object("label", item_->label_); + object("blocks", JsonRichBlocks(item_->blocks_, client_)); + if (item_->has_checkbox_) { + object("has_checkbox", td::JsonTrue()); + if (item_->is_checked_) { + object("is_checked", td::JsonTrue()); + } + } + if (!item_->type_.empty()) { + object("type", item_->type_); + object("value", item_->value_); + } + } + + private: + const td_api::pageBlockListItem *item_; + const Client *client_; +}; + class Client::JsonMaskPosition final : public td::Jsonable { public: explicit JsonMaskPosition(const td_api::maskPosition *mask_position) : mask_position_(mask_position) { @@ -4366,6 +4436,219 @@ class Client::JsonTextQuote final : public td::Jsonable { const Client *client_; }; +void Client::JsonRichBlock::store(td::JsonValueScope *scope) const { + auto object = scope->enter_object(); + switch (block_->get_id()) { + case td_api::pageBlockSectionHeading::ID: { + const auto *block = static_cast(block_); + object("type", "heading"); + object("text", JsonRichText(block->text_.get(), client_)); + object("size", block->size_); + return; + } + case td_api::pageBlockParagraph::ID: { + const auto *block = static_cast(block_); + object("type", "paragraph"); + object("text", JsonRichText(block->text_.get(), client_)); + return; + } + case td_api::pageBlockPreformatted::ID: { + const auto *block = static_cast(block_); + object("type", "pre"); + object("text", JsonRichText(block->text_.get(), client_)); + if (!block->language_.empty()) { + object("language", block->language_); + } + return; + } + case td_api::pageBlockFooter::ID: { + const auto *block = static_cast(block_); + object("type", "footer"); + object("text", JsonRichText(block->footer_.get(), client_)); + return; + } + case td_api::pageBlockDivider::ID: + object("type", "divider"); + return; + case td_api::pageBlockMathematicalExpression::ID: { + const auto *block = static_cast(block_); + object("type", "mathematical_expression"); + object("expression", block->expression_); + return; + } + case td_api::pageBlockAnchor::ID: { + const auto *block = static_cast(block_); + object("type", "anchor"); + object("name", block->name_); + return; + } + case td_api::pageBlockList::ID: { + const auto *block = static_cast(block_); + object("type", "list"); + object("items", td::json_array(block->items_, [client = client_](const auto &item) { + return JsonRichBlockListItem(item.get(), client); + })); + return; + } + case td_api::pageBlockBlockQuote::ID: { + const auto *block = static_cast(block_); + object("type", "blockquote"); + object("blocks", JsonRichBlocks(block->blocks_, client_)); + if (block->credit_ != nullptr) { + object("credit", JsonRichText(block->credit_.get(), client_)); + } + return; + } + case td_api::pageBlockPullQuote::ID: { + const auto *block = static_cast(block_); + object("type", "pullquote"); + object("text", JsonRichText(block->text_.get(), client_)); + if (block->credit_ != nullptr) { + object("credit", JsonRichText(block->credit_.get(), client_)); + } + return; + } + case td_api::pageBlockCollage::ID: { + const auto *block = static_cast(block_); + object("type", "collage"); + object("blocks", JsonRichBlocks(block->blocks_, client_)); + if (block->caption_ != nullptr) { + object("caption", JsonRichBlockCaption(block->caption_.get(), client_)); + } + return; + } + case td_api::pageBlockSlideshow::ID: { + const auto *block = static_cast(block_); + object("type", "slideshow"); + object("blocks", JsonRichBlocks(block->blocks_, client_)); + if (block->caption_ != nullptr) { + object("caption", JsonRichBlockCaption(block->caption_.get(), client_)); + } + return; + } + case td_api::pageBlockTable::ID: { + const auto *block = static_cast(block_); + object("type", "table"); + object("cells", td::json_array(block->cells_, + [client = client_](const auto &row) { return JsonRichTableRow(row, client); })); + if (block->caption_ != nullptr) { + object("caption", JsonRichText(block->caption_.get(), client_)); + } + if (block->is_bordered_) { + object("is_bordered", td::JsonTrue()); + } + if (block->is_striped_) { + object("is_striped", td::JsonTrue()); + } + return; + } + case td_api::pageBlockDetails::ID: { + const auto *block = static_cast(block_); + object("type", "details"); + object("summary", JsonRichText(block->header_.get(), client_)); + object("blocks", JsonRichBlocks(block->blocks_, client_)); + if (block->is_open_) { + object("is_open", td::JsonTrue()); + } + return; + } + case td_api::pageBlockMap::ID: { + const auto *block = static_cast(block_); + object("type", "map"); + object("location", JsonLocation(block->location_.get())); + object("zoom", block->zoom_); + object("width", block->width_); + object("height", block->height_); + if (block->caption_ != nullptr) { + object("caption", JsonRichBlockCaption(block->caption_.get(), client_)); + } + return; + } + case td_api::pageBlockAnimation::ID: { + const auto *block = static_cast(block_); + if (block->animation_ == nullptr) { + break; + } + object("type", "animation"); + object("animation", JsonAnimation(block->animation_.get(), false, client_)); + if (block->caption_ != nullptr) { + object("caption", JsonRichBlockCaption(block->caption_.get(), client_)); + } + if (block->need_autoplay_) { + object("need_autoplay", td::JsonTrue()); + } + if (block->has_spoiler_) { + object("has_spoiler", td::JsonTrue()); + } + return; + } + case td_api::pageBlockAudio::ID: { + const auto *block = static_cast(block_); + if (block->audio_ == nullptr) { + break; + } + object("type", "audio"); + object("audio", JsonAudio(block->audio_.get(), client_)); + if (block->caption_ != nullptr) { + object("caption", JsonRichBlockCaption(block->caption_.get(), client_)); + } + return; + } + case td_api::pageBlockPhoto::ID: { + const auto *block = static_cast(block_); + if (block->photo_ == nullptr) { + break; + } + object("type", "photo"); + object("photo", JsonPhoto(block->photo_.get(), client_)); + if (block->caption_ != nullptr) { + object("caption", JsonRichBlockCaption(block->caption_.get(), client_)); + } + if (block->has_spoiler_) { + object("has_spoiler", td::JsonTrue()); + } + return; + } + case td_api::pageBlockVideo::ID: { + const auto *block = static_cast(block_); + if (block->video_ == nullptr) { + break; + } + object("type", "video"); + object("video", JsonVideo(block->video_.get(), nullptr, 0, nullptr, client_)); + if (block->caption_ != nullptr) { + object("caption", JsonRichBlockCaption(block->caption_.get(), client_)); + } + if (block->need_autoplay_) { + object("need_autoplay", td::JsonTrue()); + } + if (block->is_looped_) { + object("is_looped", td::JsonTrue()); + } + if (block->has_spoiler_) { + object("has_spoiler", td::JsonTrue()); + } + return; + } + case td_api::pageBlockVoiceNote::ID: { + const auto *block = static_cast(block_); + if (block->voice_note_ == nullptr) { + break; + } + object("type", "voice_note"); + object("voice_note", JsonVoiceNote(block->voice_note_.get(), client_)); + if (block->caption_ != nullptr) { + object("caption", JsonRichBlockCaption(block->caption_.get(), client_)); + } + return; + } + default: + break; + } + LOG(ERROR) << "Receive " << td_api::to_string(*block_); + object("type", "unknown"); +} + void Client::JsonMessage::store(td::JsonValueScope *scope) const { CHECK(message_ != nullptr); auto object = scope->enter_object(); diff --git a/telegram-bot-api/Client.h b/telegram-bot-api/Client.h index 19abd33..d7baacc 100644 --- a/telegram-bot-api/Client.h +++ b/telegram-bot-api/Client.h @@ -155,8 +155,12 @@ class Client final : public WebhookActor::Callback { class JsonEntity; class JsonVectorEntities; class JsonRichText; + class JsonRichBlock; + class JsonRichBlocks; class JsonRichTableCell; + class JsonRichTableRow; class JsonRichBlockCaption; + class JsonRichBlockListItem; class JsonWebAppInfo; class JsonCopyTextButton; class JsonInlineKeyboardButton; -- cgit v1.2.3