diff --git a/td/telegram/DocumentsManager.cpp b/td/telegram/DocumentsManager.cpp index b8e8a0915..7a4174de1 100644 --- a/td/telegram/DocumentsManager.cpp +++ b/td/telegram/DocumentsManager.cpp @@ -729,6 +729,12 @@ void DocumentsManager::delete_document_thumbnail(FileId file_id) { document->thumbnail = PhotoSize(); } +Slice DocumentsManager::get_document_mime_type(FileId file_id) const { + auto document = get_document(file_id); + CHECK(document != nullptr); + return document->mime_type; +} + FileId DocumentsManager::dup_document(FileId new_id, FileId old_id) { const GeneralDocument *old_document = get_document(old_id); CHECK(old_document != nullptr); diff --git a/td/telegram/DocumentsManager.h b/td/telegram/DocumentsManager.h index 81eca5226..4bae409d4 100644 --- a/td/telegram/DocumentsManager.h +++ b/td/telegram/DocumentsManager.h @@ -19,6 +19,7 @@ #include "td/utils/buffer.h" #include "td/utils/common.h" +#include "td/utils/Slice.h" #include "td/utils/WaitFreeHashMap.h" #include @@ -106,6 +107,8 @@ class DocumentsManager { void delete_document_thumbnail(FileId file_id); + Slice get_document_mime_type(FileId file_id) const; + FileId dup_document(FileId new_id, FileId old_id); void merge_documents(FileId new_id, FileId old_id); diff --git a/td/telegram/LinkManager.cpp b/td/telegram/LinkManager.cpp index 6535cebd3..6feead16b 100644 --- a/td/telegram/LinkManager.cpp +++ b/td/telegram/LinkManager.cpp @@ -2684,7 +2684,8 @@ Result LinkManager::get_background_url(const string &name, return url; } -td_api::object_ptr LinkManager::get_background_type_object(const string &link) { +td_api::object_ptr LinkManager::get_background_type_object(const string &link, + bool is_pattern) { auto parsed_link = parse_internal_link(link); if (parsed_link == nullptr) { return nullptr; @@ -2696,7 +2697,9 @@ td_api::object_ptr LinkManager::get_background_type_obje auto background_name = std::move(static_cast(parsed_object.get())->background_name_); if (!BackgroundType::is_background_name_local(background_name)) { - return nullptr; + BackgroundType type(false, is_pattern, nullptr); + type.apply_parameters_from_link(background_name); + return type.get_background_type_object(); } auto r_background_type = BackgroundType::get_local_background_type(background_name); if (r_background_type.is_error()) { diff --git a/td/telegram/LinkManager.h b/td/telegram/LinkManager.h index fa0489531..1f72d5ecf 100644 --- a/td/telegram/LinkManager.h +++ b/td/telegram/LinkManager.h @@ -84,7 +84,7 @@ class LinkManager final : public Actor { static Result get_background_url(const string &name, td_api::object_ptr background_type); - static td_api::object_ptr get_background_type_object(const string &link); + static td_api::object_ptr get_background_type_object(const string &link, bool is_pattern); static string get_dialog_filter_invite_link_slug(Slice invite_link); diff --git a/td/telegram/WebPagesManager.cpp b/td/telegram/WebPagesManager.cpp index 382fa5299..ccb16dde2 100644 --- a/td/telegram/WebPagesManager.cpp +++ b/td/telegram/WebPagesManager.cpp @@ -1455,11 +1455,16 @@ td_api::object_ptr WebPagesManager::get_link_preview_ty LOG_IF(ERROR, web_page->document_.type != Document::Type::Unknown && web_page->document_.type != Document::Type::General) << "Receive wrong document for " << web_page->url_; + bool is_pattern = false; + if (web_page->document_.type == Document::Type::General) { + auto mime_type = td_->documents_manager_->get_document_mime_type(web_page->document_.file_id); + is_pattern = mime_type == "image/png" || mime_type == "application/x-tgwallpattern"; + } return td_api::make_object( web_page->document_.type == Document::Type::General ? td_->documents_manager_->get_document_object(web_page->document_.file_id, PhotoFormat::Png) : nullptr, - LinkManager::get_background_type_object(web_page->url_)); + LinkManager::get_background_type_object(web_page->url_, is_pattern)); } if (type == "bot") { LOG_IF(ERROR, web_page->document_.type != Document::Type::Unknown)