Use Promise in searchMessages instead of RequestActor.
This commit is contained in:
parent
da687ab202
commit
1d9f7c0482
@ -2052,7 +2052,7 @@ class GetSearchCountersQuery final : public Td::ResultHandler {
|
|||||||
};
|
};
|
||||||
|
|
||||||
class SearchMessagesGlobalQuery final : public Td::ResultHandler {
|
class SearchMessagesGlobalQuery final : public Td::ResultHandler {
|
||||||
Promise<Unit> promise_;
|
Promise<td_api::object_ptr<td_api::foundMessages>> promise_;
|
||||||
string query_;
|
string query_;
|
||||||
int32 offset_date_;
|
int32 offset_date_;
|
||||||
DialogId offset_dialog_id_;
|
DialogId offset_dialog_id_;
|
||||||
@ -2061,21 +2061,20 @@ class SearchMessagesGlobalQuery final : public Td::ResultHandler {
|
|||||||
MessageSearchFilter filter_;
|
MessageSearchFilter filter_;
|
||||||
int32 min_date_;
|
int32 min_date_;
|
||||||
int32 max_date_;
|
int32 max_date_;
|
||||||
int64 random_id_;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit SearchMessagesGlobalQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) {
|
explicit SearchMessagesGlobalQuery(Promise<td_api::object_ptr<td_api::foundMessages>> &&promise)
|
||||||
|
: promise_(std::move(promise)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void send(FolderId folder_id, bool ignore_folder_id, bool broadcasts_only, const string &query, int32 offset_date,
|
void send(FolderId folder_id, bool ignore_folder_id, bool broadcasts_only, const string &query, int32 offset_date,
|
||||||
DialogId offset_dialog_id, MessageId offset_message_id, int32 limit, MessageSearchFilter filter,
|
DialogId offset_dialog_id, MessageId offset_message_id, int32 limit, MessageSearchFilter filter,
|
||||||
int32 min_date, int32 max_date, int64 random_id) {
|
int32 min_date, int32 max_date) {
|
||||||
query_ = query;
|
query_ = query;
|
||||||
offset_date_ = offset_date;
|
offset_date_ = offset_date;
|
||||||
offset_dialog_id_ = offset_dialog_id;
|
offset_dialog_id_ = offset_dialog_id;
|
||||||
offset_message_id_ = offset_message_id;
|
offset_message_id_ = offset_message_id;
|
||||||
limit_ = limit;
|
limit_ = limit;
|
||||||
random_id_ = random_id;
|
|
||||||
filter_ = filter;
|
filter_ = filter;
|
||||||
min_date_ = min_date;
|
min_date_ = min_date;
|
||||||
max_date_ = max_date;
|
max_date_ = max_date;
|
||||||
@ -2107,22 +2106,25 @@ class SearchMessagesGlobalQuery final : public Td::ResultHandler {
|
|||||||
PromiseCreator::lambda([actor_id = td_->messages_manager_actor_.get(), query = std::move(query_),
|
PromiseCreator::lambda([actor_id = td_->messages_manager_actor_.get(), query = std::move(query_),
|
||||||
offset_date = offset_date_, offset_dialog_id = offset_dialog_id_,
|
offset_date = offset_date_, offset_dialog_id = offset_dialog_id_,
|
||||||
offset_message_id = offset_message_id_, limit = limit_, filter = std::move(filter_),
|
offset_message_id = offset_message_id_, limit = limit_, filter = std::move(filter_),
|
||||||
min_date = min_date_, max_date = max_date_, random_id = random_id_,
|
min_date = min_date_, max_date = max_date_,
|
||||||
promise = std::move(promise_)](Result<MessagesInfo> &&result) mutable {
|
promise = std::move(promise_)](Result<MessagesInfo> &&result) mutable {
|
||||||
if (result.is_error()) {
|
if (result.is_error()) {
|
||||||
promise.set_error(result.move_as_error());
|
promise.set_error(result.move_as_error());
|
||||||
} else {
|
} else {
|
||||||
auto info = result.move_as_ok();
|
auto info = result.move_as_ok();
|
||||||
send_closure(actor_id, &MessagesManager::on_get_messages_search_result, query, offset_date,
|
send_closure(actor_id, &MessagesManager::on_get_messages_search_result, query, offset_date,
|
||||||
offset_dialog_id, offset_message_id, limit, filter, min_date, max_date, random_id,
|
offset_dialog_id, offset_message_id, limit, filter, min_date, max_date, info.total_count,
|
||||||
info.total_count, std::move(info.messages), info.next_rate, std::move(promise));
|
std::move(info.messages), info.next_rate, std::move(promise));
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
"SearchMessagesGlobalQuery");
|
"SearchMessagesGlobalQuery");
|
||||||
}
|
}
|
||||||
|
|
||||||
void on_error(Status status) final {
|
void on_error(Status status) final {
|
||||||
td_->messages_manager_->on_failed_messages_search(random_id_);
|
if (status.message() == "SEARCH_QUERY_EMPTY") {
|
||||||
|
return promise_.set_value(td_->messages_manager_->get_found_messages_object({}, "SearchMessagesGlobalQuery"));
|
||||||
|
;
|
||||||
|
}
|
||||||
promise_.set_error(std::move(status));
|
promise_.set_error(std::move(status));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -9231,16 +9233,16 @@ void MessagesManager::on_get_dialog_message_count(DialogId dialog_id, SavedMessa
|
|||||||
void MessagesManager::on_get_messages_search_result(const string &query, int32 offset_date, DialogId offset_dialog_id,
|
void MessagesManager::on_get_messages_search_result(const string &query, int32 offset_date, DialogId offset_dialog_id,
|
||||||
MessageId offset_message_id, int32 limit,
|
MessageId offset_message_id, int32 limit,
|
||||||
MessageSearchFilter filter, int32 min_date, int32 max_date,
|
MessageSearchFilter filter, int32 min_date, int32 max_date,
|
||||||
int64 random_id, int32 total_count,
|
int32 total_count,
|
||||||
vector<tl_object_ptr<telegram_api::Message>> &&messages,
|
vector<tl_object_ptr<telegram_api::Message>> &&messages,
|
||||||
int32 next_rate, Promise<Unit> &&promise) {
|
int32 next_rate,
|
||||||
|
Promise<td_api::object_ptr<td_api::foundMessages>> &&promise) {
|
||||||
TRY_STATUS_PROMISE(promise, G()->close_status());
|
TRY_STATUS_PROMISE(promise, G()->close_status());
|
||||||
|
|
||||||
LOG(INFO) << "Receive " << messages.size() << " found messages";
|
LOG(INFO) << "Receive " << messages.size() << " found messages";
|
||||||
auto it = found_messages_.find(random_id);
|
|
||||||
CHECK(it != found_messages_.end());
|
|
||||||
|
|
||||||
auto &result = it->second.message_full_ids;
|
FoundMessages found_messages;
|
||||||
|
auto &result = found_messages.message_full_ids;
|
||||||
CHECK(result.empty());
|
CHECK(result.empty());
|
||||||
int32 last_message_date = 0;
|
int32 last_message_date = 0;
|
||||||
MessageId last_message_id;
|
MessageId last_message_id;
|
||||||
@ -9269,21 +9271,15 @@ void MessagesManager::on_get_messages_search_result(const string &query, int32 o
|
|||||||
<< " messages";
|
<< " messages";
|
||||||
total_count = static_cast<int32>(result.size());
|
total_count = static_cast<int32>(result.size());
|
||||||
}
|
}
|
||||||
it->second.total_count = total_count;
|
found_messages.total_count = total_count;
|
||||||
if (!result.empty()) {
|
if (!result.empty()) {
|
||||||
if (next_rate > 0) {
|
if (next_rate > 0) {
|
||||||
last_message_date = next_rate;
|
last_message_date = next_rate;
|
||||||
}
|
}
|
||||||
it->second.next_offset = PSTRING() << last_message_date << ',' << last_dialog_id.get() << ','
|
found_messages.next_offset = PSTRING() << last_message_date << ',' << last_dialog_id.get() << ','
|
||||||
<< last_message_id.get_server_message_id().get();
|
<< last_message_id.get_server_message_id().get();
|
||||||
}
|
}
|
||||||
promise.set_value(Unit());
|
promise.set_value(get_found_messages_object(found_messages, "on_get_messages_search_result"));
|
||||||
}
|
|
||||||
|
|
||||||
void MessagesManager::on_failed_messages_search(int64 random_id) {
|
|
||||||
auto it = found_messages_.find(random_id);
|
|
||||||
CHECK(it != found_messages_.end());
|
|
||||||
found_messages_.erase(it);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessagesManager::on_get_outgoing_document_messages(vector<tl_object_ptr<telegram_api::Message>> &&messages,
|
void MessagesManager::on_get_outgoing_document_messages(vector<tl_object_ptr<telegram_api::Message>> &&messages,
|
||||||
@ -21079,25 +21075,12 @@ void MessagesManager::on_message_db_calls_result(Result<MessageDbCallsResult> re
|
|||||||
promise.set_value(Unit());
|
promise.set_value(Unit());
|
||||||
}
|
}
|
||||||
|
|
||||||
MessagesManager::FoundMessages MessagesManager::search_messages(FolderId folder_id, bool ignore_folder_id,
|
void MessagesManager::search_messages(FolderId folder_id, bool ignore_folder_id, bool broadcasts_only,
|
||||||
bool broadcasts_only, const string &query,
|
const string &query, const string &offset, int32 limit,
|
||||||
const string &offset, int32 limit,
|
MessageSearchFilter filter, int32 min_date, int32 max_date,
|
||||||
MessageSearchFilter filter, int32 min_date,
|
Promise<td_api::object_ptr<td_api::foundMessages>> &&promise) {
|
||||||
int32 max_date, int64 &random_id,
|
|
||||||
Promise<Unit> &&promise) {
|
|
||||||
if (random_id != 0) {
|
|
||||||
// request has already been sent before
|
|
||||||
auto it = found_messages_.find(random_id);
|
|
||||||
CHECK(it != found_messages_.end());
|
|
||||||
auto result = std::move(it->second);
|
|
||||||
found_messages_.erase(it);
|
|
||||||
promise.set_value(Unit());
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (limit <= 0) {
|
if (limit <= 0) {
|
||||||
promise.set_error(Status::Error(400, "Parameter limit must be positive"));
|
return promise.set_error(Status::Error(400, "Parameter limit must be positive"));
|
||||||
return {};
|
|
||||||
}
|
}
|
||||||
if (limit > MAX_SEARCH_MESSAGES) {
|
if (limit > MAX_SEARCH_MESSAGES) {
|
||||||
limit = MAX_SEARCH_MESSAGES;
|
limit = MAX_SEARCH_MESSAGES;
|
||||||
@ -21132,35 +21115,26 @@ MessagesManager::FoundMessages MessagesManager::search_messages(FolderId folder_
|
|||||||
return true;
|
return true;
|
||||||
}();
|
}();
|
||||||
if (!is_offset_valid) {
|
if (!is_offset_valid) {
|
||||||
promise.set_error(Status::Error(400, "Invalid offset specified"));
|
return promise.set_error(Status::Error(400, "Invalid offset specified"));
|
||||||
return {};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CHECK(filter != MessageSearchFilter::Call && filter != MessageSearchFilter::MissedCall);
|
CHECK(filter != MessageSearchFilter::Call && filter != MessageSearchFilter::MissedCall);
|
||||||
if (filter == MessageSearchFilter::Mention || filter == MessageSearchFilter::UnreadMention ||
|
if (filter == MessageSearchFilter::Mention || filter == MessageSearchFilter::UnreadMention ||
|
||||||
filter == MessageSearchFilter::UnreadReaction || filter == MessageSearchFilter::FailedToSend ||
|
filter == MessageSearchFilter::UnreadReaction || filter == MessageSearchFilter::FailedToSend ||
|
||||||
filter == MessageSearchFilter::Pinned) {
|
filter == MessageSearchFilter::Pinned) {
|
||||||
promise.set_error(Status::Error(400, "The filter is not supported"));
|
return promise.set_error(Status::Error(400, "The filter is not supported"));
|
||||||
return {};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (query.empty() && filter == MessageSearchFilter::Empty) {
|
if (query.empty() && filter == MessageSearchFilter::Empty) {
|
||||||
promise.set_value(Unit());
|
return promise.set_value(get_found_messages_object({}, "search_messages"));
|
||||||
return {};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
|
||||||
random_id = Random::secure_int64();
|
|
||||||
} while (random_id == 0 || found_messages_.count(random_id) > 0);
|
|
||||||
found_messages_[random_id]; // reserve place for result
|
|
||||||
|
|
||||||
LOG(DEBUG) << "Search all messages filtered by " << filter << " with query = \"" << query << "\" from offset "
|
LOG(DEBUG) << "Search all messages filtered by " << filter << " with query = \"" << query << "\" from offset "
|
||||||
<< offset << " and limit " << limit;
|
<< offset << " and limit " << limit;
|
||||||
|
|
||||||
td_->create_handler<SearchMessagesGlobalQuery>(std::move(promise))
|
td_->create_handler<SearchMessagesGlobalQuery>(std::move(promise))
|
||||||
->send(folder_id, ignore_folder_id, broadcasts_only, query, offset_date, offset_dialog_id, offset_message_id,
|
->send(folder_id, ignore_folder_id, broadcasts_only, query, offset_date, offset_dialog_id, offset_message_id,
|
||||||
limit, filter, min_date, max_date, random_id);
|
limit, filter, min_date, max_date);
|
||||||
return {};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int64 MessagesManager::get_dialog_message_by_date(DialogId dialog_id, int32 date, Promise<Unit> &&promise) {
|
int64 MessagesManager::get_dialog_message_by_date(DialogId dialog_id, int32 date, Promise<Unit> &&promise) {
|
||||||
|
@ -193,10 +193,9 @@ class MessagesManager final : public Actor {
|
|||||||
|
|
||||||
void on_get_messages_search_result(const string &query, int32 offset_date, DialogId offset_dialog_id,
|
void on_get_messages_search_result(const string &query, int32 offset_date, DialogId offset_dialog_id,
|
||||||
MessageId offset_message_id, int32 limit, MessageSearchFilter filter,
|
MessageId offset_message_id, int32 limit, MessageSearchFilter filter,
|
||||||
int32 min_date, int32 max_date, int64 random_id, int32 total_count,
|
int32 min_date, int32 max_date, int32 total_count,
|
||||||
vector<tl_object_ptr<telegram_api::Message>> &&messages, int32 next_rate,
|
vector<tl_object_ptr<telegram_api::Message>> &&messages, int32 next_rate,
|
||||||
Promise<Unit> &&promise);
|
Promise<td_api::object_ptr<td_api::foundMessages>> &&promise);
|
||||||
void on_failed_messages_search(int64 random_id);
|
|
||||||
|
|
||||||
void on_get_outgoing_document_messages(vector<tl_object_ptr<telegram_api::Message>> &&messages,
|
void on_get_outgoing_document_messages(vector<tl_object_ptr<telegram_api::Message>> &&messages,
|
||||||
Promise<td_api::object_ptr<td_api::foundMessages>> &&promise);
|
Promise<td_api::object_ptr<td_api::foundMessages>> &&promise);
|
||||||
@ -734,9 +733,9 @@ class MessagesManager final : public Actor {
|
|||||||
FoundMessages offline_search_messages(DialogId dialog_id, const string &query, string offset, int32 limit,
|
FoundMessages offline_search_messages(DialogId dialog_id, const string &query, string offset, int32 limit,
|
||||||
MessageSearchFilter filter, int64 &random_id, Promise<Unit> &&promise);
|
MessageSearchFilter filter, int64 &random_id, Promise<Unit> &&promise);
|
||||||
|
|
||||||
FoundMessages search_messages(FolderId folder_id, bool ignore_folder_id, bool broadcasts_only, const string &query,
|
void search_messages(FolderId folder_id, bool ignore_folder_id, bool broadcasts_only, const string &query,
|
||||||
const string &offset, int32 limit, MessageSearchFilter filter, int32 min_date,
|
const string &offset, int32 limit, MessageSearchFilter filter, int32 min_date, int32 max_date,
|
||||||
int32 max_date, int64 &random_id, Promise<Unit> &&promise);
|
Promise<td_api::object_ptr<td_api::foundMessages>> &&promise);
|
||||||
|
|
||||||
FoundMessages search_call_messages(const string &offset, int32 limit, bool only_missed, int64 &random_id, bool use_db,
|
FoundMessages search_call_messages(const string &offset, int32 limit, bool only_missed, int64 &random_id, bool use_db,
|
||||||
Promise<Unit> &&promise);
|
Promise<Unit> &&promise);
|
||||||
@ -3243,7 +3242,6 @@ class MessagesManager final : public Actor {
|
|||||||
FlatHashMap<int64, td_api::object_ptr<td_api::messageCalendar>> found_dialog_message_calendars_;
|
FlatHashMap<int64, td_api::object_ptr<td_api::messageCalendar>> found_dialog_message_calendars_;
|
||||||
FlatHashMap<int64, FoundDialogMessages> found_dialog_messages_; // random_id -> FoundDialogMessages
|
FlatHashMap<int64, FoundDialogMessages> found_dialog_messages_; // random_id -> FoundDialogMessages
|
||||||
FlatHashMap<int64, DialogId> found_dialog_messages_dialog_id_; // random_id -> dialog_id
|
FlatHashMap<int64, DialogId> found_dialog_messages_dialog_id_; // random_id -> dialog_id
|
||||||
FlatHashMap<int64, FoundMessages> found_messages_; // random_id -> FoundMessages
|
|
||||||
FlatHashMap<int64, FoundMessages> found_call_messages_; // random_id -> FoundMessages
|
FlatHashMap<int64, FoundMessages> found_call_messages_; // random_id -> FoundMessages
|
||||||
|
|
||||||
FlatHashMap<int64, FoundMessages> found_fts_messages_; // random_id -> FoundMessages
|
FlatHashMap<int64, FoundMessages> found_fts_messages_; // random_id -> FoundMessages
|
||||||
|
@ -1499,56 +1499,6 @@ class SearchSecretMessagesRequest final : public RequestActor<> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class SearchMessagesRequest final : public RequestActor<> {
|
|
||||||
FolderId folder_id_;
|
|
||||||
bool ignore_folder_id_;
|
|
||||||
bool broadcasts_only_;
|
|
||||||
string query_;
|
|
||||||
string offset_;
|
|
||||||
int32 limit_;
|
|
||||||
MessageSearchFilter filter_;
|
|
||||||
int32 min_date_;
|
|
||||||
int32 max_date_;
|
|
||||||
int64 random_id_;
|
|
||||||
|
|
||||||
MessagesManager::FoundMessages messages_;
|
|
||||||
|
|
||||||
void do_run(Promise<Unit> &&promise) final {
|
|
||||||
messages_ =
|
|
||||||
td_->messages_manager_->search_messages(folder_id_, ignore_folder_id_, broadcasts_only_, query_, offset_,
|
|
||||||
limit_, filter_, min_date_, max_date_, random_id_, std::move(promise));
|
|
||||||
}
|
|
||||||
|
|
||||||
void do_send_result() final {
|
|
||||||
send_result(td_->messages_manager_->get_found_messages_object(messages_, "SearchMessagesRequest"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void do_send_error(Status &&status) final {
|
|
||||||
if (status.message() == "SEARCH_QUERY_EMPTY") {
|
|
||||||
messages_ = {};
|
|
||||||
return do_send_result();
|
|
||||||
}
|
|
||||||
send_error(std::move(status));
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
SearchMessagesRequest(ActorShared<Td> td, uint64 request_id, FolderId folder_id, bool ignore_folder_id,
|
|
||||||
bool broadcasts_only, string query, string offset, int32 limit,
|
|
||||||
tl_object_ptr<td_api::SearchMessagesFilter> &&filter, int32 min_date, int32 max_date)
|
|
||||||
: RequestActor(std::move(td), request_id)
|
|
||||||
, folder_id_(folder_id)
|
|
||||||
, ignore_folder_id_(ignore_folder_id)
|
|
||||||
, broadcasts_only_(broadcasts_only)
|
|
||||||
, query_(std::move(query))
|
|
||||||
, offset_(std::move(offset))
|
|
||||||
, limit_(limit)
|
|
||||||
, filter_(get_message_search_filter(filter))
|
|
||||||
, min_date_(min_date)
|
|
||||||
, max_date_(max_date)
|
|
||||||
, random_id_(0) {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class SearchCallMessagesRequest final : public RequestActor<> {
|
class SearchCallMessagesRequest final : public RequestActor<> {
|
||||||
string offset_;
|
string offset_;
|
||||||
int32 limit_;
|
int32 limit_;
|
||||||
@ -5430,9 +5380,11 @@ void Td::on_request(uint64 id, td_api::searchMessages &request) {
|
|||||||
if (!dialog_list_id.is_folder()) {
|
if (!dialog_list_id.is_folder()) {
|
||||||
return send_error_raw(id, 400, "Wrong chat list specified");
|
return send_error_raw(id, 400, "Wrong chat list specified");
|
||||||
}
|
}
|
||||||
CREATE_REQUEST(SearchMessagesRequest, dialog_list_id.get_folder_id(), request.chat_list_ == nullptr,
|
CREATE_REQUEST_PROMISE();
|
||||||
request.only_in_channels_, std::move(request.query_), std::move(request.offset_), request.limit_,
|
messages_manager_->search_messages(dialog_list_id.get_folder_id(), request.chat_list_ == nullptr,
|
||||||
std::move(request.filter_), request.min_date_, request.max_date_);
|
request.only_in_channels_, std::move(request.query_), std::move(request.offset_),
|
||||||
|
request.limit_, get_message_search_filter(request.filter_), request.min_date_,
|
||||||
|
request.max_date_, std::move(promise));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Td::on_request(uint64 id, td_api::searchSavedMessages &request) {
|
void Td::on_request(uint64 id, td_api::searchSavedMessages &request) {
|
||||||
|
Loading…
Reference in New Issue
Block a user