diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 9d6b1d2b7..8aed7f66a 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -1962,8 +1962,8 @@ pushMessageContentInvoice title:string is_pinned:Bool = PushMessageContent; //@description A message with a location @is_live True, if the location is live @is_pinned True, if the message is a pinned message with the specified content pushMessageContentLocation is_live:Bool is_pinned:Bool = PushMessageContent; -//@description A photo message @is_secret True, if the photo is secret @is_pinned True, if the message is a pinned message with the specified content -pushMessageContentPhoto is_secret:Bool is_pinned:Bool = PushMessageContent; +//@description A photo message @photo Message content; may be null @caption Photo caption @is_secret True, if the photo is secret @is_pinned True, if the message is a pinned message with the specified content +pushMessageContentPhoto photo:photo caption:string is_secret:Bool is_pinned:Bool = PushMessageContent; //@description A message with a poll @question Poll question @is_pinned True, if the message is a pinned message with the specified content pushMessageContentPoll question:string is_pinned:Bool = PushMessageContent; diff --git a/td/generate/scheme/td_api.tlo b/td/generate/scheme/td_api.tlo index 4ccab223f..36a67db60 100644 Binary files a/td/generate/scheme/td_api.tlo and b/td/generate/scheme/td_api.tlo differ diff --git a/td/telegram/NotificationManager.cpp b/td/telegram/NotificationManager.cpp index aa48be2ad..6d72e0e3e 100644 --- a/td/telegram/NotificationManager.cpp +++ b/td/telegram/NotificationManager.cpp @@ -19,6 +19,8 @@ #include "td/telegram/misc.h" #include "td/telegram/net/ConnectionCreator.h" #include "td/telegram/net/DcId.h" +#include "td/telegram/Photo.h" +#include "td/telegram/Photo.hpp" #include "td/telegram/SecretChatId.h" #include "td/telegram/StateManager.h" #include "td/telegram/Td.h" @@ -3184,6 +3186,7 @@ Status NotificationManager::process_push_notification_payload(string payload, Pr } Photo attached_photo; + attached_photo.id = -2; if (has_json_object_field(custom, "attachb64")) { TRY_RESULT(attachb64, get_json_object_string_field(custom, "attachb64", false)); TRY_RESULT(attach, base64url_decode(attachb64)); @@ -3220,7 +3223,9 @@ Status NotificationManager::process_push_notification_payload(string payload, Pr VLOG(notifications) << "Have attached " << to_string(result); switch (result->get_id()) { case telegram_api::photo::ID: - if (ends_with(loc_key, "MESSAGE_PHOTO")) { + if (ends_with(loc_key, "MESSAGE_PHOTO") || ends_with(loc_key, "MESSAGE_TEXT")) { + loc_key.resize(loc_key.rfind('_') + 1); + loc_key += "PHOTO"; attached_photo = get_photo(td_->file_manager_.get(), telegram_api::move_object_as(result), dialog_id); } else { @@ -3262,11 +3267,11 @@ Status NotificationManager::process_push_notification_payload(string payload, Pr return Status::Error("Receive wrong edit date"); } edit_message_push_notification(dialog_id, MessageId(server_message_id), edit_date, std::move(loc_key), - std::move(arg), 0, std::move(promise)); + std::move(arg), std::move(attached_photo), 0, std::move(promise)); } else { add_message_push_notification(dialog_id, MessageId(server_message_id), random_id, sender_user_id, std::move(sender_name), sent_date, contains_mention, is_silent, std::move(loc_key), - std::move(arg), NotificationId(), 0, std::move(promise)); + std::move(arg), std::move(attached_photo), NotificationId(), 0, std::move(promise)); } return Status::OK(); } @@ -3283,6 +3288,7 @@ class NotificationManager::AddMessagePushNotificationLogEvent { bool is_silent_; string loc_key_; string arg_; + Photo photo_; NotificationId notification_id_; template @@ -3292,6 +3298,7 @@ class NotificationManager::AddMessagePushNotificationLogEvent { bool has_sender = sender_user_id_.is_valid(); bool has_sender_name = !sender_name_.empty(); bool has_arg = !arg_.empty(); + bool has_photo = photo_.id != -2; BEGIN_STORE_FLAGS(); STORE_FLAG(contains_mention_); STORE_FLAG(is_silent_); @@ -3300,6 +3307,7 @@ class NotificationManager::AddMessagePushNotificationLogEvent { STORE_FLAG(has_sender); STORE_FLAG(has_sender_name); STORE_FLAG(has_arg); + STORE_FLAG(has_photo); END_STORE_FLAGS(); td::store(dialog_id_, storer); if (has_message_id) { @@ -3319,6 +3327,9 @@ class NotificationManager::AddMessagePushNotificationLogEvent { if (has_arg) { td::store(arg_, storer); } + if (has_photo) { + td::store(photo_, storer); + } td::store(notification_id_, storer); } @@ -3329,6 +3340,7 @@ class NotificationManager::AddMessagePushNotificationLogEvent { bool has_sender; bool has_sender_name; bool has_arg; + bool has_photo; BEGIN_PARSE_FLAGS(); PARSE_FLAG(contains_mention_); PARSE_FLAG(is_silent_); @@ -3337,6 +3349,7 @@ class NotificationManager::AddMessagePushNotificationLogEvent { PARSE_FLAG(has_sender); PARSE_FLAG(has_sender_name); PARSE_FLAG(has_arg); + PARSE_FLAG(has_photo); END_PARSE_FLAGS(); td::parse(dialog_id_, parser); if (has_message_id) { @@ -3358,6 +3371,11 @@ class NotificationManager::AddMessagePushNotificationLogEvent { if (has_arg) { td::parse(arg_, parser); } + if (has_photo) { + td::parse(photo_, parser); + } else { + photo_.id = -2; + } td::parse(notification_id_, parser); } }; @@ -3365,8 +3383,8 @@ class NotificationManager::AddMessagePushNotificationLogEvent { void NotificationManager::add_message_push_notification(DialogId dialog_id, MessageId message_id, int64 random_id, UserId sender_user_id, string sender_name, int32 date, bool contains_mention, bool is_silent, string loc_key, - string arg, NotificationId notification_id, uint64 logevent_id, - Promise promise) { + string arg, Photo photo, NotificationId notification_id, + uint64 logevent_id, Promise promise) { auto is_pinned = begins_with(loc_key, "PINNED_"); auto r_info = td_->messages_manager_->get_message_push_notification_info( dialog_id, message_id, random_id, sender_user_id, date, contains_mention, is_pinned, logevent_id != 0); @@ -3423,9 +3441,9 @@ void NotificationManager::add_message_push_notification(DialogId dialog_id, Mess } if (logevent_id == 0 && G()->parameters().use_message_db) { - AddMessagePushNotificationLogEvent logevent{dialog_id, message_id, random_id, sender_user_id, - sender_name, date, contains_mention, is_silent, - loc_key, arg, notification_id}; + AddMessagePushNotificationLogEvent logevent{dialog_id, message_id, random_id, sender_user_id, sender_name, + date, contains_mention, is_silent, loc_key, arg, + photo, notification_id}; auto storer = LogEventStorerImpl(logevent); logevent_id = binlog_add(G()->td_db()->get_binlog(), LogEvent::HandlerType::AddMessagePushNotification, storer); } @@ -3445,11 +3463,12 @@ void NotificationManager::add_message_push_notification(DialogId dialog_id, Mess auto settings_dialog_id = info.settings_dialog_id; VLOG(notifications) << "Add message push " << notification_id << " of type " << loc_key << " for " << message_id << "/" << random_id << " in " << dialog_id << ", sent by " << sender_user_id << " at " << date - << " with arg " << arg << " to " << group_id << " of type " << group_type + << " with arg " << arg << ", photo " << photo << " to " << group_id << " of type " << group_type << " with settings from " << settings_dialog_id; add_notification(group_id, group_type, dialog_id, date, settings_dialog_id, is_silent, 0, notification_id, - create_new_push_message_notification(sender_user_id, message_id, std::move(loc_key), std::move(arg)), + create_new_push_message_notification(sender_user_id, message_id, std::move(loc_key), std::move(arg), + std::move(photo)), "add_push_notification"); } @@ -3460,14 +3479,17 @@ class NotificationManager::EditMessagePushNotificationLogEvent { int32 edit_date_; string loc_key_; string arg_; + Photo photo_; template void store(StorerT &storer) const { bool has_message_id = message_id_.is_valid(); bool has_arg = !arg_.empty(); + bool has_photo = photo_.id != -2; BEGIN_STORE_FLAGS(); STORE_FLAG(has_message_id); STORE_FLAG(has_arg); + STORE_FLAG(has_photo); END_STORE_FLAGS(); td::store(dialog_id_, storer); if (has_message_id) { @@ -3478,15 +3500,20 @@ class NotificationManager::EditMessagePushNotificationLogEvent { if (has_arg) { td::store(arg_, storer); } + if (has_photo) { + td::store(photo_, storer); + } } template void parse(ParserT &parser) { bool has_message_id; bool has_arg; + bool has_photo; BEGIN_PARSE_FLAGS(); PARSE_FLAG(has_message_id); PARSE_FLAG(has_arg); + PARSE_FLAG(has_photo); END_PARSE_FLAGS(); td::parse(dialog_id_, parser); if (has_message_id) { @@ -3497,11 +3524,16 @@ class NotificationManager::EditMessagePushNotificationLogEvent { if (has_arg) { td::parse(arg_, parser); } + if (has_photo) { + td::parse(photo_, parser); + } else { + photo_.id = -2; + } } }; void NotificationManager::edit_message_push_notification(DialogId dialog_id, MessageId message_id, int32 edit_date, - string loc_key, string arg, uint64 logevent_id, + string loc_key, string arg, Photo photo, uint64 logevent_id, Promise promise) { if (is_disabled() || max_notification_group_count_ == 0) { CHECK(logevent_id == 0); @@ -3522,7 +3554,7 @@ void NotificationManager::edit_message_push_notification(DialogId dialog_id, Mes CHECK(notification_id.is_valid()); if (logevent_id == 0 && G()->parameters().use_message_db) { - EditMessagePushNotificationLogEvent logevent{dialog_id, message_id, edit_date, loc_key, arg}; + EditMessagePushNotificationLogEvent logevent{dialog_id, message_id, edit_date, loc_key, arg, photo}; auto storer = LogEventStorerImpl(logevent); auto &cur_logevent_id = temporary_edit_notification_logevent_ids_[notification_id]; if (cur_logevent_id == 0) { @@ -3542,9 +3574,9 @@ void NotificationManager::edit_message_push_notification(DialogId dialog_id, Mes push_notification_promises_[notification_id].push_back(std::move(promise)); - edit_notification( - group_id, notification_id, - create_new_push_message_notification(sender_user_id, message_id, std::move(loc_key), std::move(arg))); + edit_notification(group_id, notification_id, + create_new_push_message_notification(sender_user_id, message_id, std::move(loc_key), std::move(arg), + std::move(photo))); } Result NotificationManager::get_push_receiver_id(string payload) { @@ -3870,7 +3902,8 @@ void NotificationManager::on_binlog_events(vector &&events) { add_message_push_notification( log_event.dialog_id_, log_event.message_id_, log_event.random_id_, log_event.sender_user_id_, log_event.sender_name_, log_event.date_, log_event.contains_mention_, true, log_event.loc_key_, - log_event.arg_, log_event.notification_id_, event.id_, PromiseCreator::lambda([](Result result) { + log_event.arg_, log_event.photo_, log_event.notification_id_, event.id_, + PromiseCreator::lambda([](Result result) { if (result.is_error()) { LOG(ERROR) << "Receive error " << result.error() << ", while processing message push notification"; } @@ -3884,7 +3917,7 @@ void NotificationManager::on_binlog_events(vector &&events) { edit_message_push_notification( log_event.dialog_id_, log_event.message_id_, log_event.edit_date_, log_event.loc_key_, log_event.arg_, - event.id_, PromiseCreator::lambda([](Result result) { + log_event.photo_, event.id_, PromiseCreator::lambda([](Result result) { if (result.is_error()) { LOG(ERROR) << "Receive error " << result.error() << ", while processing edit message push notification"; } diff --git a/td/telegram/NotificationManager.h b/td/telegram/NotificationManager.h index 4f16acea4..c8e1168f9 100644 --- a/td/telegram/NotificationManager.h +++ b/td/telegram/NotificationManager.h @@ -295,11 +295,11 @@ class NotificationManager : public Actor { void add_message_push_notification(DialogId dialog_id, MessageId message_id, int64 random_id, UserId sender_user_id, string sender_name, int32 date, bool contains_mention, bool is_silent, - string loc_key, string arg, NotificationId notification_id, uint64 logevent_id, - Promise promise); + string loc_key, string arg, Photo photo, NotificationId notification_id, + uint64 logevent_id, Promise promise); void edit_message_push_notification(DialogId dialog_id, MessageId message_id, int32 edit_date, string loc_key, - string arg, uint64 logevent_id, Promise promise); + string arg, Photo photo, uint64 logevent_id, Promise promise); void after_get_difference_impl(); diff --git a/td/telegram/NotificationType.cpp b/td/telegram/NotificationType.cpp index eafc75e17..2d3e5d7d3 100644 --- a/td/telegram/NotificationType.cpp +++ b/td/telegram/NotificationType.cpp @@ -127,7 +127,8 @@ class NotificationTypePushMessage : public NotificationType { return message_id_; } - static td_api::object_ptr get_push_message_content_object(Slice key, const string &arg) { + static td_api::object_ptr get_push_message_content_object(Slice key, const string &arg, + const Photo &photo) { bool is_pinned = false; if (begins_with(key, "PINNED_")) { is_pinned = true; @@ -226,7 +227,9 @@ class NotificationTypePushMessage : public NotificationType { break; case 'P': if (key == "MESSAGE_PHOTO") { - return td_api::make_object(false, is_pinned); + auto file_manager = G()->td().get_actor_unsafe()->file_manager_.get(); + return td_api::make_object(get_photo_object(file_manager, &photo), arg, + false, is_pinned); } if (key == "MESSAGE_PHOTOS") { return td_api::make_object(to_integer(arg), true, false); @@ -237,7 +240,7 @@ class NotificationTypePushMessage : public NotificationType { break; case 'S': if (key == "MESSAGE_SECRET_PHOTO") { - return td_api::make_object(true, false); + return td_api::make_object(nullptr, arg, true, false); } if (key == "MESSAGE_SECRET_VIDEO") { return td_api::make_object(true, false); @@ -277,13 +280,13 @@ class NotificationTypePushMessage : public NotificationType { td_api::object_ptr get_notification_type_object(DialogId dialog_id) const override { auto sender_user_id = G()->td().get_actor_unsafe()->contacts_manager_->get_user_id_object( sender_user_id_, "get_notification_type_object"); - return td_api::make_object(message_id_.get(), sender_user_id, - get_push_message_content_object(key_, arg_)); + return td_api::make_object( + message_id_.get(), sender_user_id, get_push_message_content_object(key_, arg_, photo_)); } StringBuilder &to_string_builder(StringBuilder &string_builder) const override { return string_builder << "NewPushMessageNotification[" << sender_user_id_ << ", " << message_id_ << ", " << key_ - << ", " << arg_ << ']'; + << ", " << arg_ << ", " << photo_ << ']'; } /* Type get_type() const override { @@ -294,13 +297,15 @@ class NotificationTypePushMessage : public NotificationType { MessageId message_id_; string key_; string arg_; + Photo photo_; public: - NotificationTypePushMessage(UserId sender_user_id, MessageId message_id, string key, string arg) + NotificationTypePushMessage(UserId sender_user_id, MessageId message_id, string key, string arg, Photo photo) : sender_user_id_(std::move(sender_user_id)) , message_id_(message_id) , key_(std::move(key)) - , arg_(std::move(arg)) { + , arg_(std::move(arg)) + , photo_(std::move(photo)) { } }; @@ -317,8 +322,9 @@ unique_ptr create_new_call_notification(CallId call_id) { } unique_ptr create_new_push_message_notification(UserId sender_user_id, MessageId message_id, - string key, string arg) { - return td::make_unique(sender_user_id, message_id, std::move(key), std::move(arg)); + string key, string arg, Photo photo) { + return td::make_unique(sender_user_id, message_id, std::move(key), std::move(arg), + std::move(photo)); } } // namespace td diff --git a/td/telegram/NotificationType.h b/td/telegram/NotificationType.h index cbf94d84d..792bd6206 100644 --- a/td/telegram/NotificationType.h +++ b/td/telegram/NotificationType.h @@ -9,6 +9,7 @@ #include "td/telegram/CallId.h" #include "td/telegram/DialogId.h" #include "td/telegram/MessageId.h" +#include "td/telegram/Photo.h" #include "td/telegram/td_api.h" #include "td/telegram/UserId.h" @@ -62,6 +63,6 @@ unique_ptr create_new_secret_chat_notification(); unique_ptr create_new_call_notification(CallId call_id); unique_ptr create_new_push_message_notification(UserId sender_user_id, MessageId message_id, - string key, string arg); + string key, string arg, Photo photo); } // namespace td