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();
  1. subscribe(Notify::PeerUpdated(), Notify::PeerUpdatedHandler(observeEvents, [this](const Notify::PeerUpdate &update) {
  2.                 notifyPeerUpdated(update);
  3.         }));
复制代码
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