Support spoilers for messageAnimation.

This commit is contained in:
levlam 2022-12-26 14:20:48 +03:00
parent 92e37fae46
commit eff7675749
5 changed files with 59 additions and 29 deletions

View File

@ -2241,8 +2241,12 @@ inputPassportElementError type:PassportElementType message:string source:InputPa
//@description A text message @text Text of the message @web_page A preview of the web page that's mentioned in the text; may be null
messageText text:formattedText web_page:webPage = MessageContent;
//@description An animation message (GIF-style). @animation The animation description @caption Animation caption @is_secret True, if the animation thumbnail must be blurred and the animation must be shown only while tapped
messageAnimation animation:animation caption:formattedText is_secret:Bool = MessageContent;
//@description An animation message (GIF-style).
//@animation The animation description
//@caption Animation caption
//@has_spoiler True, if the animation preview should be covered by a spoiler animation
//@is_secret True, if the animation thumbnail must be blurred and the animation must be shown only while tapped
messageAnimation animation:animation caption:formattedText has_spoiler:Bool is_secret:Bool = MessageContent;
//@description An audio message @audio The audio description @caption Audio caption
messageAudio audio:audio caption:formattedText = MessageContent;
@ -2253,7 +2257,7 @@ messageDocument document:document caption:formattedText = MessageContent;
//@description A photo message
//@photo The photo
//@caption Photo caption
//@has_spoiler True, if the photo preview should be covered by spoiler animation
//@has_spoiler True, if the photo preview should be covered by a spoiler animation
//@is_secret True, if the photo must be blurred and must be shown only while tapped
messagePhoto photo:photo caption:formattedText has_spoiler:Bool is_secret:Bool = MessageContent;
@ -2266,7 +2270,7 @@ messageSticker sticker:sticker is_premium:Bool = MessageContent;
//@description A video message
//@video The video description
//@caption Video caption
//@has_spoiler True, if the video preview should be covered by spoiler animation
//@has_spoiler True, if the video preview should be covered by a spoiler animation
//@is_secret True, if the video thumbnail must be blurred and the video must be shown only while tapped
messageVideo video:video caption:formattedText has_spoiler:Bool is_secret:Bool = MessageContent;
@ -2574,7 +2578,8 @@ inputMessageText text:formattedText disable_web_page_preview:Bool clear_draft:Bo
//@width Width of the animation; may be replaced by the server
//@height Height of the animation; may be replaced by the server
//@caption Animation caption; pass null to use an empty caption; 0-getOption("message_caption_length_max") characters
inputMessageAnimation animation:InputFile thumbnail:inputThumbnail added_sticker_file_ids:vector<int32> duration:int32 width:int32 height:int32 caption:formattedText = InputMessageContent;
//@has_spoiler True, if the animation preview should be covered by a spoiler animation; not supported in secret chats
inputMessageAnimation animation:InputFile thumbnail:inputThumbnail added_sticker_file_ids:vector<int32> duration:int32 width:int32 height:int32 caption:formattedText has_spoiler:Bool = InputMessageContent;
//@description An audio message
//@audio Audio file to be sent
@ -2600,7 +2605,7 @@ inputMessageDocument document:InputFile thumbnail:inputThumbnail disable_content
//@height Photo height
//@caption Photo caption; pass null to use an empty caption; 0-getOption("message_caption_length_max") characters
//@ttl Photo TTL (Time To Live), in seconds (0-60). A non-zero TTL can be specified only in private chats
//@has_spoiler True, if the photo preview should be covered by spoiler animation; not supported in secret chats
//@has_spoiler True, if the photo preview should be covered by a spoiler animation; not supported in secret chats
inputMessagePhoto photo:InputFile thumbnail:inputThumbnail added_sticker_file_ids:vector<int32> width:int32 height:int32 caption:formattedText ttl:int32 has_spoiler:Bool = InputMessageContent;
//@description A sticker message
@ -2621,7 +2626,7 @@ inputMessageSticker sticker:InputFile thumbnail:inputThumbnail width:int32 heigh
//@supports_streaming True, if the video is supposed to be streamed
//@caption Video caption; pass null to use an empty caption; 0-getOption("message_caption_length_max") characters
//@ttl Video TTL (Time To Live), in seconds (0-60). A non-zero TTL can be specified only in private chats
//@has_spoiler True, if the video preview should be covered by spoiler animation; not supported in secret chats
//@has_spoiler True, if the video preview should be covered by a spoiler animation; not supported in secret chats
inputMessageVideo video:InputFile thumbnail:inputThumbnail added_sticker_file_ids:vector<int32> duration:int32 width:int32 height:int32 supports_streaming:Bool caption:formattedText ttl:int32 has_spoiler:Bool = InputMessageContent;
//@description A video note message

View File

@ -308,17 +308,25 @@ void AnimationsManager::create_animation(FileId file_id, string minithumbnail, P
tl_object_ptr<telegram_api::InputMedia> AnimationsManager::get_input_media(
FileId file_id, tl_object_ptr<telegram_api::InputFile> input_file,
tl_object_ptr<telegram_api::InputFile> input_thumbnail) const {
tl_object_ptr<telegram_api::InputFile> input_thumbnail, bool has_spoiler) const {
auto file_view = td_->file_manager_->get_file_view(file_id);
if (file_view.is_encrypted()) {
return nullptr;
}
if (file_view.has_remote_location() && !file_view.main_remote_location().is_web() && input_file == nullptr) {
int32 flags = 0;
if (has_spoiler) {
flags |= telegram_api::inputMediaDocument::SPOILER_MASK;
}
return make_tl_object<telegram_api::inputMediaDocument>(
0, false /*ignored*/, file_view.main_remote_location().as_input_document(), 0, string());
flags, false /*ignored*/, file_view.main_remote_location().as_input_document(), 0, string());
}
if (file_view.has_url()) {
return make_tl_object<telegram_api::inputMediaDocumentExternal>(0, false /*ignored*/, file_view.url(), 0);
int32 flags = 0;
if (has_spoiler) {
flags |= telegram_api::inputMediaDocumentExternal::SPOILER_MASK;
}
return make_tl_object<telegram_api::inputMediaDocumentExternal>(flags, false /*ignored*/, file_view.url(), 0);
}
if (input_file != nullptr) {
@ -350,6 +358,9 @@ tl_object_ptr<telegram_api::InputMedia> AnimationsManager::get_input_media(
if (input_thumbnail != nullptr) {
flags |= telegram_api::inputMediaUploadedDocument::THUMB_MASK;
}
if (has_spoiler) {
flags |= telegram_api::inputMediaUploadedDocument::SPOILER_MASK;
}
return make_tl_object<telegram_api::inputMediaUploadedDocument>(
flags, false /*ignored*/, false /*ignored*/, false /*ignored*/, std::move(input_file),
std::move(input_thumbnail), mime_type, std::move(attributes), std::move(added_stickers), 0);

View File

@ -45,7 +45,8 @@ class AnimationsManager final : public Actor {
tl_object_ptr<telegram_api::InputMedia> get_input_media(FileId file_id,
tl_object_ptr<telegram_api::InputFile> input_file,
tl_object_ptr<telegram_api::InputFile> input_thumbnail) const;
tl_object_ptr<telegram_api::InputFile> input_thumbnail,
bool has_spoiler) const;
SecretInputMedia get_secret_input_media(FileId animation_file_id,
tl_object_ptr<telegram_api::InputEncryptedFile> input_file,

View File

@ -123,9 +123,11 @@ class MessageAnimation final : public MessageContent {
FileId file_id;
FormattedText caption;
bool has_spoiler = false;
MessageAnimation() = default;
MessageAnimation(FileId file_id, FormattedText &&caption) : file_id(file_id), caption(std::move(caption)) {
MessageAnimation(FileId file_id, FormattedText &&caption, bool has_spoiler)
: file_id(file_id), caption(std::move(caption)), has_spoiler(has_spoiler) {
}
MessageContentType get_type() const final {
@ -873,6 +875,9 @@ static void store(const MessageContent *content, StorerT &storer) {
case MessageContentType::Animation: {
const auto *m = static_cast<const MessageAnimation *>(content);
td->animations_manager_->store_animation(m->file_id, storer);
BEGIN_STORE_FLAGS();
STORE_FLAG(m->has_spoiler);
END_STORE_FLAGS();
store(m->caption, storer);
break;
}
@ -1251,6 +1256,11 @@ static void parse(unique_ptr<MessageContent> &content, ParserT &parser) {
case MessageContentType::Animation: {
auto m = make_unique<MessageAnimation>();
m->file_id = td->animations_manager_->parse_animation(parser);
if (parser.version() >= static_cast<int32>(Version::AddMessageMediaSpoiler)) {
BEGIN_PARSE_FLAGS();
PARSE_FLAG(m->has_spoiler);
END_PARSE_FLAGS();
}
parse_caption(m->caption, parser);
is_bad = !m->file_id.is_valid();
content = std::move(m);
@ -1809,7 +1819,7 @@ InlineMessageContent create_inline_message_content(Td *td, FileId file_id,
get_message_text(td->contacts_manager_.get(), inline_message->message_, std::move(inline_message->entities_),
true, false, 0, false, "create_inline_message_content");
if (allowed_media_content_id == td_api::inputMessageAnimation::ID) {
result.message_content = make_unique<MessageAnimation>(file_id, std::move(caption));
result.message_content = make_unique<MessageAnimation>(file_id, std::move(caption), false);
} else if (allowed_media_content_id == td_api::inputMessageAudio::ID) {
result.message_content = make_unique<MessageAudio>(file_id, std::move(caption));
} else if (allowed_media_content_id == td_api::inputMessageDocument::ID) {
@ -1913,7 +1923,7 @@ static Result<InputMessageContent> create_input_message_content(
std::move(file_name), std::move(mime_type), input_animation->duration_,
get_dimensions(input_animation->width_, input_animation->height_, nullptr), false);
content = make_unique<MessageAnimation>(file_id, std::move(caption));
content = make_unique<MessageAnimation>(file_id, std::move(caption), input_animation->has_spoiler_ && !is_secret);
break;
}
case td_api::inputMessageAudio::ID: {
@ -2480,7 +2490,8 @@ static tl_object_ptr<telegram_api::InputMedia> get_input_media_impl(
switch (content->get_type()) {
case MessageContentType::Animation: {
const auto *m = static_cast<const MessageAnimation *>(content);
return td->animations_manager_->get_input_media(m->file_id, std::move(input_file), std::move(input_thumbnail));
return td->animations_manager_->get_input_media(m->file_id, std::move(input_file), std::move(input_thumbnail),
m->has_spoiler);
}
case MessageContentType::Audio: {
const auto *m = static_cast<const MessageAudio *>(content);
@ -3337,7 +3348,7 @@ void merge_message_contents(Td *td, const MessageContent *old_content, MessageCo
}
need_update = true;
}
if (old_->caption != new_->caption) {
if (old_->caption != new_->caption || old_->has_spoiler != new_->has_spoiler) {
need_update = true;
}
break;
@ -3434,11 +3445,10 @@ void merge_message_contents(Td *td, const MessageContent *old_content, MessageCo
LOG(DEBUG) << "Photo date has changed from " << old_photo->date << " to " << new_photo->date;
is_content_changed = true;
}
if (old_photo->id.get() != new_photo->id.get() || old_->caption != new_->caption ||
old_->has_spoiler != new_->has_spoiler) {
if (old_->caption != new_->caption || old_->has_spoiler != new_->has_spoiler) {
need_update = true;
}
if (old_photo->minithumbnail != new_photo->minithumbnail) {
if (old_photo->id.get() != new_photo->id.get() || old_photo->minithumbnail != new_photo->minithumbnail) {
need_update = true;
}
if (old_photo->photos != new_photo->photos) {
@ -4316,7 +4326,7 @@ static unique_ptr<MessageContent> get_document_message_content(Document &&parsed
}
switch (parsed_document.type) {
case Document::Type::Animation:
return make_unique<MessageAnimation>(file_id, std::move(caption));
return make_unique<MessageAnimation>(file_id, std::move(caption), has_spoiler);
case Document::Type::Audio:
return make_unique<MessageAudio>(file_id, std::move(caption));
case Document::Type::General:
@ -5321,7 +5331,8 @@ tl_object_ptr<td_api::MessageContent> get_message_content_object(const MessageCo
const auto *m = static_cast<const MessageAnimation *>(content);
return make_tl_object<td_api::messageAnimation>(
td->animations_manager_->get_animation_object(m->file_id),
get_formatted_text_object(m->caption, skip_bot_commands, max_media_timestamp), is_content_secret);
get_formatted_text_object(m->caption, skip_bot_commands, max_media_timestamp), m->has_spoiler,
is_content_secret);
}
case MessageContentType::Audio: {
const auto *m = static_cast<const MessageAudio *>(content);

View File

@ -3829,7 +3829,7 @@ class CliClient final : public Actor {
send_request(td_api::make_object<td_api::editMessageMedia>(
chat_id, message_id, nullptr,
td_api::make_object<td_api::inputMessageAnimation>(as_input_file(animation), nullptr, vector<int32>(), 0, 0,
0, as_caption("animation"))));
0, as_caption("animation"), has_spoiler_)));
} else if (op == "emc") {
ChatId chat_id;
MessageId message_id;
@ -4002,7 +4002,7 @@ class CliClient final : public Actor {
get_args(args, chat_id, animation_path, width, height, caption);
send_message(chat_id, td_api::make_object<td_api::inputMessageAnimation>(as_input_file(animation_path), nullptr,
vector<int32>(), 60, width, height,
as_caption(caption)));
as_caption(caption), has_spoiler_));
} else if (op == "sang") {
ChatId chat_id;
string animation_path;
@ -4010,25 +4010,27 @@ class CliClient final : public Actor {
get_args(args, chat_id, animation_path, animation_conversion);
send_message(chat_id, td_api::make_object<td_api::inputMessageAnimation>(
as_generated_file(animation_path, animation_conversion), nullptr, vector<int32>(), 60,
0, 0, as_caption("")));
0, 0, as_caption(""), has_spoiler_));
} else if (op == "sanid") {
ChatId chat_id;
string file_id;
get_args(args, chat_id, file_id);
send_message(chat_id, td_api::make_object<td_api::inputMessageAnimation>(
as_input_file_id(file_id), nullptr, vector<int32>(), 0, 0, 0, as_caption("")));
send_message(chat_id,
td_api::make_object<td_api::inputMessageAnimation>(
as_input_file_id(file_id), nullptr, vector<int32>(), 0, 0, 0, as_caption(""), has_spoiler_));
} else if (op == "sanurl") {
ChatId chat_id;
string url;
get_args(args, chat_id, url);
send_message(chat_id, td_api::make_object<td_api::inputMessageAnimation>(
as_generated_file(url, "#url#"), nullptr, vector<int32>(), 0, 0, 0, as_caption("")));
send_message(chat_id, td_api::make_object<td_api::inputMessageAnimation>(as_generated_file(url, "#url#"), nullptr,
vector<int32>(), 0, 0, 0, as_caption(""),
has_spoiler_));
} else if (op == "sanurl2") {
ChatId chat_id;
string url;
get_args(args, chat_id, url);
send_message(chat_id, td_api::make_object<td_api::inputMessageAnimation>(
as_remote_file(url), nullptr, vector<int32>(), 0, 0, 0, as_caption("")));
as_remote_file(url), nullptr, vector<int32>(), 0, 0, 0, as_caption(""), has_spoiler_));
} else if (op == "sau") {
ChatId chat_id;
string audio_path;