diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index 2db3f65def..2870bde616 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -283,6 +283,37 @@ void ApiWrap::finalizeMessageDataRequest( } } +void ApiWrap::requestContacts() { + if (_session->data().contactsLoaded().value() || _contactsRequestId) { + return; + } + _contactsRequestId = request(MTPcontacts_GetContacts( + MTP_int(0) + )).done([=](const MTPcontacts_Contacts &result) { + _contactsRequestId = 0; + if (result.type() == mtpc_contacts_contactsNotModified) { + return; + } + Assert(result.type() == mtpc_contacts_contacts); + const auto &d = result.c_contacts_contacts(); + App::feedUsers(d.vusers); + for (const auto &contact : d.vcontacts.v) { + if (contact.type() != mtpc_contact) continue; + + const auto userId = contact.c_contact().vuser_id.v; + if (userId == Auth().userId() && App::self()) { + if (App::self()->contact < 1) { + App::self()->contact = 1; + Notify::userIsContactChanged(App::self()); + } + } + } + _session->data().contactsLoaded().set(true); + }).fail([=](const RPCError &error) { + _contactsRequestId = 0; + }).send(); +} + void ApiWrap::requestFullPeer(PeerData *peer) { if (!peer || _fullPeerRequests.contains(peer)) return; @@ -1002,7 +1033,7 @@ void ApiWrap::saveStickerSets(const Stickers::Order &localOrder, const Stickers: auto writeInstalled = true, writeRecent = false, writeCloudRecent = false, writeFaved = false, writeArchived = false; auto &recent = Stickers::GetRecentPack(); - auto &sets = Auth().data().stickerSetsRef(); + auto &sets = _session->data().stickerSetsRef(); _stickersOrder = localOrder; for_const (auto removedSetId, localRemoved) { @@ -1047,8 +1078,8 @@ void ApiWrap::saveStickerSets(const Stickers::Order &localOrder, const Stickers: _stickerSetDisenableRequests.insert(requestId); - int removeIndex = Auth().data().stickerSetsOrder().indexOf(it->id); - if (removeIndex >= 0) Auth().data().stickerSetsOrderRef().removeAt(removeIndex); + int removeIndex = _session->data().stickerSetsOrder().indexOf(it->id); + if (removeIndex >= 0) _session->data().stickerSetsOrderRef().removeAt(removeIndex); if (!(it->flags & MTPDstickerSet_ClientFlag::f_featured) && !(it->flags & MTPDstickerSet_ClientFlag::f_special)) { sets.erase(it); } else { @@ -1068,7 +1099,7 @@ void ApiWrap::saveStickerSets(const Stickers::Order &localOrder, const Stickers: } } - auto &order = Auth().data().stickerSetsOrderRef(); + auto &order = _session->data().stickerSetsOrderRef(); order.clear(); for_const (auto setId, _stickersOrder) { auto it = sets.find(setId); @@ -1107,7 +1138,7 @@ void ApiWrap::saveStickerSets(const Stickers::Order &localOrder, const Stickers: if (writeArchived) Local::writeArchivedStickers(); if (writeCloudRecent) Local::writeRecentStickers(); if (writeFaved) Local::writeFavedStickers(); - Auth().data().markStickersUpdated(); + _session->data().markStickersUpdated(); if (_stickerSetDisenableRequests.empty()) { stickersSaveOrder(); @@ -1239,7 +1270,7 @@ void ApiWrap::savePrivacy(const MTPInputPrivacyKey &key, QVectorsecond).cancel(); _privacySaveRequests.erase(it); } @@ -1253,7 +1284,7 @@ void ApiWrap::savePrivacy(const MTPInputPrivacyKey &key, QVector &rules) { @@ -1710,7 +1741,7 @@ void ApiWrap::stickersSaveOrder() { _stickersReorderRequestId = 0; }).fail([this](const RPCError &error) { _stickersReorderRequestId = 0; - Auth().data().setLastStickersUpdate(0); + _session->data().setLastStickersUpdate(0); updateStickers(); }).send(); } @@ -1729,16 +1760,16 @@ void ApiWrap::setGroupStickerSet(not_null megagroup, const MTPInpu Expects(megagroup->mgInfo != nullptr); megagroup->mgInfo->stickerSet = set; request(MTPchannels_SetStickers(megagroup->inputChannel, set)).send(); - Auth().data().markStickersUpdated(); + _session->data().markStickersUpdated(); } void ApiWrap::requestStickers(TimeId now) { - if (!Auth().data().stickersUpdateNeeded(now) + if (!_session->data().stickersUpdateNeeded(now) || _stickersUpdateRequest) { return; } auto onDone = [this](const MTPmessages_AllStickers &result) { - Auth().data().setLastStickersUpdate(getms(true)); + _session->data().setLastStickersUpdate(getms(true)); _stickersUpdateRequest = 0; switch (result.type()) { @@ -1757,12 +1788,12 @@ void ApiWrap::requestStickers(TimeId now) { } void ApiWrap::requestRecentStickers(TimeId now) { - if (!Auth().data().recentStickersUpdateNeeded(now) + if (!_session->data().recentStickersUpdateNeeded(now) || _recentStickersUpdateRequest) { return; } auto onDone = [this](const MTPmessages_RecentStickers &result) { - Auth().data().setLastRecentStickersUpdate(getms(true)); + _session->data().setLastRecentStickersUpdate(getms(true)); _recentStickersUpdateRequest = 0; switch (result.type()) { @@ -1781,12 +1812,12 @@ void ApiWrap::requestRecentStickers(TimeId now) { } void ApiWrap::requestFavedStickers(TimeId now) { - if (!Auth().data().favedStickersUpdateNeeded(now) + if (!_session->data().favedStickersUpdateNeeded(now) || _favedStickersUpdateRequest) { return; } auto onDone = [this](const MTPmessages_FavedStickers &result) { - Auth().data().setLastFavedStickersUpdate(getms(true)); + _session->data().setLastFavedStickersUpdate(getms(true)); _favedStickersUpdateRequest = 0; switch (result.type()) { @@ -1805,12 +1836,12 @@ void ApiWrap::requestFavedStickers(TimeId now) { } void ApiWrap::requestFeaturedStickers(TimeId now) { - if (!Auth().data().featuredStickersUpdateNeeded(now) + if (!_session->data().featuredStickersUpdateNeeded(now) || _featuredStickersUpdateRequest) { return; } auto onDone = [this](const MTPmessages_FeaturedStickers &result) { - Auth().data().setLastFeaturedStickersUpdate(getms(true)); + _session->data().setLastFeaturedStickersUpdate(getms(true)); _featuredStickersUpdateRequest = 0; switch (result.type()) { @@ -1829,12 +1860,12 @@ void ApiWrap::requestFeaturedStickers(TimeId now) { } void ApiWrap::requestSavedGifs(TimeId now) { - if (!Auth().data().savedGifsUpdateNeeded(now) + if (!_session->data().savedGifsUpdateNeeded(now) || _savedGifsUpdateRequest) { return; } auto onDone = [this](const MTPmessages_SavedGifs &result) { - Auth().data().setLastSavedGifsUpdate(getms(true)); + _session->data().setLastSavedGifsUpdate(getms(true)); _savedGifsUpdateRequest = 0; switch (result.type()) { @@ -1860,8 +1891,8 @@ void ApiWrap::readFeaturedSetDelayed(uint64 setId) { } void ApiWrap::readFeaturedSets() { - auto &sets = Auth().data().stickerSetsRef(); - auto count = Auth().data().featuredStickerSetsUnreadCount(); + auto &sets = _session->data().stickerSetsRef(); + auto count = _session->data().featuredStickerSetsUnreadCount(); QVector wrappedIds; wrappedIds.reserve(_featuredSetsRead.size()); for (auto setId : _featuredSetsRead) { @@ -1879,12 +1910,12 @@ void ApiWrap::readFeaturedSets() { if (!wrappedIds.empty()) { auto requestData = MTPmessages_ReadFeaturedStickers( MTP_vector(wrappedIds)); - request(std::move(requestData)).done([](const MTPBool &result) { + request(std::move(requestData)).done([=](const MTPBool &result) { Local::writeFeaturedStickers(); - Auth().data().markStickersUpdated(); + _session->data().markStickersUpdated(); }).send(); - Auth().data().setFeaturedStickerSetsUnreadCount(count); + _session->data().setFeaturedStickerSetsUnreadCount(count); } } @@ -1952,12 +1983,15 @@ void ApiWrap::applyUpdatesNoPtsCheck(const MTPUpdates &updates) { case mtpc_updateShortMessage: { auto &d = updates.c_updateShortMessage(); auto flags = mtpCastFlags(d.vflags.v) | MTPDmessage::Flag::f_from_id; + const auto peerUserId = d.is_out() + ? d.vuser_id + : MTP_int(_session->userId()); App::histories().addNewMessage( MTP_message( MTP_flags(flags), d.vid, - d.is_out() ? MTP_int(Auth().userId()) : d.vuser_id, - MTP_peerUser(d.is_out() ? d.vuser_id : MTP_int(Auth().userId())), + d.is_out() ? MTP_int(_session->userId()) : d.vuser_id, + MTP_peerUser(peerUserId), d.vfwd_from, d.vvia_bot_id, d.vreply_to_msg_id, @@ -2029,7 +2063,7 @@ void ApiWrap::applyUpdateNoPtsCheck(const MTPUpdate &update) { if (auto item = App::histItemById(NoChannel, msgId.v)) { if (item->isMediaUnread()) { item->markMediaRead(); - Auth().data().requestItemRepaint(item); + _session->data().requestItemRepaint(item); if (item->out() && item->history()->peer->isUser()) { auto when = App::main()->requestingDifference() ? 0 : unixtime(); @@ -2395,7 +2429,7 @@ void ApiWrap::sharedMediaDone( messageId, slice, result); - Auth().storage().add(Storage::SharedMediaAddSlice( + _session->storage().add(Storage::SharedMediaAddSlice( peer->id, type, std::move(parsed.messageIds), @@ -2458,7 +2492,7 @@ void ApiWrap::userPhotosDone( photoIds.push_back(photoData->id); } } - Auth().storage().add(Storage::UserPhotosAddSlice( + _session->storage().add(Storage::UserPhotosAddSlice( user->id, std::move(photoIds), fullCount @@ -2555,7 +2589,7 @@ void ApiWrap::forwardMessages( const auto newId = FullMsgId( peerToChannel(peer->id), clientMsgId()); - const auto self = Auth().user(); + const auto self = _session->user(); const auto messageFromId = channelPost ? UserId(0) : peerToUser(self->id); @@ -2640,9 +2674,9 @@ void ApiWrap::sendSharedContact( } else { flags |= MTPDmessage::Flag::f_from_id; } - const auto messageFromId = channelPost ? 0 : Auth().userId(); + const auto messageFromId = channelPost ? 0 : _session->userId(); const auto messagePostAuthor = channelPost - ? (Auth().user()->firstName + ' ' + Auth().user()->lastName) + ? (_session->user()->firstName + ' ' + _session->user()->lastName) : QString(); const auto item = history->addNewMessage( MTP_message( diff --git a/Telegram/SourceFiles/apiwrap.h b/Telegram/SourceFiles/apiwrap.h index a65ecf0393..b7aae651e3 100644 --- a/Telegram/SourceFiles/apiwrap.h +++ b/Telegram/SourceFiles/apiwrap.h @@ -48,6 +48,8 @@ public: using RequestMessageDataCallback = base::lambda; void requestMessageData(ChannelData *channel, MsgId msgId, RequestMessageDataCallback callback); + void requestContacts(); + void requestFullPeer(PeerData *peer); void requestPeer(PeerData *peer); void requestPeers(const QList &peers); @@ -385,8 +387,9 @@ private: base::Timer _featuredSetsReadTimer; base::flat_set _featuredSetsRead; - QMap _privacySaveRequests; + base::flat_map _privacySaveRequests; + mtpRequestId _contactsRequestId = 0; mtpRequestId _contactsStatusesRequestId = 0; base::flat_map, mtpRequestId> _unreadMentionsRequests; diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 6623fe95ce..8e15941719 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -84,6 +84,7 @@ DialogsInner::DialogsInner(QWidget *parent, not_null contro _cancelSearchFromUser->hide(); subscribe(Auth().downloaderTaskFinished(), [this] { update(); }); + subscribe(Auth().data().contactsLoaded(), [this](bool) { refresh(); }); Auth().data().itemRemoved( ) | rpl::start_with_next( [this](auto item) { itemRemoved(item); }, @@ -1621,21 +1622,6 @@ void DialogsInner::peerSearchReceived(const QString &query, const QVector &result) { - for_const (auto contact, result) { - if (contact.type() != mtpc_contact) continue; - - auto userId = contact.c_contact().vuser_id.v; - if (userId == Auth().userId() && App::self()) { - if (App::self()->contact < 1) { - App::self()->contact = 1; - Notify::userIsContactChanged(App::self()); - } - } - } - refresh(); -} - void DialogsInner::notify_userIsContactChanged(UserData *user, bool fromThisApp) { if (user->loadedStatus != PeerData::FullLoaded) { LOG(("API Error: notify_userIsContactChanged() called for a not loaded user!")); diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h index 1e836a5269..2a88cfa845 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h @@ -41,8 +41,6 @@ public: void activate(); - void contactsReceived(const QVector &result); - void selectSkip(int32 direction); void selectSkipPage(int32 pixels, int32 direction); diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index f2d1cc5381..e5cf36237b 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -20,6 +20,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "mainwidget.h" #include "autoupdater.h" #include "auth_session.h" +#include "apiwrap.h" #include "messenger.h" #include "boxes/peer_list_box.h" #include "window/window_controller.h" @@ -315,7 +316,9 @@ void DialogsWidget::notify_historyMuteUpdated(History *history) { void DialogsWidget::unreadCountsReceived(const QVector &dialogs) { } -void DialogsWidget::dialogsReceived(const MTPmessages_Dialogs &dialogs, mtpRequestId requestId) { +void DialogsWidget::dialogsReceived( + const MTPmessages_Dialogs &dialogs, + mtpRequestId requestId) { if (_dialogsRequestId != requestId) return; const QVector *dialogsList = 0; @@ -338,9 +341,7 @@ void DialogsWidget::dialogsReceived(const MTPmessages_Dialogs &dialogs, mtpReque } break; } - if (!Auth().data().contactsLoaded().value() && !_contactsRequestId) { - _contactsRequestId = MTP::send(MTPcontacts_GetContacts(MTP_int(0)), rpcDone(&DialogsWidget::contactsReceived), rpcFail(&DialogsWidget::contactsFailed)); - } + Auth().api().requestContacts(); if (dialogsList) { TimeId lastDate = 0; @@ -603,22 +604,6 @@ void DialogsWidget::loadPinnedDialogs() { _pinnedDialogsRequestId = MTP::send(MTPmessages_GetPinnedDialogs(), rpcDone(&DialogsWidget::pinnedDialogsReceived), rpcFail(&DialogsWidget::dialogsFailed)); } -void DialogsWidget::contactsReceived(const MTPcontacts_Contacts &result) { - _contactsRequestId = 0; - if (result.type() == mtpc_contacts_contacts) { - auto &d = result.c_contacts_contacts(); - App::feedUsers(d.vusers); - _inner->contactsReceived(d.vcontacts.v); - } - Auth().data().contactsLoaded().set(true); -} - -bool DialogsWidget::contactsFailed(const RPCError &error) { - if (MTP::isDefaultHandledError(error)) return false; - _contactsRequestId = 0; - return true; -} - void DialogsWidget::searchReceived(DialogsSearchRequestType type, const MTPmessages_Messages &result, mtpRequestId req) { if (_inner->state() == DialogsInner::FilteredState || _inner->state() == DialogsInner::SearchedState) { if (type == DialogsSearchFromStart || type == DialogsSearchPeerFromStart) { diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.h b/Telegram/SourceFiles/dialogs/dialogs_widget.h index ba6dd232df..02f0c9ab0a 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.h @@ -133,7 +133,6 @@ private: void animationCallback(); void dialogsReceived(const MTPmessages_Dialogs &dialogs, mtpRequestId requestId); void pinnedDialogsReceived(const MTPmessages_PeerDialogs &dialogs, mtpRequestId requestId); - void contactsReceived(const MTPcontacts_Contacts &result); void searchReceived(DialogsSearchRequestType type, const MTPmessages_Messages &result, mtpRequestId requestId); void peerSearchReceived(const MTPcontacts_Found &result, mtpRequestId requestId); @@ -149,7 +148,6 @@ private: void unreadCountsReceived(const QVector &dialogs); bool dialogsFailed(const RPCError &error, mtpRequestId req); - bool contactsFailed(const RPCError &error); bool searchFailed(DialogsSearchRequestType type, const RPCError &error, mtpRequestId req); bool peopleFailed(const RPCError &error, mtpRequestId req); @@ -163,7 +161,6 @@ private: PeerData *_dialogsOffsetPeer = nullptr; mtpRequestId _dialogsRequestId = 0; mtpRequestId _pinnedDialogsRequestId = 0; - mtpRequestId _contactsRequestId = 0; bool _pinnedDialogsReceived = false; object_ptr _forwardCancel = { nullptr };