diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index ace313db0..6fdc3f8e9 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -7175,6 +7175,11 @@ getSavedMessagesTopicHistory saved_messages_topic:SavedMessagesTopic from_messag //@description Deletes all messages in a Saved Messages topic @saved_messages_topic Saved Messages topic which messages will be deleted deleteSavedMessagesTopicHistory saved_messages_topic:SavedMessagesTopic = Ok; +//@description Returns the last message sent in a Saved Messages topic no later than the specified date +//@saved_messages_topic Saved Messages topic which message will be returned +//@date Point in time (Unix timestamp) relative to which to search for messages +getSavedMessagesTopicMessageByDate saved_messages_topic:SavedMessagesTopic date:int32 = Message; + //@description Returns a list of common group chats with a given user. Chats are sorted by their type and creation date //@user_id User identifier diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 8d4eae66f..3dff83f29 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -273,13 +273,10 @@ class GetSavedHistoryQuery final : public Td::ResultHandler { return on_error(result_ptr.move_as_error()); } - auto result = result_ptr.move_as_ok(); - LOG(INFO) << "Receive Saved Messages topic history: " << to_string(result); - auto info = - get_messages_info(td_, td_->dialog_manager_->get_my_dialog_id(), std::move(result), "GetSavedHistoryQuery"); + auto my_dialog_id = td_->dialog_manager_->get_my_dialog_id(); + auto info = get_messages_info(td_, my_dialog_id, result_ptr.move_as_ok(), "GetSavedHistoryQuery"); LOG_IF(ERROR, info.is_channel_messages) << "Receive channel messages in GetSavedHistoryQuery"; - auto my_dialog_id = td_->dialog_manager_->get_my_dialog_id(); vector> messages; for (auto &message : info.messages) { auto full_message_id = @@ -301,6 +298,57 @@ class GetSavedHistoryQuery final : public Td::ResultHandler { } }; +class GetSavedMessageByDateQuery final : public Td::ResultHandler { + Promise> promise_; + int32 date_ = 0; + + public: + explicit GetSavedMessageByDateQuery(Promise> &&promise) + : promise_(std::move(promise)) { + } + + void send(SavedMessagesTopicId saved_messages_topic_id, int32 date) { + date_ = date; + auto saved_input_peer = saved_messages_topic_id.get_input_peer(td_); + CHECK(saved_input_peer != nullptr); + + send_query(G()->net_query_creator().create( + telegram_api::messages_getSavedHistory(std::move(saved_input_peer), 0, date, -3, 5, 0, 0, 0))); + } + + void on_result(BufferSlice packet) final { + auto result_ptr = fetch_result(packet); + if (result_ptr.is_error()) { + return on_error(result_ptr.move_as_error()); + } + + auto my_dialog_id = td_->dialog_manager_->get_my_dialog_id(); + auto info = get_messages_info(td_, my_dialog_id, result_ptr.move_as_ok(), "GetSavedMessageByDateQuery"); + LOG_IF(ERROR, info.is_channel_messages) << "Receive channel messages in GetSavedMessageByDateQuery"; + for (auto &message : info.messages) { + auto message_date = MessagesManager::get_message_date(message); + auto message_dialog_id = DialogId::get_message_dialog_id(message); + if (message_dialog_id != my_dialog_id) { + LOG(ERROR) << "Receive message in wrong " << message_dialog_id << " instead of " << my_dialog_id; + continue; + } + if (message_date != 0 && message_date <= date_) { + auto message_full_id = td_->messages_manager_->on_get_message(std::move(message), false, false, false, + "GetSavedMessageByDateQuery"); + if (message_full_id != MessageFullId()) { + return promise_.set_value( + td_->messages_manager_->get_message_object(message_full_id, "GetSavedMessageByDateQuery")); + } + } + } + promise_.set_value(nullptr); + } + + void on_error(Status status) final { + promise_.set_error(std::move(status)); + } +}; + class GetDialogUnreadMarksQuery final : public Td::ResultHandler { public: void send() { @@ -16179,6 +16227,21 @@ void MessagesManager::delete_saved_messages_topic_history(SavedMessagesTopicId s run_affected_history_query_until_complete(my_dialog_id, std::move(query), true, std::move(promise)); } +void MessagesManager::get_saved_messages_topic_message_by_date(SavedMessagesTopicId saved_messages_topic_id, int32 date, + Promise> &&promise) { + if (!saved_messages_topic_id.is_valid()) { + return promise.set_error(Status::Error(400, "Invalid Saved Messages topic specified")); + } + auto my_dialog_id = td_->dialog_manager_->get_my_dialog_id(); + TRY_STATUS_PROMISE(promise, saved_messages_topic_id.is_valid_in(td_, my_dialog_id)); + + if (date <= 0) { + date = 1; + } + + td_->create_handler(std::move(promise))->send(saved_messages_topic_id, date); +} + vector MessagesManager::search_public_dialogs(const string &query, Promise &&promise) { LOG(INFO) << "Search public chats with query = \"" << query << '"'; diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 6f477b577..30ae62f41 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -543,6 +543,9 @@ class MessagesManager final : public Actor { void delete_saved_messages_topic_history(SavedMessagesTopicId saved_messages_topic_id, Promise &&promise); + void get_saved_messages_topic_message_by_date(SavedMessagesTopicId saved_messages_topic_id, int32 date, + Promise> &&promise); + vector search_public_dialogs(const string &query, Promise &&promise); std::pair> search_dialogs(const string &query, int32 limit, Promise &&promise); diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index c2d1ae96f..93805c467 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -5049,6 +5049,13 @@ void Td::on_request(uint64 id, const td_api::deleteSavedMessagesTopicHistory &re std::move(promise)); } +void Td::on_request(uint64 id, const td_api::getSavedMessagesTopicMessageByDate &request) { + CHECK_IS_USER(); + CREATE_REQUEST_PROMISE(); + messages_manager_->get_saved_messages_topic_message_by_date(SavedMessagesTopicId(this, request.saved_messages_topic_), + request.date_, std::move(promise)); +} + void Td::on_request(uint64 id, td_api::searchPublicChat &request) { CLEAN_INPUT_STRING(request.username_); CREATE_REQUEST(SearchPublicChatRequest, request.username_); diff --git a/td/telegram/Td.h b/td/telegram/Td.h index aae71ca95..73a69ca06 100644 --- a/td/telegram/Td.h +++ b/td/telegram/Td.h @@ -679,6 +679,8 @@ class Td final : public Actor { void on_request(uint64 id, const td_api::deleteSavedMessagesTopicHistory &request); + void on_request(uint64 id, const td_api::getSavedMessagesTopicMessageByDate &request); + void on_request(uint64 id, td_api::searchPublicChat &request); void on_request(uint64 id, td_api::searchPublicChats &request); diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index 58b8ef79c..2536069ab 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -2766,6 +2766,9 @@ class CliClient final : public Actor { from_message_id, offset, as_limit(limit))); } else if (op == "dsmth" && args.empty()) { send_request(td_api::make_object(get_saved_messages_topic())); + } else if (op == "gsmtmbd") { + send_request(td_api::make_object(get_saved_messages_topic(), + to_integer(args))); } else if (op == "gcc" || op == "GetCommonChats") { UserId user_id; ChatId offset_chat_id;