// // Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2019 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "td/telegram/NotificationType.h" #include "td/telegram/ContactsManager.h" #include "td/telegram/Global.h" #include "td/telegram/MessagesManager.h" #include "td/telegram/Td.h" #include "td/utils/misc.h" #include "td/utils/Slice.h" namespace td { class NotificationTypeMessage : public NotificationType { bool can_be_delayed() const override { return message_id_.is_valid() && message_id_.is_server(); } bool is_temporary() const override { return false; } MessageId get_message_id() const override { return message_id_; } td_api::object_ptr get_notification_type_object(DialogId dialog_id) const override { auto message_object = G()->td().get_actor_unsafe()->messages_manager_->get_message_object({dialog_id, message_id_}); if (message_object == nullptr) { return nullptr; } return td_api::make_object(std::move(message_object)); } StringBuilder &to_string_builder(StringBuilder &string_builder) const override { return string_builder << "NewMessageNotification[" << message_id_ << ']'; } /* Type get_type() const override { return Type::Message; } */ MessageId message_id_; public: explicit NotificationTypeMessage(MessageId message_id) : message_id_(message_id) { } }; class NotificationTypeSecretChat : public NotificationType { bool can_be_delayed() const override { return false; } bool is_temporary() const override { return false; } MessageId get_message_id() const override { return MessageId(); } td_api::object_ptr get_notification_type_object(DialogId dialog_id) const override { return td_api::make_object(); } StringBuilder &to_string_builder(StringBuilder &string_builder) const override { return string_builder << "NewSecretChatNotification[]"; } /* Type get_type() const override { return Type::SecretChat; } */ public: NotificationTypeSecretChat() { } }; class NotificationTypeCall : public NotificationType { bool can_be_delayed() const override { return false; } bool is_temporary() const override { return false; } MessageId get_message_id() const override { return MessageId::max(); } td_api::object_ptr get_notification_type_object(DialogId dialog_id) const override { return td_api::make_object(call_id_.get()); } StringBuilder &to_string_builder(StringBuilder &string_builder) const override { return string_builder << "NewCallNotification[" << call_id_ << ']'; } /* Type get_type() const override { return Type::Call; } */ CallId call_id_; public: explicit NotificationTypeCall(CallId call_id) : call_id_(call_id) { } }; class NotificationTypePushMessage : public NotificationType { bool can_be_delayed() const override { return false; } bool is_temporary() const override { return true; } MessageId get_message_id() const override { return message_id_; } static td_api::object_ptr get_push_message_content_object(Slice key, const string &arg) { bool is_pinned = false; if (begins_with(key, "PINNED_")) { is_pinned = true; key = key.substr(7); } if (key == "MESSAGE") { return td_api::make_object(is_pinned); } if (key == "MESSAGES") { return td_api::make_object(to_integer(arg), true, true); } CHECK(key.size() > 8); switch (key[8]) { case 'A': if (key == "MESSAGE_ANIMATION") { return td_api::make_object(is_pinned); } break; case 'B': if (key == "MESSAGE_BASIC_GROUP_CHAT_CREATE") { return td_api::make_object(); } break; case 'C': if (key == "MESSAGE_CHAT_ADD_MEMBERS") { return td_api::make_object(arg, false, false); } if (key == "MESSAGE_CHAT_ADD_MEMBERS_RETURNED") { return td_api::make_object(arg, false, true); } if (key == "MESSAGE_CHAT_ADD_MEMBERS_YOU") { return td_api::make_object(arg, true, false); } if (key == "MESSAGE_CHAT_CHANGE_PHOTO") { return td_api::make_object(); } if (key == "MESSAGE_CHAT_CHANGE_TITLE") { return td_api::make_object(); } if (key == "MESSAGE_CHAT_DELETE_MEMBER") { return td_api::make_object(arg, false, false); } if (key == "MESSAGE_CHAT_DELETE_MEMBER_LEFT") { return td_api::make_object(arg, false, true); } if (key == "MESSAGE_CHAT_DELETE_MEMBER_YOU") { return td_api::make_object(arg, true, false); } if (key == "MESSAGE_CHAT_JOIN_BY_LINK") { return td_api::make_object(); } if (key == "MESSAGE_CONTACT") { return td_api::make_object(arg, is_pinned); } if (key == "MESSAGE_CONTACT_REGISTERED") { return td_api::make_object(); } break; case 'D': if (key == "MESSAGE_DOCUMENT") { return td_api::make_object(is_pinned); } break; case 'F': if (key == "MESSAGE_FORWARDS") { return td_api::make_object(to_integer(arg)); } break; case 'G': if (key == "MESSAGE_GAME") { return td_api::make_object(arg, is_pinned); } if (key == "MESSAGE_GAME_SCORE") { int32 score = 0; string title; if (!is_pinned) { string score_str; std::tie(score_str, title) = split(arg); score = to_integer(score_str); } return td_api::make_object(title, score, is_pinned); } break; case 'I': if (key == "MESSAGE_INVOICE") { return td_api::make_object(arg, is_pinned); } break; case 'L': if (key == "MESSAGE_LIVE_LOCATION") { return td_api::make_object(false, is_pinned); } if (key == "MESSAGE_LOCATION") { return td_api::make_object(true, is_pinned); } break; case 'P': if (key == "MESSAGE_PHOTO") { return td_api::make_object(false, is_pinned); } if (key == "MESSAGE_PHOTOS") { return td_api::make_object(to_integer(arg), true, false); } if (key == "MESSAGE_POLL") { return td_api::make_object(arg, is_pinned); } break; case 'S': if (key == "MESSAGE_SECRET_PHOTO") { return td_api::make_object(true, false); } if (key == "MESSAGE_SECRET_VIDEO") { return td_api::make_object(true, false); } if (key == "MESSAGE_SCREENSHOT_TAKEN") { return td_api::make_object(); } if (key == "MESSAGE_STICKER") { return td_api::make_object(arg, is_pinned); } break; case 'T': if (key == "MESSAGE_TEXT") { return td_api::make_object(arg, is_pinned); } break; case 'V': if (key == "MESSAGE_VIDEO") { return td_api::make_object(false, is_pinned); } if (key == "MESSAGE_VIDEO_NOTE") { return td_api::make_object(is_pinned); } if (key == "MESSAGE_VIDEOS") { return td_api::make_object(to_integer(arg), false, true); } if (key == "MESSAGE_VOICE_NOTE") { return td_api::make_object(is_pinned); } break; default: break; } UNREACHABLE(); } 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_)); } StringBuilder &to_string_builder(StringBuilder &string_builder) const override { return string_builder << "NewPushMessageNotification[" << sender_user_id_ << ", " << message_id_ << ", " << key_ << ", " << arg_ << ']'; } /* Type get_type() const override { return Type::PushMessage; } */ UserId sender_user_id_; MessageId message_id_; string key_; string arg_; public: NotificationTypePushMessage(UserId sender_user_id, MessageId message_id, string key, string arg) : sender_user_id_(std::move(sender_user_id)) , message_id_(message_id) , key_(std::move(key)) , arg_(std::move(arg)) { } }; unique_ptr create_new_message_notification(MessageId message_id) { return make_unique(message_id); } unique_ptr create_new_secret_chat_notification() { return make_unique(); } unique_ptr create_new_call_notification(CallId call_id) { return make_unique(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)); } } // namespace td