diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index b3b8fecca..7d654838f 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -3903,6 +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(); BEGIN_STORE_FLAGS(); STORE_FLAG(is_channel_post); STORE_FLAG(is_outgoing); @@ -3984,6 +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); END_STORE_FLAGS(); } @@ -4098,6 +4100,9 @@ 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); + } } // do not forget to resolve message dependencies @@ -4151,6 +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; BEGIN_PARSE_FLAGS(); PARSE_FLAG(is_channel_post); PARSE_FLAG(is_outgoing); @@ -4232,6 +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); END_PARSE_FLAGS(); } @@ -4410,6 +4417,9 @@ 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); + } CHECK(content != nullptr); is_content_secret |= @@ -12735,6 +12745,23 @@ 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); @@ -12810,6 +12837,9 @@ MessagesManager::MessageInfo MessagesManager::parse_telegram_api_message( message_info.reply_markup = std::move(message->reply_markup_); 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_); + } break; } case telegram_api::messageService::ID: { @@ -12838,6 +12868,9 @@ MessagesManager::MessageInfo MessagesManager::parse_telegram_api_message( message_info.reply_header.replied_message_info_); 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; + } break; } default: @@ -13090,6 +13123,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->is_outgoing = is_outgoing; message->is_channel_post = is_channel_post; message->contains_mention = @@ -13139,6 +13173,19 @@ std::pair> MessagesManager::creat message->had_forward_info = true; } + if (dialog_id == my_dialog_id) { + if (!message->saved_messages_dialog_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()); + } + } else { + if (message->saved_messages_dialog_id.is_valid()) { + LOG(ERROR) << "Receive saved messages topic " << message_info.saved_messages_dialog_id << " for " << message_id + << " in " << dialog_id; + message->saved_messages_dialog_id = DialogId(); + } + } + Dependencies dependencies; add_message_dependencies(dependencies, message.get()); for (auto dependent_dialog_id : dependencies.get_dialog_ids()) { @@ -21352,6 +21399,9 @@ 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); + } LOG(INFO) << "Loaded " << m->message_id << " in " << dialog_id << " of size " << value.size() << " from database"; return message; @@ -22535,6 +22585,9 @@ 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); + } return message; } @@ -22879,6 +22932,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->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); @@ -26620,6 +26674,9 @@ 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); + } bool need_update = true; bool need_update_dialog_pos = false; @@ -33071,6 +33128,12 @@ 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) { + 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; + need_send_update = true; + } if (old_message->notification_id != new_message->notification_id) { CHECK(!is_scheduled); if (old_message->notification_id.is_valid()) { diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 9b66e9de6..184e99467 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -948,6 +948,7 @@ class MessagesManager final : public Actor { MessageId message_id; UserId sender_user_id; DialogId sender_dialog_id; + DialogId saved_messages_dialog_id; int32 date = 0; int32 ttl_period = 0; int32 ttl = 0; @@ -985,6 +986,7 @@ class MessagesManager final : public Actor { MessageId message_id; UserId sender_user_id; DialogId sender_dialog_id; + DialogId saved_messages_dialog_id; int32 date = 0; int32 edit_date = 0; int32 send_date = 0; @@ -1609,6 +1611,8 @@ 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;