From 8d55df14a0dca997486eef08070daf7a25f666c4 Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 16 Oct 2023 16:47:22 +0300 Subject: [PATCH] Support web page flags in messageMediaWebPage. --- td/telegram/MessageContent.cpp | 70 +++++++++++++++++++++++++-------- td/telegram/MessageContent.h | 3 +- td/telegram/MessagesManager.cpp | 9 +++-- td/telegram/Version.h | 1 + 4 files changed, 62 insertions(+), 21 deletions(-) diff --git a/td/telegram/MessageContent.cpp b/td/telegram/MessageContent.cpp index 5544d4728..64cf86035 100644 --- a/td/telegram/MessageContent.cpp +++ b/td/telegram/MessageContent.cpp @@ -117,9 +117,17 @@ class MessageText final : public MessageContent { public: FormattedText text; WebPageId web_page_id; + bool force_small_media = false; + bool force_large_media = false; + bool is_manual = false; MessageText() = default; - MessageText(FormattedText text, WebPageId web_page_id) : text(std::move(text)), web_page_id(web_page_id) { + MessageText(FormattedText text, WebPageId web_page_id, bool force_small_media, bool force_large_media, bool is_manual) + : text(std::move(text)) + , web_page_id(web_page_id) + , force_small_media(force_small_media) + , force_large_media(force_large_media) + , is_manual(is_manual) { } MessageContentType get_type() const final { @@ -1061,8 +1069,17 @@ static void store(const MessageContent *content, StorerT &storer) { } case MessageContentType::Text: { const auto *m = static_cast(content); + bool has_web_page_id = m->web_page_id.is_valid(); + BEGIN_STORE_FLAGS(); + STORE_FLAG(has_web_page_id); + STORE_FLAG(m->force_small_media); + STORE_FLAG(m->force_large_media); + STORE_FLAG(m->is_manual); + END_STORE_FLAGS(); store(m->text, storer); - store(m->web_page_id, storer); + if (has_web_page_id) { + store(m->web_page_id, storer); + } break; } case MessageContentType::Unsupported: { @@ -1536,8 +1553,19 @@ static void parse(unique_ptr &content, ParserT &parser) { } case MessageContentType::Text: { auto m = make_unique(); + bool has_web_page_id = true; + if (parser.version() >= static_cast(Version::AddMessageTextFlags)) { + BEGIN_PARSE_FLAGS(); + PARSE_FLAG(has_web_page_id); + PARSE_FLAG(m->force_small_media); + PARSE_FLAG(m->force_large_media); + PARSE_FLAG(m->is_manual); + END_PARSE_FLAGS(); + } parse(m->text, parser); - parse(m->web_page_id, parser); + if (has_web_page_id) { + parse(m->web_page_id, parser); + } content = std::move(m); break; } @@ -2037,7 +2065,7 @@ InlineMessageContent create_inline_message_content(Td *td, FileId file_id, if (!result.disable_web_page_preview) { web_page_id = td->web_pages_manager_->get_web_page_by_url(get_first_url(text)); } - result.message_content = make_unique(std::move(text), web_page_id); + result.message_content = make_unique(std::move(text), web_page_id, false, false, false); reply_markup = std::move(inline_message->reply_markup_); break; } @@ -2116,8 +2144,10 @@ InlineMessageContent create_inline_message_content(Td *td, FileId file_id, } unique_ptr create_text_message_content(string text, vector entities, - WebPageId web_page_id) { - return make_unique(FormattedText{std::move(text), std::move(entities)}, web_page_id); + WebPageId web_page_id, bool force_small_media, + bool force_large_media, bool is_manual) { + return make_unique(FormattedText{std::move(text), std::move(entities)}, web_page_id, force_small_media, + force_large_media, is_manual); } unique_ptr create_contact_registered_message_content() { @@ -2176,7 +2206,7 @@ static Result create_input_message_content( if (!is_bot && !disable_web_page_preview && can_add_web_page_previews) { web_page_id = td->web_pages_manager_->get_web_page_by_url(get_first_url(input_message_text.text)); } - content = make_unique(std::move(input_message_text.text), web_page_id); + content = make_unique(std::move(input_message_text.text), web_page_id, false, false, false); break; } case td_api::inputMessageAnimation::ID: { @@ -3271,7 +3301,8 @@ bool can_forward_message_content(const MessageContent *content) { auto content_type = content->get_type(); if (content_type == MessageContentType::Text) { auto *text = static_cast(content); - return !is_empty_string(text->text.text); // text must be non-empty in the new message + // text must be non-empty if there is no link preview + return !is_empty_string(text->text.text) || text->web_page_id.is_valid(); } if (content_type == MessageContentType::Poll) { auto *poll = static_cast(content); @@ -3701,7 +3732,11 @@ bool has_message_content_web_page(const MessageContent *content) { void remove_message_content_web_page(MessageContent *content) { CHECK(content->get_type() == MessageContentType::Text); - static_cast(content)->web_page_id = WebPageId(); + auto message_text = static_cast(content); + message_text->web_page_id = WebPageId(); + message_text->force_small_media = false; + message_text->force_large_media = false; + message_text->is_manual = false; } bool can_message_content_have_media_timestamp(const MessageContent *content) { @@ -3836,7 +3871,8 @@ void merge_message_contents(Td *td, const MessageContent *old_content, MessageCo } need_update = true; } - if (old_->web_page_id != new_->web_page_id) { + if (old_->web_page_id != new_->web_page_id || old_->force_small_media != new_->force_small_media || + old_->force_large_media != new_->force_large_media || old_->is_manual != new_->is_manual) { LOG(INFO) << "Old: " << old_->web_page_id << ", new: " << new_->web_page_id; is_content_changed = true; need_update |= td->web_pages_manager_->have_web_page(old_->web_page_id) || @@ -5026,7 +5062,8 @@ unique_ptr get_secret_message_content( } auto url = r_http_url.ok().get_url(); - auto result = make_unique(FormattedText{std::move(message_text), std::move(entities)}, WebPageId()); + auto result = make_unique(FormattedText{std::move(message_text), std::move(entities)}, WebPageId(), + false, false, false); td->web_pages_manager_->get_web_page_by_url( url, PromiseCreator::lambda([&web_page_id = result->web_page_id, promise = load_data_multipromise.get_promise()]( @@ -5052,7 +5089,7 @@ unique_ptr get_secret_message_content( is_media_empty = true; } if (is_media_empty) { - return create_text_message_content(std::move(message_text), std::move(entities), WebPageId()); + return create_text_message_content(std::move(message_text), std::move(entities), WebPageId(), false, false, false); } switch (constructor_id) { case secret_api::decryptedMessageMediaPhoto::ID: { @@ -5112,7 +5149,7 @@ unique_ptr get_message_content(Td *td, FormattedText message, if (disable_web_page_preview != nullptr) { *disable_web_page_preview = true; } - return make_unique(std::move(message), WebPageId()); + return make_unique(std::move(message), WebPageId(), false, false, false); case telegram_api::messageMediaPhoto::ID: { auto media = move_tl_object_as(media_ptr); if (media->photo_ == nullptr) { @@ -5236,7 +5273,8 @@ unique_ptr get_message_content(Td *td, FormattedText message, *disable_web_page_preview = (media->webpage_ == nullptr); } auto web_page_id = td->web_pages_manager_->on_get_web_page(std::move(media->webpage_), owner_dialog_id); - return make_unique(std::move(message), web_page_id); + return make_unique(std::move(message), web_page_id, media->force_small_media_, + media->force_large_media_, media->manual_); } case telegram_api::messageMediaPoll::ID: { auto media = move_tl_object_as(media_ptr); @@ -5296,7 +5334,7 @@ unique_ptr get_message_content(Td *td, FormattedText message, if (disable_web_page_preview != nullptr) { *disable_web_page_preview = true; } - return make_unique(std::move(message), WebPageId()); + return make_unique(std::move(message), WebPageId(), false, false, false); } unique_ptr dup_message_content(Td *td, DialogId dialog_id, const MessageContent *content, @@ -5964,7 +6002,7 @@ unique_ptr get_action_message_content(Td *td, tl_object_ptr(FormattedText(), WebPageId()); + return make_unique(FormattedText(), WebPageId(), false, false, false); } tl_object_ptr get_message_content_object(const MessageContent *content, Td *td, diff --git a/td/telegram/MessageContent.h b/td/telegram/MessageContent.h index ec6a73962..15d29bfc0 100644 --- a/td/telegram/MessageContent.h +++ b/td/telegram/MessageContent.h @@ -95,7 +95,8 @@ InlineMessageContent create_inline_message_content(Td *td, FileId file_id, int32 allowed_media_content_id, Photo *photo, Game *game); unique_ptr create_text_message_content(string text, vector entities, - WebPageId web_page_id); + WebPageId web_page_id, bool force_small_media, + bool force_large_media, bool is_manual); unique_ptr create_contact_registered_message_content(); diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 9e1934682..219c3227b 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -14447,7 +14447,7 @@ std::pair> MessagesManager::creat if (content_type == MessageContentType::Sticker && get_message_content_sticker_type(td_, message_info.content.get()) == StickerType::CustomEmoji) { LOG(INFO) << "Replace emoji sticker with an empty message"; - message_info.content = create_text_message_content("Invalid sticker", {}, WebPageId()); + message_info.content = create_text_message_content("Invalid sticker", {}, WebPageId(), false, false, false); content_type = message_info.content->get_type(); } @@ -25896,9 +25896,10 @@ Result MessagesManager::send_bot_start_message(UserId bot_user_id, Di vector text_entities; text_entities.emplace_back(MessageEntity::Type::BotCommand, 0, narrow_cast(text.size())); bool need_update_dialog_pos = false; - Message *m = get_message_to_send(d, MessageId(), MessageInputReplyTo(), MessageSendOptions(), - create_text_message_content(text, std::move(text_entities), WebPageId()), - &need_update_dialog_pos); + Message *m = + get_message_to_send(d, MessageId(), MessageInputReplyTo(), MessageSendOptions(), + create_text_message_content(text, std::move(text_entities), WebPageId(), false, false, false), + &need_update_dialog_pos); m->is_bot_start_message = true; send_update_new_message(d, m); diff --git a/td/telegram/Version.h b/td/telegram/Version.h index 9308589a0..810dae4e6 100644 --- a/td/telegram/Version.h +++ b/td/telegram/Version.h @@ -62,6 +62,7 @@ enum class Version : int32 { MakeParticipantFlags64Bit, AddDocumentFlags, AddUserFlags2, + AddMessageTextFlags, Next };