diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index d7ab52ce7..4a4057b4c 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -3657,13 +3657,13 @@ deleteChatHistory chat_id:int53 remove_from_chat_list:Bool revoke:Bool = Ok; //-(searchSecretMessages should be used instead), or without an enabled message database. For optimal performance the number of returned messages is chosen by the library //@chat_id Identifier of the chat in which to search messages //@query Query to search for -//@sender_user_id If not 0, only messages sent by the specified user will be returned. Not supported in secret chats +//@sender If not null, only messages sent by the specified sender will be returned. Not supported in secret chats //@from_message_id Identifier of the message starting from which history must be fetched; use 0 to get results from the last message //@offset Specify 0 to get results from exactly the from_message_id or a negative offset to get the specified message and some newer messages //@limit The maximum number of messages to be returned; must be positive and can't be greater than 100. If the offset is negative, the limit must be greater than -offset. Fewer messages may be returned than specified by the limit, even if the end of the message history has not been reached //@filter Filter for message content in the search results //@message_thread_id If not 0, only messages in the specified thread will be returned; supergroups only -searchChatMessages chat_id:int53 query:string sender_user_id:int32 from_message_id:int53 offset:int32 limit:int32 filter:SearchMessagesFilter message_thread_id:int53 = Messages; +searchChatMessages chat_id:int53 query:string sender:MessageSender from_message_id:int53 offset:int32 limit:int32 filter:SearchMessagesFilter message_thread_id:int53 = Messages; //@description Searches for messages in all chats except secret chats. Returns the results in reverse chronological order (i.e., in order of decreasing (date, chat_id, message_id)). //-For optimal performance the number of returned messages is chosen by the library diff --git a/td/generate/scheme/td_api.tlo b/td/generate/scheme/td_api.tlo index 558878a97..05b1bb5f5 100644 Binary files a/td/generate/scheme/td_api.tlo and b/td/generate/scheme/td_api.tlo differ diff --git a/td/generate/scheme/telegram_api.tl b/td/generate/scheme/telegram_api.tl index 8d018c339..b5c3785c2 100644 --- a/td/generate/scheme/telegram_api.tl +++ b/td/generate/scheme/telegram_api.tl @@ -1286,7 +1286,7 @@ contacts.blockFromReplies#29a8962c flags:# delete_message:flags.0?true delete_hi messages.getMessages#63c66506 id:Vector = messages.Messages; messages.getDialogs#a0ee3b73 flags:# exclude_pinned:flags.0?true folder_id:flags.1?int offset_date:int offset_id:int offset_peer:InputPeer limit:int hash:int = messages.Dialogs; messages.getHistory#dcbb8260 peer:InputPeer offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages; -messages.search#4e17810b flags:# peer:InputPeer q:string from_id:flags.0?InputUser top_msg_id:flags.1?int filter:MessagesFilter min_date:int max_date:int offset_id:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages; +messages.search#c352eec flags:# peer:InputPeer q:string from_id:flags.0?InputPeer top_msg_id:flags.1?int filter:MessagesFilter min_date:int max_date:int offset_id:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages; messages.readHistory#e306d3a peer:InputPeer max_id:int = messages.AffectedMessages; messages.deleteHistory#1c015b09 flags:# just_clear:flags.0?true revoke:flags.1?true peer:InputPeer max_id:int = messages.AffectedHistory; messages.deleteMessages#e58e95d2 flags:# revoke:flags.0?true id:Vector = messages.AffectedMessages; diff --git a/td/generate/scheme/telegram_api.tlo b/td/generate/scheme/telegram_api.tlo index 8a6e15667..99949232d 100644 Binary files a/td/generate/scheme/telegram_api.tlo and b/td/generate/scheme/telegram_api.tlo differ diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 22769e078..8a254e148 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -1821,7 +1821,7 @@ class SearchMessagesQuery : public Td::ResultHandler { Promise promise_; DialogId dialog_id_; string query_; - UserId sender_user_id_; + DialogId sender_dialog_id_; MessageId from_message_id_; int32 offset_; int32 limit_; @@ -1834,9 +1834,8 @@ class SearchMessagesQuery : public Td::ResultHandler { explicit SearchMessagesQuery(Promise &&promise) : promise_(std::move(promise)) { } - void send(DialogId dialog_id, const string &query, UserId sender_user_id, - telegram_api::object_ptr &&sender_input_user, MessageId from_message_id, - int32 offset, int32 limit, MessageSearchFilter filter, MessageId top_thread_message_id, int64 random_id) { + void send(DialogId dialog_id, const string &query, DialogId sender_dialog_id, MessageId from_message_id, int32 offset, + int32 limit, MessageSearchFilter filter, MessageId top_thread_message_id, int64 random_id) { auto input_peer = dialog_id.is_valid() ? td->messages_manager_->get_input_peer(dialog_id, AccessRights::Read) : make_tl_object(); if (input_peer == nullptr) { @@ -1846,7 +1845,7 @@ class SearchMessagesQuery : public Td::ResultHandler { dialog_id_ = dialog_id; query_ = query; - sender_user_id_ = sender_user_id; + sender_dialog_id_ = sender_dialog_id; from_message_id_ = from_message_id; offset_ = offset; limit_ = limit; @@ -1858,7 +1857,8 @@ class SearchMessagesQuery : public Td::ResultHandler { send_query(G()->net_query_creator().create( telegram_api::messages_getUnreadMentions(std::move(input_peer), from_message_id.get_server_message_id().get(), offset, limit, std::numeric_limits::max(), 0))); - } else if (top_thread_message_id.is_valid() && !sender_user_id.is_valid() && filter == MessageSearchFilter::Empty) { + } else if (top_thread_message_id.is_valid() && !sender_dialog_id.is_valid() && + filter == MessageSearchFilter::Empty) { handle_errors_ = dialog_id.get_type() != DialogType::Channel || td->contacts_manager_->get_channel_type(dialog_id.get_channel_id()) != ChannelType::Broadcast; send_query(G()->net_query_creator().create(telegram_api::messages_getReplies( @@ -1866,15 +1866,18 @@ class SearchMessagesQuery : public Td::ResultHandler { from_message_id.get_server_message_id().get(), 0, offset, limit, std::numeric_limits::max(), 0, 0))); } else { int32 flags = 0; - if (sender_input_user != nullptr) { + tl_object_ptr sender_input_peer; + if (sender_dialog_id.is_valid()) { flags |= telegram_api::messages_search::FROM_ID_MASK; + sender_input_peer = td->messages_manager_->get_input_peer(sender_dialog_id, AccessRights::Read); + CHECK(sender_input_peer != nullptr); } if (top_thread_message_id.is_valid()) { flags |= telegram_api::messages_search::TOP_MSG_ID_MASK; } send_query(G()->net_query_creator().create(telegram_api::messages_search( - flags, std::move(input_peer), query, std::move(sender_input_user), + flags, std::move(input_peer), query, std::move(sender_input_peer), top_thread_message_id.get_server_message_id().get(), get_input_messages_filter(filter), 0, std::numeric_limits::max(), from_message_id.get_server_message_id().get(), offset, limit, std::numeric_limits::max(), 0, 0))); @@ -1894,7 +1897,7 @@ class SearchMessagesQuery : public Td::ResultHandler { } auto info = td->messages_manager_->on_get_messages(result_ptr.move_as_ok(), "SearchMessagesQuery"); - td->messages_manager_->on_get_dialog_messages_search_result(dialog_id_, query_, sender_user_id_, from_message_id_, + td->messages_manager_->on_get_dialog_messages_search_result(dialog_id_, query_, sender_dialog_id_, from_message_id_, offset_, limit_, filter_, top_thread_message_id_, random_id_, info.total_count, std::move(info.messages)); @@ -9061,7 +9064,7 @@ void MessagesManager::on_failed_public_dialogs_search(const string &query, Statu } void MessagesManager::on_get_dialog_messages_search_result(DialogId dialog_id, const string &query, - UserId sender_user_id, MessageId from_message_id, + DialogId sender_dialog_id, MessageId from_message_id, int32 offset, int32 limit, MessageSearchFilter filter, MessageId top_thread_message_id, int64 random_id, int32 total_count, @@ -9069,7 +9072,7 @@ void MessagesManager::on_get_dialog_messages_search_result(DialogId dialog_id, c LOG(INFO) << "Receive " << messages.size() << " found messages in " << dialog_id; if (!dialog_id.is_valid()) { CHECK(query.empty()); - CHECK(!sender_user_id.is_valid()); + CHECK(!sender_dialog_id.is_valid()); CHECK(!top_thread_message_id.is_valid()); auto it = found_call_messages_.find(random_id); CHECK(it != found_call_messages_.end()); @@ -9190,7 +9193,7 @@ void MessagesManager::on_get_dialog_messages_search_result(DialogId dialog_id, c << " messages"; total_count = static_cast(result.size()); } - if (query.empty() && !sender_user_id.is_valid() && filter != MessageSearchFilter::Empty && + if (query.empty() && !sender_dialog_id.is_valid() && filter != MessageSearchFilter::Empty && !top_thread_message_id.is_valid() && G()->parameters().use_message_db) { bool update_dialog = false; @@ -16854,7 +16857,7 @@ Result> MessagesManager::create_dialog_filter(DialogFil } dialog_filter->emoji = DialogFilter::get_emoji_by_icon_name(filter->icon_name_); if (dialog_filter->emoji.empty() && !filter->icon_name_.empty()) { - return Status::Error(400, "Wrong icon name specified"); + return Status::Error(400, "Invalid icon name specified"); } dialog_filter->exclude_muted = filter->exclude_muted_; dialog_filter->exclude_read = filter->exclude_read_; @@ -19858,15 +19861,15 @@ std::pair> MessagesManager::get_message_thread_histo found_dialog_messages_[random_id]; // reserve place for result td_->create_handler(std::move(promise)) - ->send(dialog_id, string(), UserId(), nullptr, from_message_id.get_next_server_message_id(), offset, limit, + ->send(dialog_id, string(), DialogId(), from_message_id.get_next_server_message_id(), offset, limit, MessageSearchFilter::Empty, message_id, random_id); return {}; } std::pair> MessagesManager::search_dialog_messages( - DialogId dialog_id, const string &query, UserId sender_user_id, MessageId from_message_id, int32 offset, - int32 limit, MessageSearchFilter filter, MessageId top_thread_message_id, int64 &random_id, bool use_db, - Promise &&promise) { + DialogId dialog_id, const string &query, const td_api::object_ptr &sender, + MessageId from_message_id, int32 offset, int32 limit, MessageSearchFilter filter, MessageId top_thread_message_id, + int64 &random_id, bool use_db, Promise &&promise) { if (random_id != 0) { // request has already been sent before auto it = found_dialog_messages_.find(random_id); @@ -19879,9 +19882,9 @@ std::pair> MessagesManager::search_dialog_messages( } random_id = 0; } - LOG(INFO) << "Search messages with query \"" << query << "\" in " << dialog_id << " sent by " << sender_user_id - << " in thread of " << top_thread_message_id << " filtered by " << filter << " from " << from_message_id - << " with offset " << offset << " and limit " << limit; + LOG(INFO) << "Search messages with query \"" << query << "\" in " << dialog_id << " sent by " + << oneline(to_string(sender)) << " in thread of " << top_thread_message_id << " filtered by " << filter + << " from " << from_message_id << " with offset " << offset << " and limit " << limit; std::pair> result; if (limit <= 0) { @@ -19916,18 +19919,49 @@ std::pair> MessagesManager::search_dialog_messages( return result; } - if (filter == MessageSearchFilter::FailedToSend && sender_user_id.is_valid()) { - if (sender_user_id != td_->contacts_manager_->get_my_id()) { + DialogId sender_dialog_id; + if (sender != nullptr) { + switch (sender->get_id()) { + case td_api::messageSenderUser::ID: + sender_dialog_id = DialogId(UserId(static_cast(sender.get())->user_id_)); + break; + case td_api::messageSenderChat::ID: + sender_dialog_id = DialogId(static_cast(sender.get())->chat_id_); + switch (sender_dialog_id.get_type()) { + case DialogType::User: + case DialogType::Chat: + case DialogType::Channel: + // ok + break; + case DialogType::SecretChat: + promise.set_value(Unit()); + return result; + case DialogType::None: + promise.set_error(Status::Error(6, "Invalid sender chat identifier specified")); + return result; + default: + UNREACHABLE(); + return result; + } + break; + default: + UNREACHABLE(); + } + if (!have_input_peer(sender_dialog_id, AccessRights::Read)) { + promise.set_error(Status::Error(6, "Invalid message sender specified")); + return result; + } + } + if (sender_dialog_id == dialog_id && is_broadcast_channel(dialog_id)) { + sender_dialog_id = DialogId(); + } + + if (filter == MessageSearchFilter::FailedToSend && sender_dialog_id.is_valid()) { + if (sender_dialog_id != get_my_dialog_id()) { promise.set_value(Unit()); return result; } - sender_user_id = UserId(); - } - - auto input_user = td_->contacts_manager_->get_input_user(sender_user_id); - if (sender_user_id.is_valid() && input_user == nullptr) { - promise.set_error(Status::Error(6, "Wrong sender user identifier specified")); - return result; + sender_dialog_id = DialogId(); } if (top_thread_message_id != MessageId()) { @@ -19951,8 +19985,8 @@ std::pair> MessagesManager::search_dialog_messages( promise.set_error(Status::Error(6, "Non-empty query is unsupported with the specified filter")); return result; } - if (input_user != nullptr) { - promise.set_error(Status::Error(6, "Filtering by sender user is unsupported with the specified filter")); + if (sender_dialog_id.is_valid()) { + promise.set_error(Status::Error(6, "Filtering by sender is unsupported with the specified filter")); return result; } if (top_thread_message_id != MessageId()) { @@ -19963,7 +19997,8 @@ std::pair> MessagesManager::search_dialog_messages( // Trying to use database if (use_db && query.empty() && G()->parameters().use_message_db && filter != MessageSearchFilter::Empty && - input_user == nullptr && top_thread_message_id == MessageId()) { // TODO support filter by users in the database + !sender_dialog_id.is_valid() && + top_thread_message_id == MessageId()) { // TODO support filter by users in the database MessageId first_db_message_id = get_first_database_message_id_by_index(d, filter); int32 message_count = d->message_count_by_index[message_search_filter_index(filter)]; auto fixed_from_message_id = from_message_id; @@ -19998,8 +20033,8 @@ std::pair> MessagesManager::search_dialog_messages( return result; } - LOG(DEBUG) << "Search messages on server in " << dialog_id << " with query \"" << query << "\" from user " - << sender_user_id << " in thread of " << top_thread_message_id << " from " << from_message_id + LOG(DEBUG) << "Search messages on server in " << dialog_id << " with query \"" << query << "\" from " + << sender_dialog_id << " in thread of " << top_thread_message_id << " from " << from_message_id << " and with limit " << limit; switch (dialog_id.get_type()) { @@ -20008,8 +20043,8 @@ std::pair> MessagesManager::search_dialog_messages( case DialogType::Chat: case DialogType::Channel: td_->create_handler(std::move(promise)) - ->send(dialog_id, query, sender_user_id, std::move(input_user), from_message_id, offset, limit, filter, - top_thread_message_id, random_id); + ->send(dialog_id, query, sender_dialog_id, from_message_id, offset, limit, filter, top_thread_message_id, + random_id); break; case DialogType::SecretChat: if (filter == MessageSearchFilter::UnreadMention) { @@ -20098,7 +20133,7 @@ std::pair> MessagesManager::search_call_messages(Me LOG(DEBUG) << "Search call messages on server from " << from_message_id << " and with limit " << limit; td_->create_handler(std::move(promise)) - ->send(DialogId(), "", UserId(), nullptr, from_message_id, 0, limit, filter, MessageId(), random_id); + ->send(DialogId(), "", DialogId(), from_message_id, 0, limit, filter, MessageId(), random_id); return result; } @@ -20609,7 +20644,7 @@ MessagesManager::FoundMessages MessagesManager::offline_search_messages(DialogId if (!offset.empty()) { auto r_from_search_id = to_integer_safe(offset); if (r_from_search_id.is_error()) { - promise.set_error(Status::Error(400, "Wrong offset specified")); + promise.set_error(Status::Error(400, "Invalid offset specified")); return {}; } fts_query.from_search_id = r_from_search_id.ok(); @@ -20974,7 +21009,7 @@ int32 MessagesManager::get_dialog_message_count(DialogId dialog_id, MessageSearc case DialogType::Chat: case DialogType::Channel: td_->create_handler(std::move(promise)) - ->send(dialog_id, "", UserId(), nullptr, MessageId(), 0, 1, filter, MessageId(), random_id); + ->send(dialog_id, "", DialogId(), MessageId(), 0, 1, filter, MessageId(), random_id); break; case DialogType::None: case DialogType::SecretChat: @@ -21561,14 +21596,14 @@ MessagesManager::FoundMessages MessagesManager::get_message_public_forwards(Full if (!offset.empty()) { auto parts = full_split(offset, ','); if (parts.size() != 3) { - promise.set_error(Status::Error(3, "Wrong offset specified")); + promise.set_error(Status::Error(3, "Invalid offset specified")); return {}; } auto r_offset_date = to_integer_safe(parts[0]); auto r_offset_dialog_id = to_integer_safe(parts[1]); auto r_offset_message_id = to_integer_safe(parts[2]); if (r_offset_date.is_error() || r_offset_dialog_id.is_error() || r_offset_message_id.is_error()) { - promise.set_error(Status::Error(3, "Wrong offset specified")); + promise.set_error(Status::Error(3, "Invalid offset specified")); return {}; } @@ -22481,7 +22516,7 @@ Result MessagesManager::process_input_message_content( TRY_RESULT(content, get_input_message_content(dialog_id, std::move(input_message_content), td_)); if (content.ttl < 0 || content.ttl > MAX_PRIVATE_MESSAGE_TTL) { - return Status::Error(10, "Wrong message TTL specified"); + return Status::Error(10, "Invalid message TTL specified"); } if (content.ttl > 0 && dialog_id.get_type() != DialogType::User) { return Status::Error(10, "Message TTL can be specified only in private chats"); @@ -22622,7 +22657,7 @@ Result> MessagesManager::send_message_group( TRY_RESULT(message_content, process_input_message_content(dialog_id, std::move(input_message_content))); TRY_STATUS(can_use_message_send_options(message_send_options, message_content)); if (!is_allowed_media_group_content(message_content.content->get_type())) { - return Status::Error(5, "Wrong message content type"); + return Status::Error(5, "Invalid message content type"); } message_contents.emplace_back(std::move(message_content.content), message_content.ttl); @@ -22821,7 +22856,7 @@ void MessagesManager::on_message_media_uploaded(DialogId dialog_id, const Messag default: LOG(ERROR) << "Have wrong input media " << to_string(input_media); send_closure_later(actor_id(this), &MessagesManager::on_upload_message_media_finished, m->media_album_id, - dialog_id, message_id, Status::Error(400, "Wrong input media")); + dialog_id, message_id, Status::Error(400, "Invalid input media")); } } } @@ -22845,7 +22880,7 @@ void MessagesManager::on_secret_message_media_uploaded(DialogId dialog_id, const default: LOG(ERROR) << "Have wrong secret input media " << to_string(secret_input_media->input_file_); return send_closure_later(actor_id(this), &MessagesManager::on_upload_message_media_finished, m->media_album_id, - dialog_id, m->message_id, Status::Error(400, "Wrong input media")); + dialog_id, m->message_id, Status::Error(400, "Invalid input media")); } */ // TODO use file_id, thumbnail_file_id, was_uploaded, was_thumbnail_uploaded, @@ -23855,7 +23890,7 @@ void MessagesManager::edit_message_live_location(FullMessageId full_message_id, Location location(input_location); if (location.empty() && input_location != nullptr) { - return promise.set_error(Status::Error(400, "Wrong location specified")); + return promise.set_error(Status::Error(400, "Invalid location specified")); } auto r_new_reply_markup = get_reply_markup(std::move(reply_markup), td_->auth_manager_->is_bot(), true, false, @@ -24158,7 +24193,7 @@ void MessagesManager::edit_inline_message_text(const string &inline_message_id, auto input_bot_inline_message_id = td_->inline_queries_manager_->get_input_bot_inline_message_id(inline_message_id); if (input_bot_inline_message_id == nullptr) { - return promise.set_error(Status::Error(400, "Wrong inline message identifier specified")); + return promise.set_error(Status::Error(400, "Invalid inline message identifier specified")); } int32 flags = 0; @@ -24187,12 +24222,12 @@ void MessagesManager::edit_inline_message_live_location(const string &inline_mes auto input_bot_inline_message_id = td_->inline_queries_manager_->get_input_bot_inline_message_id(inline_message_id); if (input_bot_inline_message_id == nullptr) { - return promise.set_error(Status::Error(400, "Wrong inline message identifier specified")); + return promise.set_error(Status::Error(400, "Invalid inline message identifier specified")); } Location location(input_location); if (location.empty() && input_location != nullptr) { - return promise.set_error(Status::Error(400, "Wrong location specified")); + return promise.set_error(Status::Error(400, "Invalid location specified")); } int32 flags = 0; @@ -24243,12 +24278,12 @@ void MessagesManager::edit_inline_message_media(const string &inline_message_id, auto input_bot_inline_message_id = td_->inline_queries_manager_->get_input_bot_inline_message_id(inline_message_id); if (input_bot_inline_message_id == nullptr) { - return promise.set_error(Status::Error(400, "Wrong inline message identifier specified")); + return promise.set_error(Status::Error(400, "Invalid inline message identifier specified")); } auto input_media = get_input_media(content.content.get(), td_, 0, true); if (input_media == nullptr) { - return promise.set_error(Status::Error(400, "Wrong message content specified")); + return promise.set_error(Status::Error(400, "Invalid message content specified")); } const FormattedText *caption = get_message_content_caption(content.content.get()); @@ -24280,7 +24315,7 @@ void MessagesManager::edit_inline_message_caption(const string &inline_message_i auto input_bot_inline_message_id = td_->inline_queries_manager_->get_input_bot_inline_message_id(inline_message_id); if (input_bot_inline_message_id == nullptr) { - return promise.set_error(Status::Error(400, "Wrong inline message identifier specified")); + return promise.set_error(Status::Error(400, "Invalid inline message identifier specified")); } td_->create_handler(std::move(promise)) @@ -24303,7 +24338,7 @@ void MessagesManager::edit_inline_message_reply_markup(const string &inline_mess auto input_bot_inline_message_id = td_->inline_queries_manager_->get_input_bot_inline_message_id(inline_message_id); if (input_bot_inline_message_id == nullptr) { - return promise.set_error(Status::Error(400, "Wrong inline message identifier specified")); + return promise.set_error(Status::Error(400, "Invalid inline message identifier specified")); } td_->create_handler(std::move(promise)) @@ -24519,7 +24554,7 @@ void MessagesManager::set_game_score(FullMessageId full_message_id, bool edit_me auto input_user = td_->contacts_manager_->get_input_user(user_id); if (input_user == nullptr) { - return promise.set_error(Status::Error(400, "Wrong user identifier specified")); + return promise.set_error(Status::Error(400, "Invalid user identifier specified")); } if (!can_set_game_score(dialog_id, m)) { @@ -24539,7 +24574,7 @@ void MessagesManager::set_inline_game_score(const string &inline_message_id, boo auto input_bot_inline_message_id = td_->inline_queries_manager_->get_input_bot_inline_message_id(inline_message_id); if (input_bot_inline_message_id == nullptr) { - return promise.set_error(Status::Error(400, "Wrong inline message identifier specified")); + return promise.set_error(Status::Error(400, "Invalid inline message identifier specified")); } auto input_user = td_->contacts_manager_->get_input_user(user_id); @@ -24606,7 +24641,7 @@ int64 MessagesManager::get_inline_game_high_scores(const string &inline_message_ auto input_bot_inline_message_id = td_->inline_queries_manager_->get_input_bot_inline_message_id(inline_message_id); if (input_bot_inline_message_id == nullptr) { - promise.set_error(Status::Error(400, "Wrong inline message identifier specified")); + promise.set_error(Status::Error(400, "Invalid inline message identifier specified")); return 0; } diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 1dbb23fc1..9e3743649 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -239,7 +239,7 @@ class MessagesManager : public Actor { vector> &&peers); void on_failed_public_dialogs_search(const string &query, Status &&error); - void on_get_dialog_messages_search_result(DialogId dialog_id, const string &query, UserId sender_user_id, + void on_get_dialog_messages_search_result(DialogId dialog_id, const string &query, DialogId sender_dialog_id, MessageId from_message_id, int32 offset, int32 limit, MessageSearchFilter filter, MessageId top_thread_message_id, int64 random_id, int32 total_count, @@ -709,8 +709,9 @@ class MessagesManager : public Actor { Promise &&promise); std::pair> search_dialog_messages(DialogId dialog_id, const string &query, - UserId sender_user_id, MessageId from_message_id, - int32 offset, int32 limit, MessageSearchFilter filter, + const td_api::object_ptr &sender, + MessageId from_message_id, int32 offset, int32 limit, + MessageSearchFilter filter, MessageId top_thread_message_id, int64 &random_id, bool use_db, Promise &&promise); diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index 665f7d34a..cea9d4a62 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -1438,7 +1438,7 @@ class GetMessageThreadHistoryRequest : public RequestActor<> { class SearchChatMessagesRequest : public RequestActor<> { DialogId dialog_id_; string query_; - UserId sender_user_id_; + td_api::object_ptr sender_; MessageId from_message_id_; int32 offset_; int32 limit_; @@ -1449,9 +1449,9 @@ class SearchChatMessagesRequest : public RequestActor<> { std::pair> messages_; void do_run(Promise &&promise) override { - messages_ = td->messages_manager_->search_dialog_messages(dialog_id_, query_, sender_user_id_, from_message_id_, - offset_, limit_, filter_, top_thread_message_id_, - random_id_, get_tries() == 3, std::move(promise)); + messages_ = td->messages_manager_->search_dialog_messages(dialog_id_, query_, sender_, from_message_id_, offset_, + limit_, filter_, top_thread_message_id_, random_id_, + get_tries() == 3, std::move(promise)); } void do_send_result() override { @@ -1468,13 +1468,13 @@ class SearchChatMessagesRequest : public RequestActor<> { } public: - SearchChatMessagesRequest(ActorShared td, uint64 request_id, int64 dialog_id, string query, int32 user_id, - int64 from_message_id, int32 offset, int32 limit, - tl_object_ptr filter, int64 message_thread_id) + SearchChatMessagesRequest(ActorShared td, uint64 request_id, int64 dialog_id, string query, + td_api::object_ptr sender, int64 from_message_id, int32 offset, + int32 limit, tl_object_ptr filter, int64 message_thread_id) : RequestActor(std::move(td), request_id) , dialog_id_(dialog_id) , query_(std::move(query)) - , sender_user_id_(user_id) + , sender_(std::move(sender)) , from_message_id_(from_message_id) , offset_(offset) , limit_(limit) @@ -5537,7 +5537,7 @@ void Td::on_request(uint64 id, const td_api::getMessageThreadHistory &request) { void Td::on_request(uint64 id, td_api::searchChatMessages &request) { CHECK_IS_USER(); CLEAN_INPUT_STRING(request.query_); - CREATE_REQUEST(SearchChatMessagesRequest, request.chat_id_, std::move(request.query_), request.sender_user_id_, + CREATE_REQUEST(SearchChatMessagesRequest, request.chat_id_, std::move(request.query_), std::move(request.sender_), request.from_message_id_, request.offset_, request.limit_, std::move(request.filter_), request.message_thread_id_); } diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index a4cd7bd66..a2c5e6aa2 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -318,7 +318,7 @@ class CliClient final : public Actor { auto last_message_id = messages.messages_.back()->id_; LOG(ERROR) << (last_message_id >> 20); send_request(td_api::make_object( - search_chat_id_, "", 0, last_message_id, 0, 100, + search_chat_id_, "", nullptr, last_message_id, 0, 100, td_api::make_object(), 0)); } else { search_chat_id_ = 0; @@ -509,6 +509,15 @@ class CliClient final : public Actor { return as_message_id(str); } + td_api::object_ptr as_message_sender(Slice str) const { + str = trim(str); + if (str.empty() || str[0] != '-') { + return td_api::make_object(as_user_id(str)); + } else { + return td_api::make_object(as_chat_id(str)); + } + } + static int32 as_button_id(Slice str) { return to_integer(trim(str)); } @@ -1877,13 +1886,14 @@ class CliClient final : public Actor { string message_thread_id; std::tie(chat_id, message_thread_id) = split(args); - send_request(td_api::make_object(as_chat_id(chat_id), "", 0, 0, 0, 100, nullptr, + send_request(td_api::make_object(as_chat_id(chat_id), "", nullptr, 0, 0, 100, nullptr, as_message_thread_id(message_thread_id))); } else if (op == "spvf") { search_chat_id_ = as_chat_id(args); send_request(td_api::make_object( - search_chat_id_, "", 0, 0, 0, 100, td_api::make_object(), 0)); + search_chat_id_, "", nullptr, 0, 0, 100, td_api::make_object(), + 0)); } else if (op == "Search" || op == "SearchA" || op == "SearchM") { string from_date; string limit; @@ -1917,7 +1927,7 @@ class CliClient final : public Actor { limit = "10"; } - send_request(td_api::make_object(as_chat_id(chat_id), query, 0, 0, 0, + send_request(td_api::make_object(as_chat_id(chat_id), query, nullptr, 0, 0, to_integer(limit), nullptr, 0)); } else if (op == "SMME") { string chat_id; @@ -1928,21 +1938,22 @@ class CliClient final : public Actor { limit = "10"; } - send_request(td_api::make_object(as_chat_id(chat_id), "", my_id_, 0, 0, - to_integer(limit), nullptr, 0)); - } else if (op == "SMU") { + send_request(td_api::make_object( + as_chat_id(chat_id), "", td_api::make_object(my_id_), 0, 0, + to_integer(limit), nullptr, 0)); + } else if (op == "SMU" || op == "SMC") { string chat_id; - string user_id; + string sender_id; string limit; std::tie(chat_id, args) = split(args); - std::tie(user_id, limit) = split(args); + std::tie(sender_id, limit) = split(args); if (limit.empty()) { limit = "10"; } - send_request(td_api::make_object(as_chat_id(chat_id), "", as_user_id(user_id), 0, 0, - to_integer(limit), nullptr, 0)); + send_request(td_api::make_object( + as_chat_id(chat_id), "", as_message_sender(sender_id), 0, 0, to_integer(limit), nullptr, 0)); } else if (op == "SM") { string chat_id; string filter; @@ -1965,7 +1976,7 @@ class CliClient final : public Actor { } send_request(td_api::make_object( - as_chat_id(chat_id), "", 0, as_message_id(offset_message_id), to_integer(offset), + as_chat_id(chat_id), "", nullptr, as_message_id(offset_message_id), to_integer(offset), to_integer(limit), as_search_messages_filter(filter), 0)); } else if (op == "SC") { string limit; @@ -2010,7 +2021,7 @@ class CliClient final : public Actor { limit = "10"; } send_request(td_api::make_object( - as_chat_id(chat_id), query, 0, as_message_id(offset_message_id), 0, to_integer(limit), + as_chat_id(chat_id), query, nullptr, as_message_id(offset_message_id), 0, to_integer(limit), td_api::make_object(), 0)); } else if (op == "SearchDocument") { string chat_id; @@ -2028,7 +2039,7 @@ class CliClient final : public Actor { limit = "10"; } send_request(td_api::make_object( - as_chat_id(chat_id), query, 0, to_integer(offset_message_id), 0, to_integer(limit), + as_chat_id(chat_id), query, nullptr, to_integer(offset_message_id), 0, to_integer(limit), td_api::make_object(), 0)); } else if (op == "SearchPhoto") { string chat_id; @@ -2046,7 +2057,7 @@ class CliClient final : public Actor { limit = "10"; } send_request(td_api::make_object( - as_chat_id(chat_id), query, 0, as_message_id(offset_message_id), 0, to_integer(limit), + as_chat_id(chat_id), query, nullptr, as_message_id(offset_message_id), 0, to_integer(limit), td_api::make_object(), 0)); } else if (op == "SearchChatPhoto") { string chat_id; @@ -2064,7 +2075,7 @@ class CliClient final : public Actor { limit = "10"; } send_request(td_api::make_object( - as_chat_id(chat_id), query, 0, as_message_id(offset_message_id), 0, to_integer(limit), + as_chat_id(chat_id), query, nullptr, as_message_id(offset_message_id), 0, to_integer(limit), td_api::make_object(), 0)); } else if (op == "gcmc") { string chat_id;