firemail
标题:
联系人获取存放逻辑
[打印本页]
作者:
Qter
时间:
2020-3-20 17:03
标题:
联系人获取存放逻辑
本帖最后由 Qter 于 2020-3-26 09:36 编辑
void DialogsWidget::dialogsReceived(..){
Auth().api().requestContacts();
}
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();
_session->data().processUsers(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 == _session->userId()) {
_session->user()->setContactStatus(
UserData::ContactStatus::Contact);
}
}
_session->data().contactsLoaded().set(true);
}).fail([=](const RPCError &error) {
_contactsRequestId = 0;
}).send();
}
session
App::main() --> mainwidget.h
Dialogs::IndexedList *MainWidget::contactsList() {
return _dialogs->contactsList();
}
object_ptr<DialogsWidget> _dialogs;
DialogsWidget
return _inner->contactsList();
QPointer<DialogsInner> _inner;
return _contacts.get();
std::unique_ptr<Dialogs::IndexedList> _contacts;
QMap<uint64, QSet<uint64>> _mapUser2Group;
////////////////
void MainWidget::start() {
MTP::send(MTPupdates_GetState(), rpcDone(&MainWidget::gotState));
/////////////////////////
/////////////////
DialogsWidget:
ialogsWidget
构造函数中调用loadDialogs
void DialogsWidget::loadDialogs() {
_dialogsRequestId =
MTP::send
(
MTPmessages_GetDialogs(
MTP_flags(flags),
//MTP_int(feedId), // #feed
MTP_int(_dialogsOffsetDate),
MTP_int(_dialogsOffsetId),
_dialogsOffsetPeer
? _dialogsOffsetPeer->input
: MTP_inputPeerEmpty(),
MTP_int(loadCount),
MTP_int(hash)),
rpcDone(&DialogsWidget::
dialogsReceived
),
rpcFail(&DialogsWidget::dialogsFailed));
if (!_pinnedDialogsReceived) {
loadPinnedDialogs();
}
refreshLoadMoreButton();
}
/////////////////
DialogsWidget:
ialogsWidget
在构造函数中调用
////////////
作者:
Qter
时间:
2020-3-20 17:13
contacts.getContacts#c023849f hash:int = contacts.Contacts;
contacts.contacts#eae87e42 contacts:Vector<Contact> saved_count:int users:Vector<User> = contacts.Contacts;
contact#f911c994 user_id:int mutual:Bool = Contact;
作者:
Qter
时间:
2020-3-20 17:37
void ContactsBoxController::prepare() {
setSearchNoResultsText(lang(lng_blocked_list_not_found));
delegate()->peerListSetSearchMode(PeerListSearchMode::Enabled);
delegate()->peerListSetTitle(langFactory(lng_contacts_header));
prepareViewHook();
rebuildRows();
auto &sessionData = Auth().data();
subscribe(sessionData.contactsLoaded(), [this](bool loaded) {
rebuildRows();
});
}
作者:
Qter
时间:
2020-3-20 17:54
本帖最后由 Qter 于 2020-3-20 18:00 编辑
Auth().data().notifySavedGifsUpdated();
Global::RefDownloadPathChanged().notify();
base::Observable<void> _changed;
_changed.notify();
base::Observable<State> _stateChanged;
_stateChanged.notify(state, true);
Auth().data().notifyStickersUpdated();
_stickersUpdated.fire({});
rpl::event_stream<> _stickersUpdated;
return _stickersUpdated.events();
subscribe(Notify::PeerUpdated(), Notify::PeerUpdatedHandler(observeEvents, [this](const Notify::PeerUpdate &update) {
notifyPeerUpdated(update);
}));
复制代码
subscribe(Auth().downloaderTaskFinished(), [this] { update(); });base::Observable<void> &AuthSession::downloaderTaskFinished() {
return downloader().taskFinished();
}
base::Observable<void> &downloaderTaskFinished();
作者:
Qter
时间:
2020-3-20 18:07
本帖最后由 Qter 于 2020-3-20 18:49 编辑
1.在\Telegram\SourceFiles\auth_session.h这里加一份 ---添加要不要对chatlist中添加的判断
与服端定期同步时,对比有没有变化?---服务端有变化时,主动推送,推送了就一定有改变,这里不用保存数据,只发送订阅通知出去就行
2.在\Telegram\SourceFiles\dialogs\dialogs_inner_widget.h中添加一份
这里保存一份数据,用于界面显示,服务端有更新时,自动写入这里
3.对于本地修改分组的情况
要发送通知出去,更改2中的本地缓存? 还是等待服务端推送过来这次修改的变化,然后拉取全新数据,等全新数据拉取完后,再更新。
欢迎光临 firemail (http://firemail.wang:8088/)
Powered by Discuz! X3