From 85c4cd464276a5651e1c1394c0da919ab2d85341 Mon Sep 17 00:00:00 2001 From: levlam Date: Sat, 13 Jan 2024 12:06:31 +0300 Subject: [PATCH] Add SavedMessagesTopicId class. --- CMakeLists.txt | 2 + td/telegram/MessagesManager.cpp | 82 +++++++++------------------- td/telegram/MessagesManager.h | 10 +--- td/telegram/SavedMessagesTopicId.cpp | 70 ++++++++++++++++++++++++ td/telegram/SavedMessagesTopicId.h | 72 ++++++++++++++++++++++++ 5 files changed, 172 insertions(+), 64 deletions(-) create mode 100644 td/telegram/SavedMessagesTopicId.cpp create mode 100644 td/telegram/SavedMessagesTopicId.h diff --git a/CMakeLists.txt b/CMakeLists.txt index cc5bedb8d..378f11a47 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -468,6 +468,7 @@ set(TDLIB_SOURCE td/telegram/ReportReason.cpp td/telegram/RequestedDialogType.cpp td/telegram/RestrictionReason.cpp + td/telegram/SavedMessagesTopicId.cpp td/telegram/ScopeNotificationSettings.cpp td/telegram/SecretChatActor.cpp td/telegram/SecretChatDb.cpp @@ -790,6 +791,7 @@ set(TDLIB_SOURCE td/telegram/RequestActor.h td/telegram/RequestedDialogType.h td/telegram/RestrictionReason.h + td/telegram/SavedMessagesTopicId.h td/telegram/ScheduledServerMessageId.h td/telegram/ScopeNotificationSettings.h td/telegram/SecretChatActor.h diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 983eec3e0..6d8b0a64e 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -3903,7 +3903,7 @@ void MessagesManager::Message::store(StorerT &storer) const { bool has_input_reply_to = !message_id.is_any_server() && input_reply_to.is_valid(); bool has_replied_message_info = !replied_message_info.is_empty(); bool has_forward_info = forward_info != nullptr; - bool has_saved_messages_dialog_id = saved_messages_dialog_id.is_valid(); + bool has_saved_messages_topic_id = saved_messages_topic_id.is_valid(); BEGIN_STORE_FLAGS(); STORE_FLAG(is_channel_post); STORE_FLAG(is_outgoing); @@ -3985,7 +3985,7 @@ void MessagesManager::Message::store(StorerT &storer) const { STORE_FLAG(has_input_reply_to); STORE_FLAG(has_replied_message_info); STORE_FLAG(has_forward_info); - STORE_FLAG(has_saved_messages_dialog_id); + STORE_FLAG(has_saved_messages_topic_id); END_STORE_FLAGS(); } @@ -4100,8 +4100,8 @@ void MessagesManager::Message::store(StorerT &storer) const { if (has_replied_message_info) { store(replied_message_info, storer); } - if (has_saved_messages_dialog_id) { - store(saved_messages_dialog_id, storer); + if (has_saved_messages_topic_id) { + store(saved_messages_topic_id, storer); } } @@ -4156,7 +4156,7 @@ void MessagesManager::Message::parse(ParserT &parser) { bool has_input_reply_to = false; bool has_replied_message_info = false; bool has_forward_info = false; - bool has_saved_messages_dialog_id = false; + bool has_saved_messages_topic_id = false; BEGIN_PARSE_FLAGS(); PARSE_FLAG(is_channel_post); PARSE_FLAG(is_outgoing); @@ -4238,7 +4238,7 @@ void MessagesManager::Message::parse(ParserT &parser) { PARSE_FLAG(has_input_reply_to); PARSE_FLAG(has_replied_message_info); PARSE_FLAG(has_forward_info); - PARSE_FLAG(has_saved_messages_dialog_id); + PARSE_FLAG(has_saved_messages_topic_id); END_PARSE_FLAGS(); } @@ -4417,8 +4417,8 @@ void MessagesManager::Message::parse(ParserT &parser) { } else { replied_message_info = RepliedMessageInfo::legacy(legacy_reply_to_message_id, legacy_reply_in_dialog_id); } - if (has_saved_messages_dialog_id) { - parse(saved_messages_dialog_id, parser); + if (has_saved_messages_topic_id) { + parse(saved_messages_topic_id, parser); } CHECK(content != nullptr); @@ -12745,23 +12745,6 @@ void MessagesManager::finish_add_secret_message(unique_ptr pending_secret_message->success_promise.set_value(Unit()); // TODO: set after message is saved } -DialogId MessagesManager::get_saved_messages_dialog_id(DialogId my_dialog_id, const Message *m) { - if (m->forward_info != nullptr) { - auto last_dialog_id = m->forward_info->get_last_dialog_id(); - if (last_dialog_id.is_valid()) { - return last_dialog_id; - } - auto from_dialog_id = m->forward_info->get_origin().get_sender(); - if (from_dialog_id.is_valid()) { - return my_dialog_id; - } - if (m->forward_info->get_origin().is_sender_hidden()) { - return DialogId(static_cast(2666000)); - } - } - return my_dialog_id; -} - MessagesManager::MessageInfo MessagesManager::parse_telegram_api_message( tl_object_ptr message_ptr, bool is_scheduled, const char *source) const { LOG(DEBUG) << "Receive from " << source << " " << to_string(message_ptr); @@ -12838,7 +12821,7 @@ MessagesManager::MessageInfo MessagesManager::parse_telegram_api_message( message_info.restriction_reasons = get_restriction_reasons(std::move(message->restriction_reason_)); message_info.author_signature = std::move(message->post_author_); if (message->saved_peer_id_ != nullptr) { - message_info.saved_messages_dialog_id = DialogId(message->saved_peer_id_); + message_info.saved_messages_topic_id = SavedMessagesTopicId(DialogId(message->saved_peer_id_)); } break; } @@ -12869,7 +12852,7 @@ MessagesManager::MessageInfo MessagesManager::parse_telegram_api_message( message_info.reply_header.replied_message_info_ = RepliedMessageInfo(); message_info.reply_header.story_full_id_ = StoryFullId(); if (message_info.dialog_id == td_->dialog_manager_->get_my_dialog_id()) { - message_info.saved_messages_dialog_id = message_info.dialog_id; + message_info.saved_messages_topic_id = SavedMessagesTopicId(message_info.dialog_id); } break; } @@ -13123,7 +13106,7 @@ std::pair> MessagesManager::creat message->reply_to_story_full_id = reply_to_story_full_id; message->restriction_reasons = std::move(message_info.restriction_reasons); message->author_signature = std::move(message_info.author_signature); - message->saved_messages_dialog_id = message_info.saved_messages_dialog_id; + message->saved_messages_topic_id = message_info.saved_messages_topic_id; message->is_outgoing = is_outgoing; message->is_channel_post = is_channel_post; message->contains_mention = @@ -13174,15 +13157,15 @@ std::pair> MessagesManager::creat } if (dialog_id == my_dialog_id) { - if (!message->saved_messages_dialog_id.is_valid()) { + if (!message->saved_messages_topic_id.is_valid()) { LOG(ERROR) << "Receive no saved messages topic for " << message_id << " in " << dialog_id; - message->saved_messages_dialog_id = get_saved_messages_dialog_id(dialog_id, message.get()); + message->saved_messages_topic_id = SavedMessagesTopicId(my_dialog_id, message->forward_info.get()); } } else { - if (message->saved_messages_dialog_id.is_valid()) { - LOG(ERROR) << "Receive saved messages topic " << message_info.saved_messages_dialog_id << " for " << message_id + if (message->saved_messages_topic_id.is_valid()) { + LOG(ERROR) << "Receive saved messages topic " << message_info.saved_messages_topic_id << " for " << message_id << " in " << dialog_id; - message->saved_messages_dialog_id = DialogId(); + message->saved_messages_topic_id = SavedMessagesTopicId(); } } @@ -21399,8 +21382,8 @@ unique_ptr MessagesManager::parse_message(Dialog *d, M if (m->is_pinned && is_scheduled) { m->is_pinned = false; } - if (dialog_id == td_->dialog_manager_->get_my_dialog_id() && !m->saved_messages_dialog_id.is_valid()) { - m->saved_messages_dialog_id = get_saved_messages_dialog_id(dialog_id, m); + if (dialog_id == td_->dialog_manager_->get_my_dialog_id() && !m->saved_messages_topic_id.is_valid()) { + m->saved_messages_topic_id = SavedMessagesTopicId(dialog_id, m->forward_info.get()); } LOG(INFO) << "Loaded " << m->message_id << " in " << dialog_id << " of size " << value.size() << " from database"; @@ -22220,21 +22203,6 @@ tl_object_ptr MessagesManager::get_message_sched return td_api::make_object(send_date); } -td_api::object_ptr MessagesManager::get_saved_messages_topic_object( - DialogId saved_messages_dialog_id) const { - if (saved_messages_dialog_id == DialogId()) { - return nullptr; - } - if (saved_messages_dialog_id == td_->dialog_manager_->get_my_dialog_id()) { - return td_api::make_object(); - } - if (saved_messages_dialog_id == DialogId(static_cast(2666000))) { - return td_api::make_object(); - } - return td_api::make_object( - get_chat_id_object(saved_messages_dialog_id, "savedMessagesTopicSavedFromChat")); -} - td_api::object_ptr MessagesManager::get_message_message_content_object(DialogId dialog_id, const Message *m) const { auto live_location_date = m->is_failed_to_send ? 0 : m->date; @@ -22387,7 +22355,7 @@ tl_object_ptr MessagesManager::get_message_object(DialogId dial can_get_media_timestamp_links, can_report_reactions, has_timestamped_media, m->is_channel_post, m->is_topic_message, m->contains_unread_mention, date, edit_date, std::move(forward_info), std::move(import_info), std::move(interaction_info), std::move(unread_reactions), std::move(reply_to), top_thread_message_id, - get_saved_messages_topic_object(m->saved_messages_dialog_id), std::move(self_destruct_type), ttl_expires_in, + m->saved_messages_topic_id.get_saved_messages_topic_object(td_), std::move(self_destruct_type), ttl_expires_in, auto_delete_in, via_bot_user_id, m->author_signature, m->media_album_id, get_restriction_reason_description(m->restriction_reasons), std::move(content), std::move(reply_markup)); } @@ -22601,7 +22569,7 @@ unique_ptr MessagesManager::create_message_to_send( m->is_content_secret = is_secret_message_content(m->ttl, m->content->get_type()); } if (dialog_id == DialogId(my_id)) { - m->saved_messages_dialog_id = get_saved_messages_dialog_id(dialog_id, m); + m->saved_messages_topic_id = SavedMessagesTopicId(dialog_id, m->forward_info.get()); } return message; @@ -22947,7 +22915,7 @@ void MessagesManager::add_message_dependencies(Dependencies &dependencies, const auto is_bot = td_->auth_manager_->is_bot(); dependencies.add(m->sender_user_id); dependencies.add_dialog_and_dependencies(m->sender_dialog_id); - dependencies.add_dialog_and_dependencies(m->saved_messages_dialog_id); + m->saved_messages_topic_id.add_dependencies(dependencies); m->replied_message_info.add_dependencies(dependencies, is_bot); dependencies.add_dialog_and_dependencies(m->reply_to_story_full_id.get_dialog_id()); dependencies.add_dialog_and_dependencies(m->real_forward_from_dialog_id); @@ -26690,7 +26658,7 @@ Result MessagesManager::add_local_message( m->is_content_secret = is_secret_message_content(m->ttl, m->content->get_type()); m->send_emoji = std::move(message_content.emoji); if (dialog_id == DialogId(my_id)) { - m->saved_messages_dialog_id = get_saved_messages_dialog_id(dialog_id, m); + m->saved_messages_topic_id = SavedMessagesTopicId(dialog_id, m->forward_info.get()); } bool need_update = true; @@ -33143,10 +33111,10 @@ bool MessagesManager::update_message(Dialog *d, Message *old_message, unique_ptr << new_message->had_forward_info; old_message->had_forward_info = new_message->had_forward_info; } - if (old_message->saved_messages_dialog_id != new_message->saved_messages_dialog_id) { + if (old_message->saved_messages_topic_id != new_message->saved_messages_topic_id) { LOG(ERROR) << "Saved messages topic for " << message_id << " in " << dialog_id << " changed from " - << old_message->saved_messages_dialog_id << " to " << new_message->saved_messages_dialog_id; - old_message->saved_messages_dialog_id = new_message->saved_messages_dialog_id; + << old_message->saved_messages_topic_id << " to " << new_message->saved_messages_topic_id; + old_message->saved_messages_topic_id = new_message->saved_messages_topic_id; need_send_update = true; } if (old_message->notification_id != new_message->notification_id) { diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 9e01af359..c5a7dc176 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -56,6 +56,7 @@ #include "td/telegram/RepliedMessageInfo.h" #include "td/telegram/ReplyMarkup.h" #include "td/telegram/RestrictionReason.h" +#include "td/telegram/SavedMessagesTopicId.h" #include "td/telegram/ScheduledServerMessageId.h" #include "td/telegram/secret_api.h" #include "td/telegram/SecretChatId.h" @@ -948,7 +949,7 @@ class MessagesManager final : public Actor { MessageId message_id; UserId sender_user_id; DialogId sender_dialog_id; - DialogId saved_messages_dialog_id; + SavedMessagesTopicId saved_messages_topic_id; int32 date = 0; int32 ttl_period = 0; int32 ttl = 0; @@ -986,7 +987,7 @@ class MessagesManager final : public Actor { MessageId message_id; UserId sender_user_id; DialogId sender_dialog_id; - DialogId saved_messages_dialog_id; + SavedMessagesTopicId saved_messages_topic_id; int32 date = 0; int32 edit_date = 0; int32 send_date = 0; @@ -1611,8 +1612,6 @@ class MessagesManager final : public Actor { void finish_delete_secret_chat_history(DialogId dialog_id, bool remove_from_dialog_list, MessageId last_message_id, Promise promise); - static DialogId get_saved_messages_dialog_id(DialogId my_dialog_id, const Message *m); - MessageInfo parse_telegram_api_message(tl_object_ptr message_ptr, bool is_scheduled, const char *source) const; @@ -2341,9 +2340,6 @@ class MessagesManager final : public Actor { static tl_object_ptr get_message_scheduling_state_object(int32 send_date); - td_api::object_ptr get_saved_messages_topic_object( - DialogId saved_messages_dialog_id) const; - td_api::object_ptr get_message_message_content_object(DialogId dialog_id, const Message *m) const; diff --git a/td/telegram/SavedMessagesTopicId.cpp b/td/telegram/SavedMessagesTopicId.cpp new file mode 100644 index 000000000..b207fc7ee --- /dev/null +++ b/td/telegram/SavedMessagesTopicId.cpp @@ -0,0 +1,70 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2024 +// +// 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/SavedMessagesTopicId.h" + +#include "td/telegram/Dependencies.h" +#include "td/telegram/DialogManager.h" +#include "td/telegram/MessageForwardInfo.h" +#include "td/telegram/MessagesManager.h" +#include "td/telegram/Td.h" + +namespace td { + +static constexpr DialogId HIDDEN_AUTHOR_DIALOG_ID = DialogId(static_cast(2666000)); + +SavedMessagesTopicId::SavedMessagesTopicId(DialogId my_dialog_id, const MessageForwardInfo *message_forward_info) { + if (message_forward_info != nullptr) { + auto last_dialog_id = message_forward_info->get_last_dialog_id(); + if (last_dialog_id.is_valid()) { + dialog_id_ = last_dialog_id; + return; + } + auto from_dialog_id = message_forward_info->get_origin().get_sender(); + if (from_dialog_id.is_valid()) { + dialog_id_ = my_dialog_id; + return; + } + if (message_forward_info->get_origin().is_sender_hidden()) { + dialog_id_ = HIDDEN_AUTHOR_DIALOG_ID; + } + } + dialog_id_ = my_dialog_id; +} + +td_api::object_ptr SavedMessagesTopicId::get_saved_messages_topic_object(Td *td) const { + if (dialog_id_ == DialogId()) { + return nullptr; + } + if (dialog_id_ == td->dialog_manager_->get_my_dialog_id()) { + return td_api::make_object(); + } + if (dialog_id_ == HIDDEN_AUTHOR_DIALOG_ID) { + return td_api::make_object(); + } + return td_api::make_object( + td->messages_manager_->get_chat_id_object(dialog_id_, "savedMessagesTopicSavedFromChat")); +} + +void SavedMessagesTopicId::add_dependencies(Dependencies &dependencies) const { + if (dialog_id_ == HIDDEN_AUTHOR_DIALOG_ID) { + dependencies.add_dialog_dependencies(dialog_id_); + } else { + dependencies.add_dialog_and_dependencies(dialog_id_); + } +} + +StringBuilder &operator<<(StringBuilder &string_builder, SavedMessagesTopicId saved_messages_topic_id) { + if (!saved_messages_topic_id.dialog_id_.is_valid()) { + return string_builder << "[no Saved Messages topic]"; + } + if (saved_messages_topic_id.dialog_id_ == HIDDEN_AUTHOR_DIALOG_ID) { + return string_builder << "[Author Hidden topic]"; + } + return string_builder << "[topic of" << saved_messages_topic_id.dialog_id_ << ']'; +} + +} // namespace td diff --git a/td/telegram/SavedMessagesTopicId.h b/td/telegram/SavedMessagesTopicId.h new file mode 100644 index 000000000..a572fee66 --- /dev/null +++ b/td/telegram/SavedMessagesTopicId.h @@ -0,0 +1,72 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2024 +// +// 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) +// +#pragma once + +#include "td/telegram/DialogId.h" +#include "td/telegram/td_api.h" + +#include "td/utils/common.h" +#include "td/utils/HashTableUtils.h" +#include "td/utils/StringBuilder.h" + +namespace td { + +class Dependencies; +class MessageForwardInfo; +class Td; + +class SavedMessagesTopicId { + DialogId dialog_id_; + + friend struct SavedMessagesTopicIdHash; + + friend StringBuilder &operator<<(StringBuilder &string_builder, SavedMessagesTopicId saved_messages_topic_id); + + public: + SavedMessagesTopicId() = default; + + explicit SavedMessagesTopicId(DialogId dialog_id) : dialog_id_(dialog_id) { + } + + SavedMessagesTopicId(DialogId my_dialog_id, const MessageForwardInfo *message_forward_info); + + bool is_valid() const { + return dialog_id_.is_valid(); + } + + td_api::object_ptr get_saved_messages_topic_object(Td *td) const; + + void add_dependencies(Dependencies &dependencies) const; + + bool operator==(const SavedMessagesTopicId &other) const { + return dialog_id_ == other.dialog_id_; + } + + bool operator!=(const SavedMessagesTopicId &other) const { + return dialog_id_ != other.dialog_id_; + } + + template + void store(StorerT &storer) const { + dialog_id_.store(storer); + } + + template + void parse(ParserT &parser) { + dialog_id_.parse(parser); + } +}; + +struct SavedMessagesTopicIdHash { + uint32 operator()(SavedMessagesTopicId saved_messages_topic_id) const { + return Hash()(saved_messages_topic_id.dialog_id_); + } +}; + +StringBuilder &operator<<(StringBuilder &string_builder, SavedMessagesTopicId saved_messages_topic_id); + +} // namespace td