Add td_api::searchChatsOnServer request.
GitOrigin-RevId: 6fc14c6503adcd8146de5eba276280bbd867b809
This commit is contained in:
parent
5445d920b1
commit
57816d2b5f
|
@ -2026,6 +2026,9 @@ searchPublicChats query:string = Chats;
|
||||||
//@description Searches for the specified query in the title and username of already known chats, this is an offline request. Returns chats in the order seen in the chat list @query Query to search for. If the query is empty, returns up to 20 recently found chats @limit Maximum number of chats to be returned
|
//@description Searches for the specified query in the title and username of already known chats, this is an offline request. Returns chats in the order seen in the chat list @query Query to search for. If the query is empty, returns up to 20 recently found chats @limit Maximum number of chats to be returned
|
||||||
searchChats query:string limit:int32 = Chats;
|
searchChats query:string limit:int32 = Chats;
|
||||||
|
|
||||||
|
//@description Searches for the specified query in the title and username of already known chats via request to the server. Returns chats in the order seen in the chat list @query Query to search for @limit Maximum number of chats to be returned
|
||||||
|
searchChatsOnServer query:string limit:int32 = Chats;
|
||||||
|
|
||||||
//@description Returns a list of frequently used chats. Supported only if the chat info database is enabled @category Category of chats to be returned @limit Maximum number of chats to be returned; up to 30
|
//@description Returns a list of frequently used chats. Supported only if the chat info database is enabled @category Category of chats to be returned @limit Maximum number of chats to be returned; up to 30
|
||||||
getTopChats category:TopChatCategory limit:int32 = Chats;
|
getTopChats category:TopChatCategory limit:int32 = Chats;
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -484,7 +484,8 @@ class SearchPublicDialogsQuery : public Td::ResultHandler {
|
||||||
LOG(INFO) << "Receive result for SearchPublicDialogsQuery " << to_string(dialogs);
|
LOG(INFO) << "Receive result for SearchPublicDialogsQuery " << to_string(dialogs);
|
||||||
td->contacts_manager_->on_get_chats(std::move(dialogs->chats_));
|
td->contacts_manager_->on_get_chats(std::move(dialogs->chats_));
|
||||||
td->contacts_manager_->on_get_users(std::move(dialogs->users_));
|
td->contacts_manager_->on_get_users(std::move(dialogs->users_));
|
||||||
td->messages_manager_->on_get_public_dialogs_search_result(query_, std::move(dialogs->results_));
|
td->messages_manager_->on_get_public_dialogs_search_result(query_, std::move(dialogs->my_results_),
|
||||||
|
std::move(dialogs->results_));
|
||||||
}
|
}
|
||||||
|
|
||||||
void on_error(uint64 id, Status status) override {
|
void on_error(uint64 id, Status status) override {
|
||||||
|
@ -6475,7 +6476,21 @@ void MessagesManager::on_get_history(DialogId dialog_id, MessageId from_message_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vector<DialogId> MessagesManager::get_peers_dialog_ids(vector<tl_object_ptr<telegram_api::Peer>> &&peers) {
|
||||||
|
vector<DialogId> result;
|
||||||
|
result.reserve(peers.size());
|
||||||
|
for (auto &peer : peers) {
|
||||||
|
DialogId dialog_id(peer);
|
||||||
|
if (dialog_id.is_valid()) {
|
||||||
|
force_create_dialog(dialog_id, "get_peers_dialog_ids");
|
||||||
|
result.push_back(dialog_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void MessagesManager::on_get_public_dialogs_search_result(const string &query,
|
void MessagesManager::on_get_public_dialogs_search_result(const string &query,
|
||||||
|
vector<tl_object_ptr<telegram_api::Peer>> &&my_peers,
|
||||||
vector<tl_object_ptr<telegram_api::Peer>> &&peers) {
|
vector<tl_object_ptr<telegram_api::Peer>> &&peers) {
|
||||||
auto it = search_public_dialogs_queries_.find(query);
|
auto it = search_public_dialogs_queries_.find(query);
|
||||||
CHECK(it != search_public_dialogs_queries_.end());
|
CHECK(it != search_public_dialogs_queries_.end());
|
||||||
|
@ -6483,17 +6498,8 @@ void MessagesManager::on_get_public_dialogs_search_result(const string &query,
|
||||||
auto promises = std::move(it->second);
|
auto promises = std::move(it->second);
|
||||||
search_public_dialogs_queries_.erase(it);
|
search_public_dialogs_queries_.erase(it);
|
||||||
|
|
||||||
vector<DialogId> result;
|
found_public_dialogs_[query] = get_peers_dialog_ids(std::move(peers));
|
||||||
result.reserve(peers.size());
|
found_on_server_dialogs_[query] = get_peers_dialog_ids(std::move(my_peers));
|
||||||
for (auto &peer : peers) {
|
|
||||||
DialogId dialog_id(peer);
|
|
||||||
if (dialog_id.is_valid()) {
|
|
||||||
force_create_dialog(dialog_id, "public dialogs search");
|
|
||||||
result.push_back(dialog_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
found_public_dialogs_[query] = std::move(result);
|
|
||||||
|
|
||||||
for (auto &promise : promises) {
|
for (auto &promise : promises) {
|
||||||
promise.set_value(Unit());
|
promise.set_value(Unit());
|
||||||
|
@ -6507,7 +6513,8 @@ void MessagesManager::on_failed_public_dialogs_search(const string &query, Statu
|
||||||
auto promises = std::move(it->second);
|
auto promises = std::move(it->second);
|
||||||
search_public_dialogs_queries_.erase(it);
|
search_public_dialogs_queries_.erase(it);
|
||||||
|
|
||||||
found_public_dialogs_[query]; // negative cache
|
found_public_dialogs_[query]; // negative cache
|
||||||
|
found_on_server_dialogs_[query]; // negative cache
|
||||||
|
|
||||||
for (auto &promise : promises) {
|
for (auto &promise : promises) {
|
||||||
promise.set_error(error.clone());
|
promise.set_error(error.clone());
|
||||||
|
@ -10559,6 +10566,47 @@ std::pair<size_t, vector<DialogId>> MessagesManager::search_dialogs(const string
|
||||||
return {result.first, std::move(dialog_ids)};
|
return {result.first, std::move(dialog_ids)};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vector<DialogId> MessagesManager::sort_dialogs_by_order(const vector<DialogId> &dialog_ids, int32 limit) const {
|
||||||
|
auto dialog_dates = transform(dialog_ids, [this](auto dialog_id) {
|
||||||
|
const Dialog *d = this->get_dialog(dialog_id);
|
||||||
|
CHECK(d != nullptr);
|
||||||
|
return DialogDate(d->order, dialog_id);
|
||||||
|
});
|
||||||
|
if (static_cast<size_t>(limit) >= dialog_dates.size()) {
|
||||||
|
std::sort(dialog_dates.begin(), dialog_dates.end());
|
||||||
|
} else {
|
||||||
|
std::partial_sort(dialog_dates.begin(), dialog_dates.begin() + limit, dialog_dates.end());
|
||||||
|
dialog_dates.resize(limit, MAX_DIALOG_DATE);
|
||||||
|
}
|
||||||
|
return transform(dialog_dates, [](auto dialog_date) { return dialog_date.get_dialog_id(); });
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<DialogId> MessagesManager::search_dialogs_on_server(const string &query, int32 limit, Promise<Unit> &&promise) {
|
||||||
|
LOG(INFO) << "Search chats on server with query \"" << query << "\" and limit " << limit;
|
||||||
|
|
||||||
|
if (limit < 0) {
|
||||||
|
promise.set_error(Status::Error(400, "Limit must be non-negative"));
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
if (limit > MAX_GET_DIALOGS) {
|
||||||
|
limit = MAX_GET_DIALOGS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (query.empty()) {
|
||||||
|
promise.set_value(Unit());
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
auto it = found_on_server_dialogs_.find(query);
|
||||||
|
if (it != found_on_server_dialogs_.end()) {
|
||||||
|
promise.set_value(Unit());
|
||||||
|
return sort_dialogs_by_order(it->second, limit);
|
||||||
|
}
|
||||||
|
|
||||||
|
send_search_public_dialogs_query(query, std::move(promise));
|
||||||
|
return vector<DialogId>();
|
||||||
|
}
|
||||||
|
|
||||||
vector<DialogId> MessagesManager::get_common_dialogs(UserId user_id, DialogId offset_dialog_id, int32 limit, bool force,
|
vector<DialogId> MessagesManager::get_common_dialogs(UserId user_id, DialogId offset_dialog_id, int32 limit, bool force,
|
||||||
Promise<Unit> &&promise) {
|
Promise<Unit> &&promise) {
|
||||||
if (!td_->contacts_manager_->have_input_user(user_id)) {
|
if (!td_->contacts_manager_->have_input_user(user_id)) {
|
||||||
|
|
|
@ -850,7 +850,8 @@ class MessagesManager : public Actor {
|
||||||
void on_get_history(DialogId dialog_id, MessageId from_message_id, int32 offset, int32 limit, bool from_the_end,
|
void on_get_history(DialogId dialog_id, MessageId from_message_id, int32 offset, int32 limit, bool from_the_end,
|
||||||
vector<tl_object_ptr<telegram_api::Message>> &&messages);
|
vector<tl_object_ptr<telegram_api::Message>> &&messages);
|
||||||
|
|
||||||
void on_get_public_dialogs_search_result(const string &query, vector<tl_object_ptr<telegram_api::Peer>> &&peers);
|
void on_get_public_dialogs_search_result(const string &query, vector<tl_object_ptr<telegram_api::Peer>> &&my_peers,
|
||||||
|
vector<tl_object_ptr<telegram_api::Peer>> &&peers);
|
||||||
void on_failed_public_dialogs_search(const string &query, Status &&error);
|
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, UserId sender_user_id,
|
||||||
|
@ -1090,6 +1091,8 @@ class MessagesManager : public Actor {
|
||||||
|
|
||||||
std::pair<size_t, vector<DialogId>> search_dialogs(const string &query, int32 limit, Promise<Unit> &&promise);
|
std::pair<size_t, vector<DialogId>> search_dialogs(const string &query, int32 limit, Promise<Unit> &&promise);
|
||||||
|
|
||||||
|
vector<DialogId> search_dialogs_on_server(const string &query, int32 limit, Promise<Unit> &&promise);
|
||||||
|
|
||||||
vector<DialogId> get_common_dialogs(UserId user_id, DialogId offset_dialog_id, int32 limit, bool force,
|
vector<DialogId> get_common_dialogs(UserId user_id, DialogId offset_dialog_id, int32 limit, bool force,
|
||||||
Promise<Unit> &&promise);
|
Promise<Unit> &&promise);
|
||||||
|
|
||||||
|
@ -2054,6 +2057,10 @@ class MessagesManager : public Actor {
|
||||||
static tl_object_ptr<td_api::messages> get_messages_object(int32 total_count,
|
static tl_object_ptr<td_api::messages> get_messages_object(int32 total_count,
|
||||||
vector<tl_object_ptr<td_api::message>> &&messages);
|
vector<tl_object_ptr<td_api::message>> &&messages);
|
||||||
|
|
||||||
|
vector<DialogId> sort_dialogs_by_order(const vector<DialogId> &dialog_ids, int32 limit) const;
|
||||||
|
|
||||||
|
vector<DialogId> get_peers_dialog_ids(vector<tl_object_ptr<telegram_api::Peer>> &&peers);
|
||||||
|
|
||||||
void set_dialog_last_read_inbox_message_id(Dialog *d, MessageId message_id, int32 server_unread_count,
|
void set_dialog_last_read_inbox_message_id(Dialog *d, MessageId message_id, int32 server_unread_count,
|
||||||
int32 local_unread_count, bool force_update, const char *source);
|
int32 local_unread_count, bool force_update, const char *source);
|
||||||
|
|
||||||
|
@ -2513,7 +2520,8 @@ class MessagesManager : public Actor {
|
||||||
postponed_get_message_requests_;
|
postponed_get_message_requests_;
|
||||||
|
|
||||||
std::unordered_map<string, vector<Promise<Unit>>> search_public_dialogs_queries_;
|
std::unordered_map<string, vector<Promise<Unit>>> search_public_dialogs_queries_;
|
||||||
std::unordered_map<string, vector<DialogId>> found_public_dialogs_; // TODO time bound cache
|
std::unordered_map<string, vector<DialogId>> found_public_dialogs_; // TODO time bound cache
|
||||||
|
std::unordered_map<string, vector<DialogId>> found_on_server_dialogs_; // TODO time bound cache
|
||||||
|
|
||||||
std::unordered_map<UserId, vector<DialogId>, UserIdHash> found_common_dialogs_; // TODO time bound cache
|
std::unordered_map<UserId, vector<DialogId>, UserIdHash> found_common_dialogs_; // TODO time bound cache
|
||||||
|
|
||||||
|
|
|
@ -908,6 +908,26 @@ class SearchChatsRequest : public RequestActor<> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class SearchChatsOnServerRequest : public RequestActor<> {
|
||||||
|
string query_;
|
||||||
|
int32 limit_;
|
||||||
|
|
||||||
|
vector<DialogId> dialog_ids_;
|
||||||
|
|
||||||
|
void do_run(Promise<Unit> &&promise) override {
|
||||||
|
dialog_ids_ = td->messages_manager_->search_dialogs_on_server(query_, limit_, std::move(promise));
|
||||||
|
}
|
||||||
|
|
||||||
|
void do_send_result() override {
|
||||||
|
send_result(MessagesManager::get_chats_object(dialog_ids_));
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
SearchChatsOnServerRequest(ActorShared<Td> td, uint64 request_id, string query, int32 limit)
|
||||||
|
: RequestActor(std::move(td), request_id), query_(std::move(query)), limit_(limit) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class GetGroupsInCommonRequest : public RequestActor<> {
|
class GetGroupsInCommonRequest : public RequestActor<> {
|
||||||
UserId user_id_;
|
UserId user_id_;
|
||||||
DialogId offset_dialog_id_;
|
DialogId offset_dialog_id_;
|
||||||
|
@ -4961,6 +4981,13 @@ void Td::on_request(uint64 id, td_api::searchChats &request) {
|
||||||
CREATE_REQUEST(SearchChatsRequest, request.query_, request.limit_);
|
CREATE_REQUEST(SearchChatsRequest, request.query_, request.limit_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Td::on_request(uint64 id, td_api::searchChatsOnServer &request) {
|
||||||
|
CHECK_AUTH();
|
||||||
|
CHECK_IS_USER();
|
||||||
|
CLEAN_INPUT_STRING(request.query_);
|
||||||
|
CREATE_REQUEST(SearchChatsOnServerRequest, request.query_, request.limit_);
|
||||||
|
}
|
||||||
|
|
||||||
void Td::on_request(uint64 id, const td_api::getGroupsInCommon &request) {
|
void Td::on_request(uint64 id, const td_api::getGroupsInCommon &request) {
|
||||||
CHECK_AUTH();
|
CHECK_AUTH();
|
||||||
CHECK_IS_USER();
|
CHECK_IS_USER();
|
||||||
|
|
|
@ -396,6 +396,8 @@ class Td final : public NetQueryCallback {
|
||||||
|
|
||||||
void on_request(uint64 id, td_api::searchChats &request);
|
void on_request(uint64 id, td_api::searchChats &request);
|
||||||
|
|
||||||
|
void on_request(uint64 id, td_api::searchChatsOnServer &request);
|
||||||
|
|
||||||
void on_request(uint64 id, const td_api::addRecentlyFoundChat &request);
|
void on_request(uint64 id, const td_api::addRecentlyFoundChat &request);
|
||||||
|
|
||||||
void on_request(uint64 id, const td_api::removeRecentlyFoundChat &request);
|
void on_request(uint64 id, const td_api::removeRecentlyFoundChat &request);
|
||||||
|
|
|
@ -2588,6 +2588,11 @@ class CliClient final : public Actor {
|
||||||
string query;
|
string query;
|
||||||
std::tie(limit, query) = split(args);
|
std::tie(limit, query) = split(args);
|
||||||
send_request(make_tl_object<td_api::searchChats>(query, to_integer<int32>(limit)));
|
send_request(make_tl_object<td_api::searchChats>(query, to_integer<int32>(limit)));
|
||||||
|
} else if (op == "scos") {
|
||||||
|
string limit;
|
||||||
|
string query;
|
||||||
|
std::tie(limit, query) = split(args);
|
||||||
|
send_request(make_tl_object<td_api::searchChatsOnServer>(query, to_integer<int32>(limit)));
|
||||||
} else if (op == "sco") {
|
} else if (op == "sco") {
|
||||||
string limit;
|
string limit;
|
||||||
string query;
|
string query;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user