mirror of
https://github.com/vale981/tdesktop
synced 2025-03-06 02:01:40 -05:00
Use server-side my_results in contacts.search.
This commit is contained in:
parent
4527c03c0d
commit
840b42934b
13 changed files with 224 additions and 93 deletions
|
@ -35,6 +35,7 @@ namespace {
|
|||
constexpr auto kMaxGroupChannelTitle = 255;
|
||||
constexpr auto kMaxChannelDescription = 255;
|
||||
constexpr auto kMaxBioLength = 70;
|
||||
constexpr auto kMinUsernameLength = 5;
|
||||
|
||||
style::InputField CreateBioFieldStyle() {
|
||||
auto result = st::newGroupDescription;
|
||||
|
@ -767,7 +768,7 @@ void SetupChannelBox::onChange() {
|
|||
return;
|
||||
}
|
||||
}
|
||||
if (name.size() < MinUsernameLength) {
|
||||
if (name.size() < kMinUsernameLength) {
|
||||
if (_errorText != lang(lng_create_channel_link_too_short)) {
|
||||
_errorText = lang(lng_create_channel_link_too_short);
|
||||
update();
|
||||
|
@ -788,9 +789,14 @@ void SetupChannelBox::onCheck() {
|
|||
MTP::cancel(_checkRequestId);
|
||||
}
|
||||
QString link = _link->text().trimmed();
|
||||
if (link.size() >= MinUsernameLength) {
|
||||
if (link.size() >= kMinUsernameLength) {
|
||||
_checkUsername = link;
|
||||
_checkRequestId = MTP::send(MTPchannels_CheckUsername(_channel->inputChannel, MTP_string(link)), rpcDone(&SetupChannelBox::onCheckDone), rpcFail(&SetupChannelBox::onCheckFail));
|
||||
_checkRequestId = MTP::send(
|
||||
MTPchannels_CheckUsername(
|
||||
_channel->inputChannel,
|
||||
MTP_string(link)),
|
||||
rpcDone(&SetupChannelBox::onCheckDone),
|
||||
rpcFail(&SetupChannelBox::onCheckFail));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -149,7 +149,7 @@ void PeerListGlobalSearchController::searchQuery(const QString &query) {
|
|||
if (_query != query) {
|
||||
_query = query;
|
||||
_requestId = 0;
|
||||
if (_query.size() >= MinUsernameLength && !searchInCache()) {
|
||||
if (!_query.isEmpty() && !searchInCache()) {
|
||||
_timer.callOnce(AutoSearchTimeout);
|
||||
} else {
|
||||
_timer.cancel();
|
||||
|
@ -168,9 +168,12 @@ bool PeerListGlobalSearchController::searchInCache() {
|
|||
}
|
||||
|
||||
void PeerListGlobalSearchController::searchOnServer() {
|
||||
_requestId = request(MTPcontacts_Search(MTP_string(_query), MTP_int(SearchPeopleLimit))).done([this](const MTPcontacts_Found &result, mtpRequestId requestId) {
|
||||
_requestId = request(MTPcontacts_Search(
|
||||
MTP_string(_query),
|
||||
MTP_int(SearchPeopleLimit)
|
||||
)).done([=](const MTPcontacts_Found &result, mtpRequestId requestId) {
|
||||
searchDone(result, requestId);
|
||||
}).fail([this](const RPCError &error, mtpRequestId requestId) {
|
||||
}).fail([=](const RPCError &error, mtpRequestId requestId) {
|
||||
if (_requestId == requestId) {
|
||||
_requestId = 0;
|
||||
delegate()->peerListSearchRefreshRows();
|
||||
|
@ -179,7 +182,9 @@ void PeerListGlobalSearchController::searchOnServer() {
|
|||
_queries.emplace(_requestId, _query);
|
||||
}
|
||||
|
||||
void PeerListGlobalSearchController::searchDone(const MTPcontacts_Found &result, mtpRequestId requestId) {
|
||||
void PeerListGlobalSearchController::searchDone(
|
||||
const MTPcontacts_Found &result,
|
||||
mtpRequestId requestId) {
|
||||
Expects(result.type() == mtpc_contacts_found);
|
||||
|
||||
auto &contacts = result.c_contacts_found();
|
||||
|
@ -194,13 +199,17 @@ void PeerListGlobalSearchController::searchDone(const MTPcontacts_Found &result,
|
|||
_queries.erase(it);
|
||||
}
|
||||
}
|
||||
if (_requestId == requestId) {
|
||||
_requestId = 0;
|
||||
for_const (auto &mtpPeer, contacts.vresults.v) {
|
||||
if (auto peer = App::peerLoaded(peerFromMTP(mtpPeer))) {
|
||||
const auto feedList = [&](const MTPVector<MTPPeer> &list) {
|
||||
for (const auto &mtpPeer : list.v) {
|
||||
if (const auto peer = App::peerLoaded(peerFromMTP(mtpPeer))) {
|
||||
delegate()->peerListSearchAddRow(peer);
|
||||
}
|
||||
}
|
||||
};
|
||||
if (_requestId == requestId) {
|
||||
_requestId = 0;
|
||||
feedList(contacts.vmy_results);
|
||||
feedList(contacts.vresults);
|
||||
delegate()->peerListSearchRefreshRows();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,6 +37,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|||
namespace {
|
||||
|
||||
constexpr auto kUsernameCheckTimeout = TimeMs(200);
|
||||
constexpr auto kMinUsernameLength = 5;
|
||||
|
||||
class Controller
|
||||
: private MTP::Sender
|
||||
|
@ -503,7 +504,7 @@ void Controller::checkUsernameAvailability() {
|
|||
auto checking = initial
|
||||
? qsl(".bad.")
|
||||
: _controls.username->getLastText().trimmed();
|
||||
if (checking.size() < MinUsernameLength) {
|
||||
if (checking.size() < kMinUsernameLength) {
|
||||
return;
|
||||
}
|
||||
if (_checkUsernameRequestId) {
|
||||
|
@ -580,7 +581,7 @@ void Controller::usernameChanged() {
|
|||
if (bad) {
|
||||
showUsernameError(
|
||||
Lang::Viewer(lng_create_channel_link_bad_symbols));
|
||||
} else if (username.size() < MinUsernameLength) {
|
||||
} else if (username.size() < kMinUsernameLength) {
|
||||
showUsernameError(
|
||||
Lang::Viewer(lng_create_channel_link_too_short));
|
||||
} else {
|
||||
|
|
|
@ -93,7 +93,7 @@ bool ShareBox::onSearchByUsername(bool searchCache) {
|
|||
}
|
||||
return true;
|
||||
}
|
||||
if (query.size() >= MinUsernameLength) {
|
||||
if (!query.isEmpty()) {
|
||||
if (searchCache) {
|
||||
auto i = _peopleCache.constFind(query);
|
||||
if (i != _peopleCache.cend()) {
|
||||
|
@ -105,7 +105,12 @@ bool ShareBox::onSearchByUsername(bool searchCache) {
|
|||
} else if (_peopleQuery != query) {
|
||||
_peopleQuery = query;
|
||||
_peopleFull = false;
|
||||
_peopleRequest = MTP::send(MTPcontacts_Search(MTP_string(_peopleQuery), MTP_int(SearchPeopleLimit)), rpcDone(&ShareBox::peopleReceived), rpcFail(&ShareBox::peopleFailed));
|
||||
_peopleRequest = MTP::send(
|
||||
MTPcontacts_Search(
|
||||
MTP_string(_peopleQuery),
|
||||
MTP_int(SearchPeopleLimit)),
|
||||
rpcDone(&ShareBox::peopleReceived),
|
||||
rpcFail(&ShareBox::peopleFailed));
|
||||
_peopleQueries.insert(_peopleRequest, _peopleQuery);
|
||||
}
|
||||
}
|
||||
|
@ -118,7 +123,11 @@ void ShareBox::onNeedSearchByUsername() {
|
|||
}
|
||||
}
|
||||
|
||||
void ShareBox::peopleReceived(const MTPcontacts_Found &result, mtpRequestId requestId) {
|
||||
void ShareBox::peopleReceived(
|
||||
const MTPcontacts_Found &result,
|
||||
mtpRequestId requestId) {
|
||||
Expects(result.type() == mtpc_contacts_found);
|
||||
|
||||
auto query = _peopleQuery;
|
||||
|
||||
auto i = _peopleQueries.find(requestId);
|
||||
|
@ -134,7 +143,10 @@ void ShareBox::peopleReceived(const MTPcontacts_Found &result, mtpRequestId requ
|
|||
auto &found = result.c_contacts_found();
|
||||
App::feedUsers(found.vusers);
|
||||
App::feedChats(found.vchats);
|
||||
_inner->peopleReceived(query, found.vresults.v);
|
||||
_inner->peopleReceived(
|
||||
query,
|
||||
found.vmy_results.v,
|
||||
found.vresults.v);
|
||||
} break;
|
||||
}
|
||||
|
||||
|
@ -764,33 +776,36 @@ void ShareBox::Inner::updateFilter(QString filter) {
|
|||
}
|
||||
}
|
||||
|
||||
void ShareBox::Inner::peopleReceived(const QString &query, const QVector<MTPPeer> &people) {
|
||||
void ShareBox::Inner::peopleReceived(
|
||||
const QString &query,
|
||||
const QVector<MTPPeer> &my,
|
||||
const QVector<MTPPeer> &people) {
|
||||
_lastQuery = query.toLower().trimmed();
|
||||
if (_lastQuery.at(0) == '@') _lastQuery = _lastQuery.mid(1);
|
||||
int32 already = _byUsernameFiltered.size();
|
||||
_byUsernameFiltered.reserve(already + people.size());
|
||||
d_byUsernameFiltered.reserve(already + people.size());
|
||||
for_const (auto &mtpPeer, people) {
|
||||
auto peerId = peerFromMTP(mtpPeer);
|
||||
int j = 0;
|
||||
for (; j < already; ++j) {
|
||||
if (_byUsernameFiltered[j]->id == peerId) break;
|
||||
}
|
||||
if (j == already) {
|
||||
const auto peer = App::peer(peerId);
|
||||
const auto history = App::historyLoaded(peer);
|
||||
if (!peer || !_filterCallback(peer)) {
|
||||
continue;
|
||||
} else if (history && _chatsIndexed->getRow(history)) {
|
||||
continue;
|
||||
_byUsernameFiltered.reserve(already + my.size() + people.size());
|
||||
d_byUsernameFiltered.reserve(already + my.size() + people.size());
|
||||
const auto feedList = [&](const QVector<MTPPeer> &list) {
|
||||
for (const auto &mtpPeer : list) {
|
||||
if (const auto peer = App::peerLoaded(peerFromMTP(mtpPeer))) {
|
||||
const auto history = App::historyLoaded(peer);
|
||||
if (!_filterCallback(peer)) {
|
||||
continue;
|
||||
} else if (history && _chatsIndexed->getRow(history)) {
|
||||
continue;
|
||||
} else if (base::contains(_byUsernameFiltered, peer)) {
|
||||
continue;
|
||||
}
|
||||
auto chat = new Chat(peer, [=] { repaintChat(peer); });
|
||||
updateChatName(chat, peer);
|
||||
_byUsernameFiltered.push_back(peer);
|
||||
d_byUsernameFiltered.push_back(chat);
|
||||
}
|
||||
|
||||
auto chat = new Chat(peer, [this, peer] { repaintChat(peer); });
|
||||
updateChatName(chat, peer);
|
||||
_byUsernameFiltered.push_back(peer);
|
||||
d_byUsernameFiltered.push_back(chat);
|
||||
}
|
||||
}
|
||||
};
|
||||
feedList(my);
|
||||
feedList(people);
|
||||
|
||||
_searching = false;
|
||||
refresh();
|
||||
}
|
||||
|
|
|
@ -65,7 +65,9 @@ private:
|
|||
void addPeerToMultiSelect(PeerData *peer, bool skipAnimation = false);
|
||||
void onPeerSelectedChanged(PeerData *peer, bool checked);
|
||||
|
||||
void peopleReceived(const MTPcontacts_Found &result, mtpRequestId requestId);
|
||||
void peopleReceived(
|
||||
const MTPcontacts_Found &result,
|
||||
mtpRequestId requestId);
|
||||
bool peopleFailed(const RPCError &error, mtpRequestId requestId);
|
||||
|
||||
CopyCallback _copyCallback;
|
||||
|
@ -107,7 +109,10 @@ public:
|
|||
QVector<PeerData*> selected() const;
|
||||
bool hasSelected() const;
|
||||
|
||||
void peopleReceived(const QString &query, const QVector<MTPPeer> &people);
|
||||
void peopleReceived(
|
||||
const QString &query,
|
||||
const QVector<MTPPeer> &my,
|
||||
const QVector<MTPPeer> &people);
|
||||
|
||||
void activateSkipRow(int direction);
|
||||
void activateSkipColumn(int direction);
|
||||
|
|
|
@ -17,6 +17,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|||
#include "styles/style_boxes.h"
|
||||
#include "messenger.h"
|
||||
|
||||
namespace {
|
||||
|
||||
constexpr auto kMinUsernameLength = 5;
|
||||
|
||||
} // namespace
|
||||
|
||||
UsernameBox::UsernameBox(QWidget*)
|
||||
: _username(this, st::defaultInputField, [] { return qsl("@username"); }, App::self()->username, false)
|
||||
, _link(this, QString(), st::boxLinkButton)
|
||||
|
@ -102,9 +108,13 @@ void UsernameBox::onCheck() {
|
|||
MTP::cancel(_checkRequestId);
|
||||
}
|
||||
QString name = getName();
|
||||
if (name.size() >= MinUsernameLength) {
|
||||
if (name.size() >= kMinUsernameLength) {
|
||||
_checkUsername = name;
|
||||
_checkRequestId = MTP::send(MTPaccount_CheckUsername(MTP_string(name)), rpcDone(&UsernameBox::onCheckDone), rpcFail(&UsernameBox::onCheckFail));
|
||||
_checkRequestId = MTP::send(
|
||||
MTPaccount_CheckUsername(
|
||||
MTP_string(name)),
|
||||
rpcDone(&UsernameBox::onCheckDone),
|
||||
rpcFail(&UsernameBox::onCheckFail));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -130,7 +140,7 @@ void UsernameBox::onChanged() {
|
|||
return;
|
||||
}
|
||||
}
|
||||
if (name.size() < MinUsernameLength) {
|
||||
if (name.size() < kMinUsernameLength) {
|
||||
if (_errorText != lang(lng_username_too_short)) {
|
||||
_errorText = lang(lng_username_too_short);
|
||||
update();
|
||||
|
|
|
@ -90,8 +90,6 @@ enum {
|
|||
PreloadHeightsCount = 3, // when 3 screens to scroll left make a preload request
|
||||
|
||||
SearchPeopleLimit = 5,
|
||||
MinUsernameLength = 5,
|
||||
MaxUsernameLength = 32,
|
||||
UsernameCheckTimeout = 200,
|
||||
|
||||
MaxPhotoCaption = 200,
|
||||
|
|
|
@ -318,6 +318,7 @@ void DialogsInner::paintRegion(Painter &p, const QRegion ®ion, bool paintingO
|
|||
auto to = ceilclamp(r.y() + r.height() - skip, st::dialogsRowHeight, 0, _filterResults.size());
|
||||
p.translate(0, from * st::dialogsRowHeight);
|
||||
if (from < _filterResults.size()) {
|
||||
// #TODO feeds show
|
||||
const auto activePeer = App::main()->activePeer();
|
||||
const auto activeMsgId = App::main()->activeMsgId();
|
||||
for (; from < to; ++from) {
|
||||
|
@ -1083,7 +1084,9 @@ void DialogsInner::resizeEvent(QResizeEvent *e) {
|
|||
_cancelSearchFromUser->moveToLeft(widthForCancelButton - st::dialogsSearchInSkip - _cancelSearchFromUser->width(), st::searchedBarHeight + st::dialogsSearchInHeight + st::lineWidth + (st::dialogsSearchInHeight - st::dialogsCancelSearchInPeer.height) / 2);
|
||||
}
|
||||
|
||||
void DialogsInner::onDialogRowReplaced(Dialogs::Row *oldRow, Dialogs::Row *newRow) {
|
||||
void DialogsInner::onDialogRowReplaced(
|
||||
Dialogs::Row *oldRow,
|
||||
Dialogs::Row *newRow) {
|
||||
if (_state == State::Filtered) {
|
||||
for (auto i = _filterResults.begin(); i != _filterResults.end();) {
|
||||
if (*i == oldRow) { // this row is shown in filtered and maybe is in contacts!
|
||||
|
@ -1488,6 +1491,7 @@ void DialogsInner::onFilterUpdate(QString newFilter, bool force) {
|
|||
_state = State::Filtered;
|
||||
_waitingForSearch = true;
|
||||
_filterResults.clear();
|
||||
_filterResultsGlobal.clear();
|
||||
if (!_searchInPeer && !words.isEmpty()) {
|
||||
const Dialogs::List *toFilter = nullptr;
|
||||
if (!_dialogs->isEmpty()) {
|
||||
|
@ -1771,7 +1775,7 @@ void DialogsInner::addAllSavedPeers() {
|
|||
bool DialogsInner::searchReceived(
|
||||
const QVector<MTPMessage> &messages,
|
||||
DialogsSearchRequestType type,
|
||||
int32 fullCount) {
|
||||
int fullCount) {
|
||||
if (type == DialogsSearchFromStart || type == DialogsSearchPeerFromStart) {
|
||||
clearSearchResults(false);
|
||||
}
|
||||
|
@ -1820,21 +1824,54 @@ bool DialogsInner::searchReceived(
|
|||
return lastDateFound != 0;
|
||||
}
|
||||
|
||||
void DialogsInner::peerSearchReceived(const QString &query, const QVector<MTPPeer> &result) {
|
||||
void DialogsInner::peerSearchReceived(
|
||||
const QString &query,
|
||||
const QVector<MTPPeer> &my,
|
||||
const QVector<MTPPeer> &result) {
|
||||
if (_state != State::Filtered) {
|
||||
return;
|
||||
}
|
||||
|
||||
_peerSearchQuery = query.toLower().trimmed();
|
||||
_peerSearchResults.clear();
|
||||
_peerSearchResults.reserve(result.size());
|
||||
for (auto i = result.cbegin(), e = result.cend(); i != e; ++i) {
|
||||
auto peerId = peerFromMTP(*i);
|
||||
if (auto history = App::historyLoaded(peerId)) {
|
||||
if (history->inChatList(Dialogs::Mode::All)) {
|
||||
continue; // skip existing chats
|
||||
for (const auto &mtpPeer : my) {
|
||||
if (const auto peer = App::peerLoaded(peerFromMTP(mtpPeer))) {
|
||||
if (const auto history = App::historyLoaded(peer)) {
|
||||
if (history->inChatList(Dialogs::Mode::All)) {
|
||||
continue; // skip existing chats
|
||||
}
|
||||
}
|
||||
}
|
||||
if (auto peer = App::peerLoaded(peerId)) {
|
||||
_peerSearchResults.push_back(std::make_unique<PeerSearchResult>(App::peer(peerId)));
|
||||
const auto prev = nullptr, next = nullptr;
|
||||
const auto position = 0;
|
||||
auto row = std::make_unique<Dialogs::Row>(
|
||||
App::history(peer),
|
||||
prev,
|
||||
next,
|
||||
position);
|
||||
const auto [i, ok] = _filterResultsGlobal.emplace(
|
||||
peer,
|
||||
std::move(row));
|
||||
_filterResults.push_back(i->second.get());
|
||||
} else {
|
||||
LOG(("API Error: user %1 was not loaded in DialogsInner::peopleReceived()").arg(peerId));
|
||||
LOG(("API Error: "
|
||||
"user %1 was not loaded in DialogsInner::peopleReceived()"
|
||||
).arg(peer->id));
|
||||
}
|
||||
}
|
||||
for (const auto &mtpPeer : result) {
|
||||
if (const auto peer = App::peerLoaded(peerFromMTP(mtpPeer))) {
|
||||
if (const auto history = App::historyLoaded(peer)) {
|
||||
if (history->inChatList(Dialogs::Mode::All)) {
|
||||
continue; // skip existing chats
|
||||
}
|
||||
}
|
||||
_peerSearchResults.push_back(std::make_unique<PeerSearchResult>(
|
||||
peer));
|
||||
} else {
|
||||
LOG(("API Error: "
|
||||
"user %1 was not loaded in DialogsInner::peopleReceived()"
|
||||
).arg(peer->id));
|
||||
}
|
||||
}
|
||||
refresh();
|
||||
|
@ -2007,6 +2044,7 @@ void DialogsInner::clearFilter() {
|
|||
}
|
||||
_hashtagResults.clear();
|
||||
_filterResults.clear();
|
||||
_filterResultsGlobal.clear();
|
||||
_peerSearchResults.clear();
|
||||
_searchResults.clear();
|
||||
_lastSearchDate = 0;
|
||||
|
@ -2370,6 +2408,7 @@ void DialogsInner::destroyData() {
|
|||
_hashtagResults.clear();
|
||||
_filteredSelected = -1;
|
||||
_filterResults.clear();
|
||||
_filterResultsGlobal.clear();
|
||||
_filter.clear();
|
||||
_searchedSelected = _peerSearchSelected = -1;
|
||||
clearSearchResults();
|
||||
|
|
|
@ -36,8 +36,14 @@ public:
|
|||
void dialogsReceived(const QVector<MTPDialog> &dialogs);
|
||||
void addSavedPeersAfter(const QDateTime &date);
|
||||
void addAllSavedPeers();
|
||||
bool searchReceived(const QVector<MTPMessage> &result, DialogsSearchRequestType type, int32 fullCount);
|
||||
void peerSearchReceived(const QString &query, const QVector<MTPPeer> &result);
|
||||
bool searchReceived(
|
||||
const QVector<MTPMessage> &result,
|
||||
DialogsSearchRequestType type,
|
||||
int fullCount);
|
||||
void peerSearchReceived(
|
||||
const QString &query,
|
||||
const QVector<MTPPeer> &my,
|
||||
const QVector<MTPPeer> &result);
|
||||
void showMore(int32 pixels);
|
||||
|
||||
void activate();
|
||||
|
@ -300,6 +306,9 @@ private:
|
|||
bool _hashtagDeletePressed = false;
|
||||
|
||||
FilteredDialogs _filterResults;
|
||||
base::flat_map<
|
||||
not_null<PeerData*>,
|
||||
std::unique_ptr<Dialogs::Row>> _filterResultsGlobal;
|
||||
int _filteredSelected = -1;
|
||||
int _filteredPressed = -1;
|
||||
|
||||
|
|
|
@ -472,13 +472,18 @@ bool DialogsWidget::onSearchMessages(bool searchCache) {
|
|||
return true;
|
||||
}
|
||||
if (searchCache) {
|
||||
SearchCache::const_iterator i = _searchCache.constFind(q);
|
||||
const auto i = _searchCache.constFind(q);
|
||||
if (i != _searchCache.cend()) {
|
||||
_searchQuery = q;
|
||||
_searchQueryFrom = _searchFromUser;
|
||||
_searchFull = _searchFullMigrated = false;
|
||||
MTP::cancel(base::take(_searchRequest));
|
||||
searchReceived(_searchInPeer ? DialogsSearchPeerFromStart : DialogsSearchFromStart, i.value(), 0);
|
||||
searchReceived(
|
||||
_searchInPeer
|
||||
? DialogsSearchPeerFromStart
|
||||
: DialogsSearchFromStart,
|
||||
i.value(),
|
||||
0);
|
||||
return true;
|
||||
}
|
||||
} else if (_searchQuery != q || _searchQueryFrom != _searchFromUser) {
|
||||
|
@ -487,7 +492,9 @@ bool DialogsWidget::onSearchMessages(bool searchCache) {
|
|||
_searchFull = _searchFullMigrated = false;
|
||||
MTP::cancel(base::take(_searchRequest));
|
||||
if (_searchInPeer) {
|
||||
auto flags = _searchQueryFrom ? MTP_flags(MTPmessages_Search::Flag::f_from_id) : MTP_flags(0);
|
||||
const auto flags = _searchQueryFrom
|
||||
? MTP_flags(MTPmessages_Search::Flag::f_from_id)
|
||||
: MTP_flags(0);
|
||||
_searchRequest = MTP::send(
|
||||
MTPmessages_Search(
|
||||
flags,
|
||||
|
@ -520,7 +527,7 @@ bool DialogsWidget::onSearchMessages(bool searchCache) {
|
|||
}
|
||||
_searchQueries.insert(_searchRequest, _searchQuery);
|
||||
}
|
||||
if (!_searchInPeer && q.size() >= MinUsernameLength) {
|
||||
if (!_searchInPeer && !q.isEmpty()) {
|
||||
if (searchCache) {
|
||||
auto i = _peerSearchCache.constFind(q);
|
||||
if (i != _peerSearchCache.cend()) {
|
||||
|
@ -532,7 +539,12 @@ bool DialogsWidget::onSearchMessages(bool searchCache) {
|
|||
} else if (_peerSearchQuery != q) {
|
||||
_peerSearchQuery = q;
|
||||
_peerSearchFull = false;
|
||||
_peerSearchRequest = MTP::send(MTPcontacts_Search(MTP_string(_peerSearchQuery), MTP_int(SearchPeopleLimit)), rpcDone(&DialogsWidget::peerSearchReceived), rpcFail(&DialogsWidget::peopleFailed));
|
||||
_peerSearchRequest = MTP::send(
|
||||
MTPcontacts_Search(
|
||||
MTP_string(_peerSearchQuery),
|
||||
MTP_int(SearchPeopleLimit)),
|
||||
rpcDone(&DialogsWidget::peerSearchReceived),
|
||||
rpcFail(&DialogsWidget::peopleFailed));
|
||||
_peerSearchQueries.insert(_peerSearchRequest, _peerSearchQuery);
|
||||
}
|
||||
}
|
||||
|
@ -673,12 +685,15 @@ void DialogsWidget::loadPinnedDialogs() {
|
|||
_pinnedDialogsRequestId = MTP::send(MTPmessages_GetPinnedDialogs(), rpcDone(&DialogsWidget::pinnedDialogsReceived), rpcFail(&DialogsWidget::dialogsFailed));
|
||||
}
|
||||
|
||||
void DialogsWidget::searchReceived(DialogsSearchRequestType type, const MTPmessages_Messages &result, mtpRequestId req) {
|
||||
void DialogsWidget::searchReceived(
|
||||
DialogsSearchRequestType type,
|
||||
const MTPmessages_Messages &result,
|
||||
mtpRequestId requestId) {
|
||||
using State = DialogsInner::State;
|
||||
const auto state = _inner->state();
|
||||
if (state == State::Filtered) {
|
||||
if (type == DialogsSearchFromStart || type == DialogsSearchPeerFromStart) {
|
||||
auto i = _searchQueries.find(req);
|
||||
auto i = _searchQueries.find(requestId);
|
||||
if (i != _searchQueries.cend()) {
|
||||
_searchCache[i.value()] = result;
|
||||
_searchQueries.erase(i);
|
||||
|
@ -686,7 +701,7 @@ void DialogsWidget::searchReceived(DialogsSearchRequestType type, const MTPmessa
|
|||
}
|
||||
}
|
||||
|
||||
if (_searchRequest == req) {
|
||||
if (_searchRequest == requestId) {
|
||||
switch (result.type()) {
|
||||
case mtpc_messages_messages: {
|
||||
auto &d = result.c_messages_messages();
|
||||
|
@ -751,25 +766,27 @@ void DialogsWidget::searchReceived(DialogsSearchRequestType type, const MTPmessa
|
|||
}
|
||||
}
|
||||
|
||||
void DialogsWidget::peerSearchReceived(const MTPcontacts_Found &result, mtpRequestId req) {
|
||||
void DialogsWidget::peerSearchReceived(
|
||||
const MTPcontacts_Found &result,
|
||||
mtpRequestId requestId) {
|
||||
using State = DialogsInner::State;
|
||||
const auto state = _inner->state();
|
||||
auto q = _peerSearchQuery;
|
||||
if (state == State::Filtered) {
|
||||
auto i = _peerSearchQueries.find(req);
|
||||
auto i = _peerSearchQueries.find(requestId);
|
||||
if (i != _peerSearchQueries.cend()) {
|
||||
q = i.value();
|
||||
_peerSearchCache[q] = result;
|
||||
_peerSearchQueries.erase(i);
|
||||
}
|
||||
}
|
||||
if (_peerSearchRequest == req) {
|
||||
if (_peerSearchRequest == requestId) {
|
||||
switch (result.type()) {
|
||||
case mtpc_contacts_found: {
|
||||
auto &d = result.c_contacts_found();
|
||||
App::feedUsers(d.vusers);
|
||||
App::feedChats(d.vchats);
|
||||
_inner->peerSearchReceived(q, d.vresults.v);
|
||||
_inner->peerSearchReceived(q, d.vmy_results.v, d.vresults.v);
|
||||
} break;
|
||||
}
|
||||
|
||||
|
@ -778,10 +795,13 @@ void DialogsWidget::peerSearchReceived(const MTPcontacts_Found &result, mtpReque
|
|||
}
|
||||
}
|
||||
|
||||
bool DialogsWidget::searchFailed(DialogsSearchRequestType type, const RPCError &error, mtpRequestId req) {
|
||||
bool DialogsWidget::searchFailed(
|
||||
DialogsSearchRequestType type,
|
||||
const RPCError &error,
|
||||
mtpRequestId requestId) {
|
||||
if (MTP::isDefaultHandledError(error)) return false;
|
||||
|
||||
if (_searchRequest == req) {
|
||||
if (_searchRequest == requestId) {
|
||||
_searchRequest = 0;
|
||||
if (type == DialogsSearchMigratedFromStart || type == DialogsSearchMigratedFromOffset) {
|
||||
_searchFullMigrated = true;
|
||||
|
@ -891,7 +911,7 @@ void DialogsWidget::onFilterUpdate(bool force) {
|
|||
_cancelSearch->toggle(!filterText.isEmpty(), anim::type::normal);
|
||||
updateJumpToDateVisibility();
|
||||
|
||||
if (filterText.size() < MinUsernameLength) {
|
||||
if (filterText.isEmpty()) {
|
||||
_peerSearchCache.clear();
|
||||
_peerSearchQueries.clear();
|
||||
_peerSearchQuery = QString();
|
||||
|
|
|
@ -140,8 +140,13 @@ private:
|
|||
void pinnedDialogsReceived(
|
||||
const MTPmessages_PeerDialogs &result,
|
||||
mtpRequestId requestId);
|
||||
void searchReceived(DialogsSearchRequestType type, const MTPmessages_Messages &result, mtpRequestId requestId);
|
||||
void peerSearchReceived(const MTPcontacts_Found &result, mtpRequestId requestId);
|
||||
void searchReceived(
|
||||
DialogsSearchRequestType type,
|
||||
const MTPmessages_Messages &result,
|
||||
mtpRequestId requestId);
|
||||
void peerSearchReceived(
|
||||
const MTPcontacts_Found &result,
|
||||
mtpRequestId requestId);
|
||||
void updateDialogsOffset(
|
||||
const QVector<MTPDialog> &dialogs,
|
||||
const QVector<MTPMessage> &messages);
|
||||
|
|
|
@ -1829,15 +1829,18 @@ void AddParticipantBoxSearchController::searchParticipantsDone(mtpRequestId requ
|
|||
}
|
||||
|
||||
void AddParticipantBoxSearchController::requestGlobal() {
|
||||
if (_query.size() < MinUsernameLength) {
|
||||
if (_query.isEmpty()) {
|
||||
_globalLoaded = true;
|
||||
return;
|
||||
}
|
||||
|
||||
auto perPage = SearchPeopleLimit;
|
||||
_requestId = request(MTPcontacts_Search(MTP_string(_query), MTP_int(perPage))).done([this](const MTPcontacts_Found &result, mtpRequestId requestId) {
|
||||
_requestId = request(MTPcontacts_Search(
|
||||
MTP_string(_query),
|
||||
MTP_int(perPage)
|
||||
)).done([=](const MTPcontacts_Found &result, mtpRequestId requestId) {
|
||||
searchGlobalDone(requestId, result);
|
||||
}).fail([this](const RPCError &error, mtpRequestId requestId) {
|
||||
}).fail([=](const RPCError &error, mtpRequestId requestId) {
|
||||
if (_requestId == requestId) {
|
||||
_requestId = 0;
|
||||
_globalLoaded = true;
|
||||
|
@ -1863,24 +1866,31 @@ void AddParticipantBoxSearchController::searchGlobalDone(mtpRequestId requestId,
|
|||
}
|
||||
}
|
||||
|
||||
if (_requestId == requestId) {
|
||||
_requestId = 0;
|
||||
_globalLoaded = true;
|
||||
for_const (auto &mtpPeer, found.vresults.v) {
|
||||
auto peerId = peerFromMTP(mtpPeer);
|
||||
if (auto peer = App::peerLoaded(peerId)) {
|
||||
if (auto user = peer->asUser()) {
|
||||
if (_additional->adminRights.find(user) == _additional->adminRights.cend()
|
||||
&& _additional->restrictedRights.find(user) == _additional->restrictedRights.cend()
|
||||
&& _additional->external.find(user) == _additional->external.cend()
|
||||
&& _additional->kicked.find(user) == _additional->kicked.cend()
|
||||
&& _additional->creator != user) {
|
||||
const auto feedList = [&](const MTPVector<MTPPeer> &list) {
|
||||
const auto contains = [](const auto &map, const auto &value) {
|
||||
return map.find(value) != map.end();
|
||||
};
|
||||
for (const auto &mtpPeer : list.v) {
|
||||
const auto peerId = peerFromMTP(mtpPeer);
|
||||
if (const auto peer = App::peerLoaded(peerId)) {
|
||||
if (const auto user = peer->asUser()) {
|
||||
if (_additional->creator != user
|
||||
&& !contains(_additional->adminRights, user)
|
||||
&& !contains(_additional->restrictedRights, user)
|
||||
&& !contains(_additional->external, user)
|
||||
&& !contains(_additional->kicked, user)) {
|
||||
_additional->infoNotLoaded.emplace(user);
|
||||
}
|
||||
delegate()->peerListSearchAddRow(user);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
if (_requestId == requestId) {
|
||||
_requestId = 0;
|
||||
_globalLoaded = true;
|
||||
feedList(found.vmy_results);
|
||||
feedList(found.vresults);
|
||||
delegate()->peerListSearchRefreshRows();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,6 +18,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|||
namespace Ui {
|
||||
namespace {
|
||||
|
||||
constexpr auto kMaxUsernameLength = 32;
|
||||
|
||||
template <typename InputClass>
|
||||
class InputStyle : public QCommonStyle {
|
||||
public:
|
||||
|
@ -3976,7 +3978,9 @@ void UsernameInput::correctValue(
|
|||
if (newPos > 0) --newPos;
|
||||
}
|
||||
len -= from;
|
||||
if (len > MaxUsernameLength) len = MaxUsernameLength + (now.at(from) == '@' ? 1 : 0);
|
||||
if (len > kMaxUsernameLength) {
|
||||
len = kMaxUsernameLength + (now.at(from) == '@' ? 1 : 0);
|
||||
}
|
||||
for (int32 to = from + len; to > from;) {
|
||||
--to;
|
||||
if (!now.at(to).isSpace()) {
|
||||
|
|
Loading…
Add table
Reference in a new issue