Improve return value of searchCallMessages.
This commit is contained in:
parent
9663dc98b5
commit
6aa4558850
@ -5805,10 +5805,10 @@ searchMessages chat_list:ChatList query:string offset:string limit:int32 filter:
|
|||||||
searchSecretMessages chat_id:int53 query:string offset:string limit:int32 filter:SearchMessagesFilter = FoundMessages;
|
searchSecretMessages chat_id:int53 query:string offset:string limit:int32 filter:SearchMessagesFilter = FoundMessages;
|
||||||
|
|
||||||
//@description Searches for call messages. Returns the results in reverse chronological order (i.e., in order of decreasing message_id). For optimal performance, the number of returned messages is chosen by TDLib
|
//@description Searches for call messages. Returns the results in reverse chronological order (i.e., in order of decreasing message_id). For optimal performance, the number of returned messages is chosen by TDLib
|
||||||
//@from_message_id Identifier of the message from which to search; use 0 to get results from the last message
|
//@offset Offset of the first entry to return as received from the previous request; use empty string to get the first chunk of results
|
||||||
//@limit The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit
|
//@limit The maximum number of messages to be returned; up to 100. For optimal performance, the number of returned messages is chosen by TDLib and can be smaller than the specified limit
|
||||||
//@only_missed Pass true to search only for messages with missed/declined calls
|
//@only_missed Pass true to search only for messages with missed/declined calls
|
||||||
searchCallMessages from_message_id:int53 limit:int32 only_missed:Bool = Messages;
|
searchCallMessages offset:string limit:int32 only_missed:Bool = FoundMessages;
|
||||||
|
|
||||||
//@description Searches for outgoing messages with content of the type messageDocument in all chats except secret chats. Returns the results in reverse chronological order
|
//@description Searches for outgoing messages with content of the type messageDocument in all chats except secret chats. Returns the results in reverse chronological order
|
||||||
//@query Query to search for in document file name and message caption
|
//@query Query to search for in document file name and message caption
|
||||||
|
@ -10285,10 +10285,15 @@ void MessagesManager::on_get_dialog_messages_search_result(
|
|||||||
first_added_message_id = MessageId::min();
|
first_added_message_id = MessageId::min();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto &result = it->second.second;
|
auto &result = it->second.full_message_ids;
|
||||||
CHECK(result.empty());
|
CHECK(result.empty());
|
||||||
int32 added_message_count = 0;
|
int32 added_message_count = 0;
|
||||||
|
MessageId next_offset_message_id;
|
||||||
for (auto &message : messages) {
|
for (auto &message : messages) {
|
||||||
|
auto message_id = MessageId::get_message_id(message, false);
|
||||||
|
if (message_id.is_valid() && (!next_offset_message_id.is_valid() || message_id < next_offset_message_id)) {
|
||||||
|
next_offset_message_id = message_id;
|
||||||
|
}
|
||||||
auto new_full_message_id =
|
auto new_full_message_id =
|
||||||
on_get_message(std::move(message), false, false, false, false, false, "search call messages");
|
on_get_message(std::move(message), false, false, false, false, false, "search call messages");
|
||||||
if (new_full_message_id == FullMessageId()) {
|
if (new_full_message_id == FullMessageId()) {
|
||||||
@ -10298,7 +10303,7 @@ void MessagesManager::on_get_dialog_messages_search_result(
|
|||||||
result.push_back(new_full_message_id);
|
result.push_back(new_full_message_id);
|
||||||
added_message_count++;
|
added_message_count++;
|
||||||
|
|
||||||
auto message_id = new_full_message_id.get_message_id();
|
CHECK(message_id == new_full_message_id.get_message_id());
|
||||||
CHECK(message_id.is_valid());
|
CHECK(message_id.is_valid());
|
||||||
if (message_id < first_added_message_id || !first_added_message_id.is_valid()) {
|
if (message_id < first_added_message_id || !first_added_message_id.is_valid()) {
|
||||||
first_added_message_id = message_id;
|
first_added_message_id = message_id;
|
||||||
@ -10334,7 +10339,10 @@ void MessagesManager::on_get_dialog_messages_search_result(
|
|||||||
save_calls_db_state();
|
save_calls_db_state();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
it->second.first = total_count;
|
it->second.total_count = total_count;
|
||||||
|
if (next_offset_message_id.is_valid()) {
|
||||||
|
it->second.next_offset = PSTRING() << next_offset_message_id.get_server_message_id().get();
|
||||||
|
}
|
||||||
promise.set_value(Unit());
|
promise.set_value(Unit());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -10357,7 +10365,7 @@ void MessagesManager::on_get_dialog_messages_search_result(
|
|||||||
CHECK(d != nullptr);
|
CHECK(d != nullptr);
|
||||||
for (auto &message : messages) {
|
for (auto &message : messages) {
|
||||||
auto message_id = MessageId::get_message_id(message, false);
|
auto message_id = MessageId::get_message_id(message, false);
|
||||||
if (message_id.is_valid() && message_id < next_from_message_id) {
|
if (message_id.is_valid() && (!next_from_message_id.is_valid() || message_id < next_from_message_id)) {
|
||||||
next_from_message_id = message_id;
|
next_from_message_id = message_id;
|
||||||
}
|
}
|
||||||
auto new_full_message_id = on_get_message(std::move(message), false, dialog_id.get_type() == DialogType::Channel,
|
auto new_full_message_id = on_get_message(std::move(message), false, dialog_id.get_type() == DialogType::Channel,
|
||||||
@ -23080,9 +23088,9 @@ MessagesManager::FoundDialogMessages MessagesManager::search_dialog_messages(
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<int32, vector<FullMessageId>> MessagesManager::search_call_messages(MessageId from_message_id, int32 limit,
|
MessagesManager::FoundMessages MessagesManager::search_call_messages(const string &offset, int32 limit,
|
||||||
bool only_missed, int64 &random_id,
|
bool only_missed, int64 &random_id, bool use_db,
|
||||||
bool use_db, Promise<Unit> &&promise) {
|
Promise<Unit> &&promise) {
|
||||||
if (random_id != 0) {
|
if (random_id != 0) {
|
||||||
// request has already been sent before
|
// request has already been sent before
|
||||||
auto it = found_call_messages_.find(random_id);
|
auto it = found_call_messages_.find(random_id);
|
||||||
@ -23094,9 +23102,9 @@ std::pair<int32, vector<FullMessageId>> MessagesManager::search_call_messages(Me
|
|||||||
}
|
}
|
||||||
random_id = 0;
|
random_id = 0;
|
||||||
}
|
}
|
||||||
LOG(INFO) << "Search call messages from " << from_message_id << " with limit " << limit;
|
LOG(INFO) << "Search call messages from " << offset << " with limit " << limit;
|
||||||
|
|
||||||
std::pair<int32, vector<FullMessageId>> result;
|
FoundMessages result;
|
||||||
if (limit <= 0) {
|
if (limit <= 0) {
|
||||||
promise.set_error(Status::Error(400, "Parameter limit must be positive"));
|
promise.set_error(Status::Error(400, "Parameter limit must be positive"));
|
||||||
return result;
|
return result;
|
||||||
@ -23105,15 +23113,16 @@ std::pair<int32, vector<FullMessageId>> MessagesManager::search_call_messages(Me
|
|||||||
limit = MAX_SEARCH_MESSAGES;
|
limit = MAX_SEARCH_MESSAGES;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (from_message_id.get() > MessageId::max().get()) {
|
MessageId offset_message_id;
|
||||||
from_message_id = MessageId::max();
|
if (!offset.empty()) {
|
||||||
}
|
auto r_offset_server_message_id = to_integer_safe<int32>(offset);
|
||||||
|
if (r_offset_server_message_id.is_error()) {
|
||||||
|
promise.set_error(Status::Error(400, "Invalid offset specified"));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
if (!from_message_id.is_valid() && from_message_id != MessageId()) {
|
offset_message_id = MessageId(ServerMessageId(r_offset_server_message_id.ok()));
|
||||||
promise.set_error(Status::Error(400, "Parameter from_message_id must be identifier of a chat message or 0"));
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
from_message_id = from_message_id.get_next_server_message_id();
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
random_id = Random::secure_int64();
|
random_id = Random::secure_int64();
|
||||||
@ -23127,7 +23136,7 @@ std::pair<int32, vector<FullMessageId>> MessagesManager::search_call_messages(Me
|
|||||||
MessageId first_db_message_id =
|
MessageId first_db_message_id =
|
||||||
calls_db_state_.first_calls_database_message_id_by_index[call_message_search_filter_index(filter)];
|
calls_db_state_.first_calls_database_message_id_by_index[call_message_search_filter_index(filter)];
|
||||||
int32 message_count = calls_db_state_.message_count_by_index[call_message_search_filter_index(filter)];
|
int32 message_count = calls_db_state_.message_count_by_index[call_message_search_filter_index(filter)];
|
||||||
auto fixed_from_message_id = from_message_id;
|
auto fixed_from_message_id = offset_message_id;
|
||||||
if (fixed_from_message_id == MessageId()) {
|
if (fixed_from_message_id == MessageId()) {
|
||||||
fixed_from_message_id = MessageId::max();
|
fixed_from_message_id = MessageId::max();
|
||||||
}
|
}
|
||||||
@ -23152,7 +23161,7 @@ std::pair<int32, vector<FullMessageId>> MessagesManager::search_call_messages(Me
|
|||||||
}
|
}
|
||||||
|
|
||||||
td_->create_handler<SearchMessagesQuery>(std::move(promise))
|
td_->create_handler<SearchMessagesQuery>(std::move(promise))
|
||||||
->send(DialogId(), "", DialogId(), from_message_id, 0, limit, filter, MessageId(), random_id);
|
->send(DialogId(), "", DialogId(), offset_message_id, 0, limit, filter, MessageId(), random_id);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -23190,7 +23199,7 @@ void MessagesManager::search_dialog_recent_location_messages(DialogId dialog_id,
|
|||||||
case DialogType::Channel:
|
case DialogType::Channel:
|
||||||
return td_->create_handler<GetRecentLocationsQuery>(std::move(promise))->send(dialog_id, limit);
|
return td_->create_handler<GetRecentLocationsQuery>(std::move(promise))->send(dialog_id, limit);
|
||||||
case DialogType::SecretChat:
|
case DialogType::SecretChat:
|
||||||
return promise.set_value(get_messages_object(0, vector<td_api::object_ptr<td_api::message>>(), true));
|
return promise.set_value(get_messages_object(0, vector<td_api::object_ptr<td_api::message>>(), false));
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
promise.set_error(Status::Error(500, "Search messages is not supported"));
|
promise.set_error(Status::Error(500, "Search messages is not supported"));
|
||||||
@ -23602,7 +23611,7 @@ void MessagesManager::on_search_dialog_message_db_result(int64 random_id, Dialog
|
|||||||
for (auto &message : messages) {
|
for (auto &message : messages) {
|
||||||
auto m = on_get_message_from_database(d, message, false, "on_search_dialog_message_db_result");
|
auto m = on_get_message_from_database(d, message, false, "on_search_dialog_message_db_result");
|
||||||
if (m != nullptr && first_db_message_id <= m->message_id) {
|
if (m != nullptr && first_db_message_id <= m->message_id) {
|
||||||
if (m->message_id < next_from_message_id) {
|
if (!next_from_message_id.is_valid() || m->message_id < next_from_message_id) {
|
||||||
next_from_message_id = m->message_id;
|
next_from_message_id = m->message_id;
|
||||||
}
|
}
|
||||||
if (filter == MessageSearchFilter::UnreadMention && !m->contains_unread_mention) {
|
if (filter == MessageSearchFilter::UnreadMention && !m->contains_unread_mention) {
|
||||||
@ -23791,18 +23800,24 @@ void MessagesManager::on_message_db_calls_result(Result<MessageDbCallsResult> re
|
|||||||
|
|
||||||
auto it = found_call_messages_.find(random_id);
|
auto it = found_call_messages_.find(random_id);
|
||||||
CHECK(it != found_call_messages_.end());
|
CHECK(it != found_call_messages_.end());
|
||||||
auto &res = it->second.second;
|
auto &res = it->second.full_message_ids;
|
||||||
|
|
||||||
CHECK(!first_db_message_id.is_scheduled());
|
CHECK(!first_db_message_id.is_scheduled());
|
||||||
res.reserve(calls_result.messages.size());
|
res.reserve(calls_result.messages.size());
|
||||||
|
MessageId next_offset_message_id;
|
||||||
for (auto &message : calls_result.messages) {
|
for (auto &message : calls_result.messages) {
|
||||||
auto m = on_get_message_from_database(message, false, "on_message_db_calls_result");
|
auto m = on_get_message_from_database(message, false, "on_message_db_calls_result");
|
||||||
|
|
||||||
if (m != nullptr && first_db_message_id <= m->message_id) {
|
if (m != nullptr && first_db_message_id <= m->message_id) {
|
||||||
|
if (!next_offset_message_id.is_valid() || m->message_id < next_offset_message_id) {
|
||||||
|
next_offset_message_id = m->message_id;
|
||||||
|
}
|
||||||
res.emplace_back(message.dialog_id, m->message_id);
|
res.emplace_back(message.dialog_id, m->message_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
it->second.first = calls_db_state_.message_count_by_index[call_message_search_filter_index(filter)];
|
it->second.total_count = calls_db_state_.message_count_by_index[call_message_search_filter_index(filter)];
|
||||||
|
if (next_offset_message_id.is_valid()) {
|
||||||
|
it->second.next_offset = PSTRING() << next_offset_message_id.get_server_message_id().get();
|
||||||
|
}
|
||||||
|
|
||||||
if (res.empty() && first_db_message_id != MessageId::min()) {
|
if (res.empty() && first_db_message_id != MessageId::min()) {
|
||||||
LOG(INFO) << "No messages found in database";
|
LOG(INFO) << "No messages found in database";
|
||||||
@ -25293,7 +25308,7 @@ void MessagesManager::send_get_message_public_forwards_query(
|
|||||||
|
|
||||||
int32 offset_date = std::numeric_limits<int32>::max();
|
int32 offset_date = std::numeric_limits<int32>::max();
|
||||||
DialogId offset_dialog_id;
|
DialogId offset_dialog_id;
|
||||||
ServerMessageId offset_message_id;
|
ServerMessageId offset_server_message_id;
|
||||||
|
|
||||||
if (!offset.empty()) {
|
if (!offset.empty()) {
|
||||||
auto parts = full_split(offset, ',');
|
auto parts = full_split(offset, ',');
|
||||||
@ -25302,18 +25317,18 @@ void MessagesManager::send_get_message_public_forwards_query(
|
|||||||
}
|
}
|
||||||
auto r_offset_date = to_integer_safe<int32>(parts[0]);
|
auto r_offset_date = to_integer_safe<int32>(parts[0]);
|
||||||
auto r_offset_dialog_id = to_integer_safe<int64>(parts[1]);
|
auto r_offset_dialog_id = to_integer_safe<int64>(parts[1]);
|
||||||
auto r_offset_message_id = to_integer_safe<int32>(parts[2]);
|
auto r_offset_server_message_id = to_integer_safe<int32>(parts[2]);
|
||||||
if (r_offset_date.is_error() || r_offset_dialog_id.is_error() || r_offset_message_id.is_error()) {
|
if (r_offset_date.is_error() || r_offset_dialog_id.is_error() || r_offset_server_message_id.is_error()) {
|
||||||
return promise.set_error(Status::Error(400, "Invalid offset specified"));
|
return promise.set_error(Status::Error(400, "Invalid offset specified"));
|
||||||
}
|
}
|
||||||
|
|
||||||
offset_date = r_offset_date.ok();
|
offset_date = r_offset_date.ok();
|
||||||
offset_dialog_id = DialogId(r_offset_dialog_id.ok());
|
offset_dialog_id = DialogId(r_offset_dialog_id.ok());
|
||||||
offset_message_id = ServerMessageId(r_offset_message_id.ok());
|
offset_server_message_id = ServerMessageId(r_offset_server_message_id.ok());
|
||||||
}
|
}
|
||||||
|
|
||||||
td_->create_handler<GetMessagePublicForwardsQuery>(std::move(promise))
|
td_->create_handler<GetMessagePublicForwardsQuery>(std::move(promise))
|
||||||
->send(dc_id, full_message_id, offset_date, offset_dialog_id, offset_message_id, limit);
|
->send(dc_id, full_message_id, offset_date, offset_dialog_id, offset_server_message_id, limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<int32> MessagesManager::get_message_schedule_date(
|
Result<int32> MessagesManager::get_message_schedule_date(
|
||||||
|
@ -779,8 +779,8 @@ class MessagesManager final : public Actor {
|
|||||||
int32 limit, MessageSearchFilter filter, int32 min_date, int32 max_date,
|
int32 limit, MessageSearchFilter filter, int32 min_date, int32 max_date,
|
||||||
int64 &random_id, Promise<Unit> &&promise);
|
int64 &random_id, Promise<Unit> &&promise);
|
||||||
|
|
||||||
std::pair<int32, vector<FullMessageId>> search_call_messages(MessageId from_message_id, int32 limit, bool only_missed,
|
FoundMessages search_call_messages(const string &offset, int32 limit, bool only_missed, int64 &random_id, bool use_db,
|
||||||
int64 &random_id, bool use_db, Promise<Unit> &&promise);
|
Promise<Unit> &&promise);
|
||||||
|
|
||||||
void search_outgoing_document_messages(const string &query, int32 limit,
|
void search_outgoing_document_messages(const string &query, int32 limit,
|
||||||
Promise<td_api::object_ptr<td_api::foundMessages>> &&promise);
|
Promise<td_api::object_ptr<td_api::foundMessages>> &&promise);
|
||||||
@ -3559,8 +3559,7 @@ class MessagesManager final : public Actor {
|
|||||||
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_messages_; // random_id -> FoundMessages
|
||||||
FlatHashMap<int64, std::pair<int32, vector<FullMessageId>>>
|
FlatHashMap<int64, FoundMessages> found_call_messages_; // random_id -> FoundMessages
|
||||||
found_call_messages_; // random_id -> [total_count, [full_message_id]...]
|
|
||||||
|
|
||||||
FlatHashMap<int64, FoundMessages> found_fts_messages_; // random_id -> FoundMessages
|
FlatHashMap<int64, FoundMessages> found_fts_messages_; // random_id -> FoundMessages
|
||||||
|
|
||||||
|
@ -1465,27 +1465,26 @@ class SearchMessagesRequest final : public RequestActor<> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
class SearchCallMessagesRequest final : public RequestActor<> {
|
class SearchCallMessagesRequest final : public RequestActor<> {
|
||||||
MessageId from_message_id_;
|
string offset_;
|
||||||
int32 limit_;
|
int32 limit_;
|
||||||
bool only_missed_;
|
bool only_missed_;
|
||||||
int64 random_id_;
|
int64 random_id_;
|
||||||
|
|
||||||
std::pair<int32, vector<FullMessageId>> messages_;
|
MessagesManager::FoundMessages messages_;
|
||||||
|
|
||||||
void do_run(Promise<Unit> &&promise) final {
|
void do_run(Promise<Unit> &&promise) final {
|
||||||
messages_ = td_->messages_manager_->search_call_messages(from_message_id_, limit_, only_missed_, random_id_,
|
messages_ = td_->messages_manager_->search_call_messages(offset_, limit_, only_missed_, random_id_,
|
||||||
get_tries() == 3, std::move(promise));
|
get_tries() == 3, std::move(promise));
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_send_result() final {
|
void do_send_result() final {
|
||||||
send_result(td_->messages_manager_->get_messages_object(messages_.first, messages_.second, true,
|
send_result(td_->messages_manager_->get_found_messages_object(messages_, "SearchCallMessagesRequest"));
|
||||||
"SearchCallMessagesRequest"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SearchCallMessagesRequest(ActorShared<Td> td, uint64 request_id, int64 from_message_id, int32 limit, bool only_missed)
|
SearchCallMessagesRequest(ActorShared<Td> td, uint64 request_id, string offset, int32 limit, bool only_missed)
|
||||||
: RequestActor(std::move(td), request_id)
|
: RequestActor(std::move(td), request_id)
|
||||||
, from_message_id_(from_message_id)
|
, offset_(std::move(offset))
|
||||||
, limit_(limit)
|
, limit_(limit)
|
||||||
, only_missed_(only_missed)
|
, only_missed_(only_missed)
|
||||||
, random_id_(0) {
|
, random_id_(0) {
|
||||||
@ -5165,7 +5164,7 @@ void Td::on_request(uint64 id, td_api::searchMessages &request) {
|
|||||||
|
|
||||||
void Td::on_request(uint64 id, const td_api::searchCallMessages &request) {
|
void Td::on_request(uint64 id, const td_api::searchCallMessages &request) {
|
||||||
CHECK_IS_USER();
|
CHECK_IS_USER();
|
||||||
CREATE_REQUEST(SearchCallMessagesRequest, request.from_message_id_, request.limit_, request.only_missed_);
|
CREATE_REQUEST(SearchCallMessagesRequest, std::move(request.offset_), request.limit_, request.only_missed_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Td::on_request(uint64 id, td_api::searchOutgoingDocumentMessages &request) {
|
void Td::on_request(uint64 id, td_api::searchOutgoingDocumentMessages &request) {
|
||||||
|
@ -2360,10 +2360,10 @@ class CliClient final : public Actor {
|
|||||||
chat_id, "", nullptr, offset_message_id, offset, as_limit(limit), as_search_messages_filter(filter), 0));
|
chat_id, "", nullptr, offset_message_id, offset, as_limit(limit), as_search_messages_filter(filter), 0));
|
||||||
} else if (op == "SC") {
|
} else if (op == "SC") {
|
||||||
string limit;
|
string limit;
|
||||||
MessageId offset_message_id;
|
string offset;
|
||||||
bool only_missed;
|
bool only_missed;
|
||||||
get_args(args, limit, offset_message_id, only_missed);
|
get_args(args, limit, offset, only_missed);
|
||||||
send_request(td_api::make_object<td_api::searchCallMessages>(offset_message_id, as_limit(limit), only_missed));
|
send_request(td_api::make_object<td_api::searchCallMessages>(offset, as_limit(limit), only_missed));
|
||||||
} else if (op == "sodm") {
|
} else if (op == "sodm") {
|
||||||
SearchQuery query;
|
SearchQuery query;
|
||||||
get_args(args, query);
|
get_args(args, query);
|
||||||
|
Loading…
Reference in New Issue
Block a user