Support web page flags in messageMediaWebPage.

This commit is contained in:
levlam 2023-10-16 16:47:22 +03:00
parent d261743f91
commit 8d55df14a0
4 changed files with 62 additions and 21 deletions

View File

@ -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<const MessageText *>(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<MessageContent> &content, ParserT &parser) {
}
case MessageContentType::Text: {
auto m = make_unique<MessageText>();
bool has_web_page_id = true;
if (parser.version() >= static_cast<int32>(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<MessageText>(std::move(text), web_page_id);
result.message_content = make_unique<MessageText>(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<MessageContent> create_text_message_content(string text, vector<MessageEntity> entities,
WebPageId web_page_id) {
return make_unique<MessageText>(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<MessageText>(FormattedText{std::move(text), std::move(entities)}, web_page_id, force_small_media,
force_large_media, is_manual);
}
unique_ptr<MessageContent> create_contact_registered_message_content() {
@ -2176,7 +2206,7 @@ static Result<InputMessageContent> 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<MessageText>(std::move(input_message_text.text), web_page_id);
content = make_unique<MessageText>(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<const MessageText *>(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<const MessagePoll *>(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<MessageText *>(content)->web_page_id = WebPageId();
auto message_text = static_cast<MessageText *>(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<MessageContent> get_secret_message_content(
}
auto url = r_http_url.ok().get_url();
auto result = make_unique<MessageText>(FormattedText{std::move(message_text), std::move(entities)}, WebPageId());
auto result = make_unique<MessageText>(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<MessageContent> 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<MessageContent> get_message_content(Td *td, FormattedText message,
if (disable_web_page_preview != nullptr) {
*disable_web_page_preview = true;
}
return make_unique<MessageText>(std::move(message), WebPageId());
return make_unique<MessageText>(std::move(message), WebPageId(), false, false, false);
case telegram_api::messageMediaPhoto::ID: {
auto media = move_tl_object_as<telegram_api::messageMediaPhoto>(media_ptr);
if (media->photo_ == nullptr) {
@ -5236,7 +5273,8 @@ unique_ptr<MessageContent> 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<MessageText>(std::move(message), web_page_id);
return make_unique<MessageText>(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<telegram_api::messageMediaPoll>(media_ptr);
@ -5296,7 +5334,7 @@ unique_ptr<MessageContent> get_message_content(Td *td, FormattedText message,
if (disable_web_page_preview != nullptr) {
*disable_web_page_preview = true;
}
return make_unique<MessageText>(std::move(message), WebPageId());
return make_unique<MessageText>(std::move(message), WebPageId(), false, false, false);
}
unique_ptr<MessageContent> dup_message_content(Td *td, DialogId dialog_id, const MessageContent *content,
@ -5964,7 +6002,7 @@ unique_ptr<MessageContent> get_action_message_content(Td *td, tl_object_ptr<tele
UNREACHABLE();
}
// explicit empty or wrong action
return make_unique<MessageText>(FormattedText(), WebPageId());
return make_unique<MessageText>(FormattedText(), WebPageId(), false, false, false);
}
tl_object_ptr<td_api::MessageContent> get_message_content_object(const MessageContent *content, Td *td,

View File

@ -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<MessageContent> create_text_message_content(string text, vector<MessageEntity> entities,
WebPageId web_page_id);
WebPageId web_page_id, bool force_small_media,
bool force_large_media, bool is_manual);
unique_ptr<MessageContent> create_contact_registered_message_content();

View File

@ -14447,7 +14447,7 @@ std::pair<DialogId, unique_ptr<MessagesManager::Message>> 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<MessageId> MessagesManager::send_bot_start_message(UserId bot_user_id, Di
vector<MessageEntity> text_entities;
text_entities.emplace_back(MessageEntity::Type::BotCommand, 0, narrow_cast<int32>(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);

View File

@ -62,6 +62,7 @@ enum class Version : int32 {
MakeParticipantFlags64Bit,
AddDocumentFlags,
AddUserFlags2,
AddMessageTextFlags,
Next
};