diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 70f47d2a4..4c7ceccab 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -696,7 +696,7 @@ richTextMarked text:RichText = RichText; //@description A rich text phone number @text Text @phone_number Phone number richTextPhoneNumber text:RichText phone_number:string = RichText; -//@description A rich text inline image @document The image represented as a document +//@description A rich text inline image @document The image represented as a document. The image can be in GIF, JPEG or PNG format //@width Width of a bounding box in which the image should be shown, 0 if unknown //@height Height of a bounding box in which the image should be shown, 0 if unknown richTextInlineImage document:document width:int32 height:int32 = RichText; @@ -705,6 +705,10 @@ richTextInlineImage document:document width:int32 height:int32 = RichText; richTexts texts:vector = RichText; +//@description Contains a caption of an instant view web page block, consisting of a text and a trailing credit @text Content of the caption @credit Block credit (like HTML tag ) +pageBlockCaption text:RichText credit:RichText = PageBlockCaption; + + //@class PageBlock @description Describes a block of an instant view web page //@description The title of a page @title Title @@ -740,38 +744,38 @@ pageBlockAnchor name:string = PageBlock; //@description A list of texts @items Texts @is_ordered True, if the items should be marked with numbers pageBlockList items:vector is_ordered:Bool = PageBlock; -//@description A block quote @text Quote text @caption Quote caption -pageBlockBlockQuote text:RichText caption:RichText = PageBlock; +//@description A block quote @text Quote text @credit Quote credit +pageBlockBlockQuote text:RichText credit:RichText = PageBlock; -//@description A pull quote @text Quote text @caption Quote caption -pageBlockPullQuote text:RichText caption:RichText = PageBlock; +//@description A pull quote @text Quote text @credit Quote credit +pageBlockPullQuote text:RichText credit:RichText = PageBlock; //@description An animation @animation Animation file; may be null @caption Animation caption @need_autoplay True, if the animation should be played automatically -pageBlockAnimation animation:animation caption:RichText need_autoplay:Bool = PageBlock; +pageBlockAnimation animation:animation caption:pageBlockCaption need_autoplay:Bool = PageBlock; //@description An audio file @audio Audio file; may be null @caption Audio file caption -pageBlockAudio audio:audio caption:RichText = PageBlock; +pageBlockAudio audio:audio caption:pageBlockCaption = PageBlock; //@description A photo @photo Photo file; may be null @caption Photo caption -pageBlockPhoto photo:photo caption:RichText = PageBlock; +pageBlockPhoto photo:photo caption:pageBlockCaption = PageBlock; //@description A video @video Video file; may be null @caption Video caption @need_autoplay True, if the video should be played automatically @is_looped True, if the video should be looped -pageBlockVideo video:video caption:RichText need_autoplay:Bool is_looped:Bool = PageBlock; +pageBlockVideo video:video caption:pageBlockCaption need_autoplay:Bool is_looped:Bool = PageBlock; //@description A page cover @cover Cover pageBlockCover cover:PageBlock = PageBlock; //@description An embedded web page @url Web page URL, if available @html HTML-markup of the embedded page @poster_photo Poster photo, if available; may be null @width Block width @height Block height @caption Block caption @is_full_width True, if the block should be full width @allow_scrolling True, if scrolling should be allowed -pageBlockEmbedded url:string html:string poster_photo:photo width:int32 height:int32 caption:RichText is_full_width:Bool allow_scrolling:Bool = PageBlock; +pageBlockEmbedded url:string html:string poster_photo:photo width:int32 height:int32 caption:pageBlockCaption is_full_width:Bool allow_scrolling:Bool = PageBlock; //@description An embedded post @url Web page URL @author Post author @author_photo Post author photo @date Point in time (Unix timestamp) when the post was created; 0 if unknown @page_blocks Post content @caption Post caption -pageBlockEmbeddedPost url:string author:string author_photo:photo date:int32 page_blocks:vector caption:RichText = PageBlock; +pageBlockEmbeddedPost url:string author:string author_photo:photo date:int32 page_blocks:vector caption:pageBlockCaption = PageBlock; //@description A collage @page_blocks Collage item contents @caption Block caption -pageBlockCollage page_blocks:vector caption:RichText = PageBlock; +pageBlockCollage page_blocks:vector caption:pageBlockCaption = PageBlock; //@description A slideshow @page_blocks Slideshow item contents @caption Block caption -pageBlockSlideshow page_blocks:vector caption:RichText = PageBlock; +pageBlockSlideshow page_blocks:vector caption:pageBlockCaption = PageBlock; //@description A link to a chat @title Chat title @photo Chat photo; may be null @username Chat username, by which all other information about the chat should be resolved pageBlockChatLink title:string photo:chatPhoto username:string = PageBlock; diff --git a/td/generate/scheme/td_api.tlo b/td/generate/scheme/td_api.tlo index be3228569..05ed1f8d2 100644 Binary files a/td/generate/scheme/td_api.tlo and b/td/generate/scheme/td_api.tlo differ diff --git a/td/telegram/Version.h b/td/telegram/Version.h index 0fa2c97d1..681fc18fa 100644 --- a/td/telegram/Version.h +++ b/td/telegram/Version.h @@ -27,6 +27,7 @@ enum class Version : int32 { AddTermsOfService, AddContactVcard, AddMessageUnsupportedVersion, + InstantView2_0Support, Next }; diff --git a/td/telegram/WebPagesManager.cpp b/td/telegram/WebPagesManager.cpp index 3573cedf2..1c13edfc9 100644 --- a/td/telegram/WebPagesManager.cpp +++ b/td/telegram/WebPagesManager.cpp @@ -453,6 +453,30 @@ class WebPagesManager::RichText { } }; +class WebPagesManager::PageBlockCaption { + public: + RichText text; + RichText credit; + + template + void store(T &storer) const { + using ::td::store; + store(text, storer); + store(credit, storer); + } + + template + void parse(T &parser) { + using ::td::parse; + parse(text, parser); + if (parser.version() >= static_cast(Version::InstantView2_0Support)) { + parse(credit, parser); + } else { + credit = RichText(); + } + } +}; + class WebPagesManager::PageBlock { public: enum class Type : int32 { @@ -849,11 +873,11 @@ class WebPagesManager::PageBlockList : public PageBlock { class WebPagesManager::PageBlockBlockQuote : public PageBlock { RichText text; - RichText caption; + RichText credit; public: PageBlockBlockQuote() = default; - PageBlockBlockQuote(RichText &&text, RichText &&caption) : text(std::move(text)), caption(std::move(caption)) { + PageBlockBlockQuote(RichText &&text, RichText &&credit) : text(std::move(text)), credit(std::move(credit)) { } Type get_type() const override { @@ -861,31 +885,31 @@ class WebPagesManager::PageBlockBlockQuote : public PageBlock { } tl_object_ptr get_page_block_object() const override { - return make_tl_object(get_rich_text_object(text), get_rich_text_object(caption)); + return make_tl_object(get_rich_text_object(text), get_rich_text_object(credit)); } template void store(T &storer) const { using ::td::store; store(text, storer); - store(caption, storer); + store(credit, storer); } template void parse(T &parser) { using ::td::parse; parse(text, parser); - parse(caption, parser); + parse(credit, parser); } }; class WebPagesManager::PageBlockPullQuote : public PageBlock { RichText text; - RichText caption; + RichText credit; public: PageBlockPullQuote() = default; - PageBlockPullQuote(RichText &&text, RichText &&caption) : text(std::move(text)), caption(std::move(caption)) { + PageBlockPullQuote(RichText &&text, RichText &&credit) : text(std::move(text)), credit(std::move(credit)) { } Type get_type() const override { @@ -893,32 +917,32 @@ class WebPagesManager::PageBlockPullQuote : public PageBlock { } tl_object_ptr get_page_block_object() const override { - return make_tl_object(get_rich_text_object(text), get_rich_text_object(caption)); + return make_tl_object(get_rich_text_object(text), get_rich_text_object(credit)); } template void store(T &storer) const { using ::td::store; store(text, storer); - store(caption, storer); + store(credit, storer); } template void parse(T &parser) { using ::td::parse; parse(text, parser); - parse(caption, parser); + parse(credit, parser); } }; class WebPagesManager::PageBlockAnimation : public PageBlock { FileId animation_file_id; - RichText caption; + PageBlockCaption caption; bool need_autoplay = false; public: PageBlockAnimation() = default; - PageBlockAnimation(FileId animation_file_id, RichText &&caption, bool need_autoplay) + PageBlockAnimation(FileId animation_file_id, PageBlockCaption &&caption, bool need_autoplay) : animation_file_id(animation_file_id), caption(std::move(caption)), need_autoplay(need_autoplay) { } @@ -943,7 +967,7 @@ class WebPagesManager::PageBlockAnimation : public PageBlock { return make_tl_object( G()->td().get_actor_unsafe()->animations_manager_->get_animation_object(animation_file_id, "get_page_block_object"), - get_rich_text_object(caption), need_autoplay); + get_page_block_caption_object(caption), need_autoplay); } template @@ -988,11 +1012,11 @@ class WebPagesManager::PageBlockAnimation : public PageBlock { class WebPagesManager::PageBlockPhoto : public PageBlock { Photo photo; - RichText caption; + PageBlockCaption caption; public: PageBlockPhoto() = default; - PageBlockPhoto(Photo photo, RichText &&caption) : photo(std::move(photo)), caption(std::move(caption)) { + PageBlockPhoto(Photo photo, PageBlockCaption &&caption) : photo(std::move(photo)), caption(std::move(caption)) { } Type get_type() const override { @@ -1005,7 +1029,8 @@ class WebPagesManager::PageBlockPhoto : public PageBlock { tl_object_ptr get_page_block_object() const override { return make_tl_object( - get_photo_object(G()->td().get_actor_unsafe()->file_manager_.get(), &photo), get_rich_text_object(caption)); + get_photo_object(G()->td().get_actor_unsafe()->file_manager_.get(), &photo), + get_page_block_caption_object(caption)); } template @@ -1025,13 +1050,13 @@ class WebPagesManager::PageBlockPhoto : public PageBlock { class WebPagesManager::PageBlockVideo : public PageBlock { FileId video_file_id; - RichText caption; + PageBlockCaption caption; bool need_autoplay = false; bool is_looped = false; public: PageBlockVideo() = default; - PageBlockVideo(FileId video_file_id, RichText &&caption, bool need_autoplay, bool is_looped) + PageBlockVideo(FileId video_file_id, PageBlockCaption &&caption, bool need_autoplay, bool is_looped) : video_file_id(video_file_id), caption(std::move(caption)), need_autoplay(need_autoplay), is_looped(is_looped) { } @@ -1054,8 +1079,8 @@ class WebPagesManager::PageBlockVideo : public PageBlock { tl_object_ptr get_page_block_object() const override { return make_tl_object( - G()->td().get_actor_unsafe()->videos_manager_->get_video_object(video_file_id), get_rich_text_object(caption), - need_autoplay, is_looped); + G()->td().get_actor_unsafe()->videos_manager_->get_video_object(video_file_id), + get_page_block_caption_object(caption), need_autoplay, is_looped); } template @@ -1138,13 +1163,13 @@ class WebPagesManager::PageBlockEmbedded : public PageBlock { string html; Photo poster_photo; Dimensions dimensions; - RichText caption; + PageBlockCaption caption; bool is_full_width; bool allow_scrolling; public: PageBlockEmbedded() = default; - PageBlockEmbedded(string url, string html, Photo poster_photo, Dimensions dimensions, RichText &&caption, + PageBlockEmbedded(string url, string html, Photo poster_photo, Dimensions dimensions, PageBlockCaption &&caption, bool is_full_width, bool allow_scrolling) : url(std::move(url)) , html(std::move(html)) @@ -1166,7 +1191,7 @@ class WebPagesManager::PageBlockEmbedded : public PageBlock { tl_object_ptr get_page_block_object() const override { return make_tl_object( url, html, get_photo_object(G()->td().get_actor_unsafe()->file_manager_.get(), &poster_photo), dimensions.width, - dimensions.height, get_rich_text_object(caption), is_full_width, allow_scrolling); + dimensions.height, get_page_block_caption_object(caption), is_full_width, allow_scrolling); } template @@ -1206,12 +1231,12 @@ class WebPagesManager::PageBlockEmbeddedPost : public PageBlock { Photo author_photo; int32 date; vector> page_blocks; - RichText caption; + PageBlockCaption caption; public: PageBlockEmbeddedPost() = default; PageBlockEmbeddedPost(string url, string author, Photo author_photo, int32 date, - vector> &&page_blocks, RichText &&caption) + vector> &&page_blocks, PageBlockCaption &&caption) : url(std::move(url)) , author(std::move(author)) , author_photo(std::move(author_photo)) @@ -1235,7 +1260,7 @@ class WebPagesManager::PageBlockEmbeddedPost : public PageBlock { tl_object_ptr get_page_block_object() const override { return make_tl_object( url, author, get_photo_object(G()->td().get_actor_unsafe()->file_manager_.get(), &author_photo), date, - get_page_block_objects(page_blocks), get_rich_text_object(caption)); + get_page_block_objects(page_blocks), get_page_block_caption_object(caption)); } template void store(T &storer) const { @@ -1262,11 +1287,11 @@ class WebPagesManager::PageBlockEmbeddedPost : public PageBlock { class WebPagesManager::PageBlockCollage : public PageBlock { vector> page_blocks; - RichText caption; + PageBlockCaption caption; public: PageBlockCollage() = default; - PageBlockCollage(vector> &&page_blocks, RichText &&caption) + PageBlockCollage(vector> &&page_blocks, PageBlockCaption &&caption) : page_blocks(std::move(page_blocks)), caption(std::move(caption)) { } @@ -1283,7 +1308,8 @@ class WebPagesManager::PageBlockCollage : public PageBlock { } tl_object_ptr get_page_block_object() const override { - return make_tl_object(get_page_block_objects(page_blocks), get_rich_text_object(caption)); + return make_tl_object(get_page_block_objects(page_blocks), + get_page_block_caption_object(caption)); } template @@ -1303,11 +1329,11 @@ class WebPagesManager::PageBlockCollage : public PageBlock { class WebPagesManager::PageBlockSlideshow : public PageBlock { vector> page_blocks; - RichText caption; + PageBlockCaption caption; public: PageBlockSlideshow() = default; - PageBlockSlideshow(vector> &&page_blocks, RichText &&caption) + PageBlockSlideshow(vector> &&page_blocks, PageBlockCaption &&caption) : page_blocks(std::move(page_blocks)), caption(std::move(caption)) { } @@ -1325,7 +1351,7 @@ class WebPagesManager::PageBlockSlideshow : public PageBlock { tl_object_ptr get_page_block_object() const override { return make_tl_object(get_page_block_objects(page_blocks), - get_rich_text_object(caption)); + get_page_block_caption_object(caption)); } template @@ -1386,11 +1412,12 @@ class WebPagesManager::PageBlockChatLink : public PageBlock { class WebPagesManager::PageBlockAudio : public PageBlock { FileId audio_file_id; - RichText caption; + PageBlockCaption caption; public: PageBlockAudio() = default; - PageBlockAudio(FileId audio_file_id, RichText &&caption) : audio_file_id(audio_file_id), caption(std::move(caption)) { + PageBlockAudio(FileId audio_file_id, PageBlockCaption &&caption) + : audio_file_id(audio_file_id), caption(std::move(caption)) { } Type get_type() const override { @@ -1412,7 +1439,8 @@ class WebPagesManager::PageBlockAudio : public PageBlock { tl_object_ptr get_page_block_object() const override { return make_tl_object( - G()->td().get_actor_unsafe()->audios_manager_->get_audio_object(audio_file_id), get_rich_text_object(caption)); + G()->td().get_actor_unsafe()->audios_manager_->get_audio_object(audio_file_id), + get_page_block_caption_object(caption)); } template @@ -2487,6 +2515,21 @@ vector> WebPagesManager::get_rich_text_objects(c return transform(rich_texts, [](const RichText &rich_text) { return get_rich_text_object(rich_text); }); } +WebPagesManager::PageBlockCaption WebPagesManager::get_page_block_caption( + tl_object_ptr &&page_caption, const std::unordered_map &documents) { + CHECK(page_caption != nullptr); + PageBlockCaption result; + result.text = get_rich_text(std::move(page_caption->text_), documents); + result.credit = get_rich_text(std::move(page_caption->credit_), documents); + return result; +} + +td_api::object_ptr WebPagesManager::get_page_block_caption_object( + const PageBlockCaption &caption) { + return td_api::make_object(get_rich_text_object(caption.text), + get_rich_text_object(caption.credit)); +} + vector> WebPagesManager::get_page_block_objects( const vector> &page_blocks) { return transform(page_blocks, @@ -2566,7 +2609,7 @@ unique_ptr WebPagesManager::get_page_block( photo = it->second; } return make_unique(std::move(photo), - get_rich_text(std::move(page_block->caption_->text_), documents)); + get_page_block_caption(std::move(page_block->caption_), documents)); } case telegram_api::pageBlockVideo::ID: { auto page_block = move_tl_object_as(page_block_ptr); @@ -2576,7 +2619,7 @@ unique_ptr WebPagesManager::get_page_block( if (animations_it != animations.end()) { LOG_IF(ERROR, !is_looped) << "Receive non-looped animation"; return make_unique( - animations_it->second, get_rich_text(std::move(page_block->caption_->text_), documents), need_autoplay); + animations_it->second, get_page_block_caption(std::move(page_block->caption_), documents), need_autoplay); } auto it = videos.find(page_block->video_id_); @@ -2585,7 +2628,7 @@ unique_ptr WebPagesManager::get_page_block( video_file_id = it->second; } return make_unique( - video_file_id, get_rich_text(std::move(page_block->caption_->text_), documents), need_autoplay, is_looped); + video_file_id, get_page_block_caption(std::move(page_block->caption_), documents), need_autoplay, is_looped); } case telegram_api::pageBlockCover::ID: { auto page_block = move_tl_object_as(page_block_ptr); @@ -2610,7 +2653,7 @@ unique_ptr WebPagesManager::get_page_block( } return td::make_unique(std::move(page_block->url_), std::move(page_block->html_), std::move(poster_photo), get_dimensions(page_block->w_, page_block->h_), - get_rich_text(std::move(page_block->caption_->text_), documents), + get_page_block_caption(std::move(page_block->caption_), documents), is_full_width, allow_scrolling); } case telegram_api::pageBlockEmbedPost::ID: { @@ -2625,19 +2668,19 @@ unique_ptr WebPagesManager::get_page_block( return td::make_unique( std::move(page_block->url_), std::move(page_block->author_), std::move(author_photo), page_block->date_, get_page_blocks(std::move(page_block->blocks_), animations, audios, documents, photos, videos), - get_rich_text(std::move(page_block->caption_->text_), documents)); + get_page_block_caption(std::move(page_block->caption_), documents)); } case telegram_api::pageBlockCollage::ID: { auto page_block = move_tl_object_as(page_block_ptr); return td::make_unique( get_page_blocks(std::move(page_block->items_), animations, audios, documents, photos, videos), - get_rich_text(std::move(page_block->caption_->text_), documents)); + get_page_block_caption(std::move(page_block->caption_), documents)); } case telegram_api::pageBlockSlideshow::ID: { auto page_block = move_tl_object_as(page_block_ptr); return td::make_unique( get_page_blocks(std::move(page_block->items_), animations, audios, documents, photos, videos), - get_rich_text(std::move(page_block->caption_->text_), documents)); + get_page_block_caption(std::move(page_block->caption_), documents)); } case telegram_api::pageBlockChannel::ID: { auto page_block = move_tl_object_as(page_block_ptr); @@ -2674,7 +2717,7 @@ unique_ptr WebPagesManager::get_page_block( audio_file_id = it->second; } return make_unique(audio_file_id, - get_rich_text(std::move(page_block->caption_->text_), documents)); + get_page_block_caption(std::move(page_block->caption_), documents)); } default: UNREACHABLE(); diff --git a/td/telegram/WebPagesManager.h b/td/telegram/WebPagesManager.h index b1c325cc3..e4a8c24cc 100644 --- a/td/telegram/WebPagesManager.h +++ b/td/telegram/WebPagesManager.h @@ -100,6 +100,8 @@ class WebPagesManager : public Actor { class RichText; + class PageBlockCaption; + class PageBlock; class PageBlockTitle; class PageBlockSubtitle; @@ -170,6 +172,11 @@ class WebPagesManager : public Actor { static vector> get_rich_text_objects(const vector &rich_texts); + static PageBlockCaption get_page_block_caption(tl_object_ptr &&page_caption, + const std::unordered_map &documents); + + static td_api::object_ptr get_page_block_caption_object(const PageBlockCaption &caption); + static vector> get_page_block_objects( const vector> &page_blocks);