Skip to content

Commit

Permalink
Move search_among_dialogs to DialogParticipantManager.
Browse files Browse the repository at this point in the history
  • Loading branch information
levlam committed Mar 2, 2024
1 parent 958f6dd commit 1e8e2fc
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 43 deletions.
36 changes: 0 additions & 36 deletions td/telegram/ContactsManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16360,42 +16360,6 @@ void ContactsManager::on_update_secret_chat(SecretChatId secret_chat_id, int64 a
update_secret_chat(secret_chat, secret_chat_id);
}

std::pair<int32, vector<DialogId>> ContactsManager::search_among_dialogs(const vector<DialogId> &dialog_ids,
const string &query, int32 limit) const {
Hints hints; // TODO cache Hints

auto unix_time = G()->unix_time();
for (auto dialog_id : dialog_ids) {
int64 rating = 0;
if (dialog_id.get_type() == DialogType::User) {
auto user_id = dialog_id.get_user_id();
auto u = get_user(user_id);
if (u == nullptr) {
continue;
}
if (query.empty()) {
hints.add(dialog_id.get(), Slice(" "));
} else {
hints.add(dialog_id.get(), get_user_search_text(u));
}
rating = -get_user_was_online(u, user_id, unix_time);
} else {
if (!td_->dialog_manager_->have_dialog_info(dialog_id)) {
continue;
}
if (query.empty()) {
hints.add(dialog_id.get(), Slice(" "));
} else {
hints.add(dialog_id.get(), td_->dialog_manager_->get_dialog_search_text(dialog_id));
}
}
hints.set_rating(dialog_id.get(), rating);
}

auto result = hints.search(query, limit, true);
return {narrow_cast<int32>(result.first), transform(result.second, [](int64 key) { return DialogId(key); })};
}

void ContactsManager::get_chat_participant(ChatId chat_id, UserId user_id, Promise<DialogParticipant> &&promise) {
LOG(INFO) << "Trying to get " << user_id << " as member of " << chat_id;

Expand Down
3 changes: 0 additions & 3 deletions td/telegram/ContactsManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -668,9 +668,6 @@ class ContactsManager final : public Actor {
void speculative_add_channel_user(ChannelId channel_id, UserId user_id, const DialogParticipantStatus &new_status,
const DialogParticipantStatus &old_status);

std::pair<int32, vector<DialogId>> search_among_dialogs(const vector<DialogId> &dialog_ids, const string &query,
int32 limit) const;

int64 get_user_id_object(UserId user_id, const char *source) const;

tl_object_ptr<td_api::user> get_user_object(UserId user_id) const;
Expand Down
33 changes: 29 additions & 4 deletions td/telegram/DialogParticipantManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include "td/utils/buffer.h"
#include "td/utils/FlatHashSet.h"
#include "td/utils/format.h"
#include "td/utils/Hints.h"
#include "td/utils/logging.h"
#include "td/utils/misc.h"
#include "td/utils/SliceBuilder.h"
Expand All @@ -40,7 +41,6 @@

#include <algorithm>
#include <limits>
#include <utility>

namespace td {

Expand Down Expand Up @@ -1654,6 +1654,31 @@ void DialogParticipantManager::finish_get_channel_participant(ChannelId channel_
promise.set_value(std::move(dialog_participant));
}

std::pair<int32, vector<DialogId>> DialogParticipantManager::search_among_dialogs(const vector<DialogId> &dialog_ids,
const string &query,
int32 limit) const {
Hints hints;

auto unix_time = G()->unix_time();
for (auto dialog_id : dialog_ids) {
if (!td_->dialog_manager_->have_dialog_info(dialog_id)) {
continue;
}
if (query.empty()) {
hints.add(dialog_id.get(), Slice(" "));
} else {
hints.add(dialog_id.get(), td_->dialog_manager_->get_dialog_search_text(dialog_id));
}
if (dialog_id.get_type() == DialogType::User) {
hints.set_rating(dialog_id.get(),
-td_->contacts_manager_->get_user_was_online(dialog_id.get_user_id(), unix_time));
}
}

auto result = hints.search(query, limit, true);
return {narrow_cast<int32>(result.first), transform(result.second, [](int64 key) { return DialogId(key); })};
}

DialogParticipants DialogParticipantManager::search_private_chat_participants(UserId peer_user_id, const string &query,
int32 limit,
DialogParticipantFilter filter) const {
Expand All @@ -1667,7 +1692,7 @@ DialogParticipants DialogParticipantManager::search_private_chat_participants(Us
dialog_ids.push_back(DialogId(peer_user_id));
}

auto result = td_->contacts_manager_->search_among_dialogs(dialog_ids, query, limit);
auto result = search_among_dialogs(dialog_ids, query, limit);
return {result.first, transform(result.second, [&](DialogId dialog_id) {
auto user_id = dialog_id.get_user_id();
return DialogParticipant::private_member(user_id, user_id == my_user_id ? peer_user_id : my_user_id);
Expand Down Expand Up @@ -1711,7 +1736,7 @@ void DialogParticipantManager::do_search_chat_participants(ChatId chat_id, const
}

int32 total_count;
std::tie(total_count, dialog_ids) = td_->contacts_manager_->search_among_dialogs(dialog_ids, query, limit);
std::tie(total_count, dialog_ids) = search_among_dialogs(dialog_ids, query, limit);
td_->contacts_manager_->on_view_dialog_active_stories(dialog_ids);
vector<DialogParticipant> dialog_participants;
for (auto dialog_id : dialog_ids) {
Expand Down Expand Up @@ -1886,7 +1911,7 @@ void DialogParticipantManager::on_get_channel_participants(
if (!additional_query.empty()) {
auto dialog_ids = transform(result, [](const DialogParticipant &participant) { return participant.dialog_id_; });
std::pair<int32, vector<DialogId>> result_dialog_ids =
td_->contacts_manager_->search_among_dialogs(dialog_ids, additional_query, additional_limit);
search_among_dialogs(dialog_ids, additional_query, additional_limit);

total_count = result_dialog_ids.first;
FlatHashSet<DialogId, DialogIdHash> result_dialog_ids_set;
Expand Down
5 changes: 5 additions & 0 deletions td/telegram/DialogParticipantManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
#include "td/utils/Promise.h"
#include "td/utils/Status.h"

#include <utility>

namespace td {

class ChannelParticipantFilter;
Expand Down Expand Up @@ -190,6 +192,9 @@ class DialogParticipantManager final : public Actor {
void finish_get_channel_participant(ChannelId channel_id, DialogParticipant &&dialog_participant,
Promise<DialogParticipant> &&promise);

std::pair<int32, vector<DialogId>> search_among_dialogs(const vector<DialogId> &dialog_ids, const string &query,
int32 limit) const;

DialogParticipants search_private_chat_participants(UserId peer_user_id, const string &query, int32 limit,
DialogParticipantFilter filter) const;

Expand Down

0 comments on commit 1e8e2fc

Please sign in to comment.