Moved MTP blocked peers from ApiWrap to Api::BlockedPeers.

This commit is contained in:
23rd 2021-08-02 01:57:36 +03:00 committed by John Preston
parent 221ded6d54
commit 0ae260c6e1
11 changed files with 283 additions and 221 deletions

View file

@ -91,6 +91,8 @@ PRIVATE
api/api_attached_stickers.h api/api_attached_stickers.h
api/api_authorizations.cpp api/api_authorizations.cpp
api/api_authorizations.h api/api_authorizations.h
api/api_blocked_peers.cpp
api/api_blocked_peers.h
api/api_bot.cpp api/api_bot.cpp
api/api_bot.h api/api_bot.h
api/api_chat_filters.cpp api/api_chat_filters.cpp

View file

@ -0,0 +1,173 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#include "api/api_blocked_peers.h"
#include "apiwrap.h"
#include "base/unixtime.h"
#include "data/data_changes.h"
#include "data/data_peer.h"
#include "data/data_peer_id.h"
#include "data/data_session.h"
#include "main/main_session.h"
namespace Api {
namespace {
constexpr auto kBlockedFirstSlice = 16;
constexpr auto kBlockedPerPage = 40;
BlockedPeers::Slice TLToSlice(
const MTPcontacts_Blocked &blocked,
Data::Session &owner) {
const auto create = [&](int count, const QVector<MTPPeerBlocked> &list) {
auto slice = BlockedPeers::Slice();
slice.total = std::max(count, list.size());
slice.list.reserve(list.size());
for (const auto &contact : list) {
contact.match([&](const MTPDpeerBlocked &data) {
slice.list.push_back({
.id = peerFromMTP(data.vpeer_id()),
.date = data.vdate().v,
});
});
}
return slice;
};
return blocked.match([&](const MTPDcontacts_blockedSlice &data) {
owner.processUsers(data.vusers());
owner.processChats(data.vchats());
return create(data.vcount().v, data.vblocked().v);
}, [&](const MTPDcontacts_blocked &data) {
owner.processUsers(data.vusers());
owner.processChats(data.vchats());
return create(0, data.vblocked().v);
});
}
} // namespace
BlockedPeers::BlockedPeers(not_null<ApiWrap*> api)
: _session(&api->session())
, _api(&api->instance()) {
}
bool BlockedPeers::Slice::Item::operator==(const Item &other) const {
return (id == other.id) && (date == other.date);
}
bool BlockedPeers::Slice::Item::operator!=(const Item &other) const {
return !(*this == other);
}
bool BlockedPeers::Slice::operator==(const BlockedPeers::Slice &other) const {
return (total == other.total) && (list == other.list);
}
bool BlockedPeers::Slice::operator!=(const BlockedPeers::Slice &other) const {
return !(*this == other);
}
void BlockedPeers::block(not_null<PeerData*> peer) {
if (peer->isBlocked()) {
_session->changes().peerUpdated(
peer,
Data::PeerUpdate::Flag::IsBlocked);
} else if (_blockRequests.find(peer) == end(_blockRequests)) {
const auto requestId = _api.request(MTPcontacts_Block(
peer->input
)).done([=](const MTPBool &result) {
_blockRequests.erase(peer);
peer->setIsBlocked(true);
if (_slice) {
_slice->list.insert(
_slice->list.begin(),
{ peer->id, base::unixtime::now() });
++_slice->total;
_changes.fire_copy(*_slice);
}
}).fail([=](const MTP::Error &error) {
_blockRequests.erase(peer);
}).send();
_blockRequests.emplace(peer, requestId);
}
}
void BlockedPeers::unblock(not_null<PeerData*> peer, Fn<void()> onDone) {
if (!peer->isBlocked()) {
_session->changes().peerUpdated(
peer,
Data::PeerUpdate::Flag::IsBlocked);
return;
} else if (_blockRequests.find(peer) != end(_blockRequests)) {
return;
}
const auto requestId = _api.request(MTPcontacts_Unblock(
peer->input
)).done([=](const MTPBool &result) {
_blockRequests.erase(peer);
peer->setIsBlocked(false);
if (_slice) {
auto &list = _slice->list;
for (auto i = list.begin(); i != list.end(); ++i) {
if (i->id == peer->id) {
list.erase(i);
break;
}
}
if (_slice->total > list.size()) {
--_slice->total;
}
_changes.fire_copy(*_slice);
}
if (onDone) {
onDone();
}
}).fail([=](const MTP::Error &error) {
_blockRequests.erase(peer);
}).send();
_blockRequests.emplace(peer, requestId);
}
void BlockedPeers::reload() {
if (_requestId) {
return;
}
request(0, [=](Slice &&slice) {
if (!_slice || *_slice != slice) {
_slice = slice;
_changes.fire(std::move(slice));
}
});
}
auto BlockedPeers::slice() -> rpl::producer<BlockedPeers::Slice> {
if (!_slice) {
reload();
}
return _slice
? _changes.events_starting_with_copy(*_slice)
: (_changes.events() | rpl::type_erased());
}
void BlockedPeers::request(int offset, Fn<void(BlockedPeers::Slice)> onDone) {
if (_requestId) {
return;
}
_requestId = _api.request(MTPcontacts_GetBlocked(
MTP_int(offset),
MTP_int(offset ? kBlockedPerPage : kBlockedFirstSlice)
)).done([=](const MTPcontacts_Blocked &result) {
_requestId = 0;
onDone(TLToSlice(result, _session->data()));
}).fail([=](const MTP::Error &error) {
_requestId = 0;
}).send();
}
} // namespace Api

View file

@ -0,0 +1,60 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
#include "mtproto/sender.h"
class ApiWrap;
namespace Main {
class Session;
} // namespace Main
namespace Api {
class BlockedPeers final {
public:
struct Slice {
struct Item {
PeerId id;
TimeId date = 0;
bool operator==(const Item &other) const;
bool operator!=(const Item &other) const;
};
QVector<Item> list;
int total = 0;
bool operator==(const Slice &other) const;
bool operator!=(const Slice &other) const;
};
explicit BlockedPeers(not_null<ApiWrap*> api);
void reload();
rpl::producer<Slice> slice();
void request(int offset, Fn<void(Slice)> onDone);
void block(not_null<PeerData*> peer);
void unblock(not_null<PeerData*> peer, Fn<void()> onDone = nullptr);
private:
const not_null<Main::Session*> _session;
MTP::Sender _api;
base::flat_map<not_null<PeerData*>, mtpRequestId> _blockRequests;
mtpRequestId _requestId = 0;
std::optional<Slice> _slice;
rpl::event_stream<Slice> _changes;
};
} // namespace Api

View file

@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "api/api_authorizations.h" #include "api/api_authorizations.h"
#include "api/api_attached_stickers.h" #include "api/api_attached_stickers.h"
#include "api/api_blocked_peers.h"
#include "api/api_hash.h" #include "api/api_hash.h"
#include "api/api_invite_links.h" #include "api/api_invite_links.h"
#include "api/api_media.h" #include "api/api_media.h"
@ -109,7 +110,6 @@ constexpr auto kStickersByEmojiInvalidateTimeout = crl::time(60 * 60 * 1000);
constexpr auto kNotifySettingSaveTimeout = crl::time(1000); constexpr auto kNotifySettingSaveTimeout = crl::time(1000);
constexpr auto kDialogsFirstLoad = 20; constexpr auto kDialogsFirstLoad = 20;
constexpr auto kDialogsPerPage = 500; constexpr auto kDialogsPerPage = 500;
constexpr auto kBlockedFirstSlice = 16;
using PhotoFileLocationId = Data::PhotoFileLocationId; using PhotoFileLocationId = Data::PhotoFileLocationId;
using DocumentFileLocationId = Data::DocumentFileLocationId; using DocumentFileLocationId = Data::DocumentFileLocationId;
@ -121,22 +121,6 @@ using UpdatedFileReferences = Data::UpdatedFileReferences;
} // namespace } // namespace
bool ApiWrap::BlockedPeersSlice::Item::operator==(const Item &other) const {
return (peer == other.peer) && (date == other.date);
}
bool ApiWrap::BlockedPeersSlice::Item::operator!=(const Item &other) const {
return !(*this == other);
}
bool ApiWrap::BlockedPeersSlice::operator==(const BlockedPeersSlice &other) const {
return (total == other.total) && (list == other.list);
}
bool ApiWrap::BlockedPeersSlice::operator!=(const BlockedPeersSlice &other) const {
return !(*this == other);
}
ApiWrap::ApiWrap(not_null<Main::Session*> session) ApiWrap::ApiWrap(not_null<Main::Session*> session)
: MTP::Sender(&session->account().mtp()) : MTP::Sender(&session->account().mtp())
, _session(session) , _session(session)
@ -150,6 +134,7 @@ ApiWrap::ApiWrap(not_null<Main::Session*> session)
, _updateNotifySettingsTimer([=] { sendNotifySettingsUpdates(); }) , _updateNotifySettingsTimer([=] { sendNotifySettingsUpdates(); })
, _authorizations(std::make_unique<Api::Authorizations>(this)) , _authorizations(std::make_unique<Api::Authorizations>(this))
, _attachedStickers(std::make_unique<Api::AttachedStickers>(this)) , _attachedStickers(std::make_unique<Api::AttachedStickers>(this))
, _blockedPeers(std::make_unique<Api::BlockedPeers>(this))
, _selfDestruct(std::make_unique<Api::SelfDestruct>(this)) , _selfDestruct(std::make_unique<Api::SelfDestruct>(this))
, _sensitiveContent(std::make_unique<Api::SensitiveContent>(this)) , _sensitiveContent(std::make_unique<Api::SensitiveContent>(this))
, _globalPrivacy(std::make_unique<Api::GlobalPrivacy>(this)) , _globalPrivacy(std::make_unique<Api::GlobalPrivacy>(this))
@ -2134,68 +2119,6 @@ void ApiWrap::leaveChannel(not_null<ChannelData*> channel) {
} }
} }
void ApiWrap::blockPeer(not_null<PeerData*> peer) {
if (peer->isBlocked()) {
session().changes().peerUpdated(
peer,
Data::PeerUpdate::Flag::IsBlocked);
} else if (_blockRequests.find(peer) == end(_blockRequests)) {
const auto requestId = request(MTPcontacts_Block(
peer->input
)).done([=](const MTPBool &result) {
_blockRequests.erase(peer);
peer->setIsBlocked(true);
if (_blockedPeersSlice) {
_blockedPeersSlice->list.insert(
_blockedPeersSlice->list.begin(),
{ peer, base::unixtime::now() });
++_blockedPeersSlice->total;
_blockedPeersChanges.fire_copy(*_blockedPeersSlice);
}
}).fail([=](const MTP::Error &error) {
_blockRequests.erase(peer);
}).send();
_blockRequests.emplace(peer, requestId);
}
}
void ApiWrap::unblockPeer(not_null<PeerData*> peer, Fn<void()> onDone) {
if (!peer->isBlocked()) {
session().changes().peerUpdated(
peer,
Data::PeerUpdate::Flag::IsBlocked);
return;
} else if (_blockRequests.find(peer) != end(_blockRequests)) {
return;
}
const auto requestId = request(MTPcontacts_Unblock(
peer->input
)).done([=](const MTPBool &result) {
_blockRequests.erase(peer);
peer->setIsBlocked(false);
if (_blockedPeersSlice) {
auto &list = _blockedPeersSlice->list;
for (auto i = list.begin(); i != list.end(); ++i) {
if (i->peer == peer) {
list.erase(i);
break;
}
}
if (_blockedPeersSlice->total > list.size()) {
--_blockedPeersSlice->total;
}
_blockedPeersChanges.fire_copy(*_blockedPeersSlice);
}
if (onDone) {
onDone();
}
}).fail([=](const MTP::Error &error) {
_blockRequests.erase(peer);
}).send();
_blockRequests.emplace(peer, requestId);
}
void ApiWrap::requestNotifySettings(const MTPInputNotifyPeer &peer) { void ApiWrap::requestNotifySettings(const MTPInputNotifyPeer &peer) {
const auto key = [&] { const auto key = [&] {
switch (peer.type()) { switch (peer.type()) {
@ -4799,57 +4722,6 @@ void ApiWrap::saveSelfBio(const QString &text, FnMut<void()> done) {
}).send(); }).send();
} }
void ApiWrap::reloadBlockedPeers() {
if (_blockedPeersRequestId) {
return;
}
_blockedPeersRequestId = request(MTPcontacts_GetBlocked(
MTP_int(0),
MTP_int(kBlockedFirstSlice)
)).done([=](const MTPcontacts_Blocked &result) {
_blockedPeersRequestId = 0;
const auto push = [&](
int count,
const QVector<MTPPeerBlocked> &list) {
auto slice = BlockedPeersSlice();
slice.total = std::max(count, list.size());
slice.list.reserve(list.size());
for (const auto &contact : list) {
contact.match([&](const MTPDpeerBlocked &data) {
const auto peer = _session->data().peerLoaded(
peerFromMTP(data.vpeer_id()));
if (peer) {
peer->setIsBlocked(true);
slice.list.push_back({ peer, data.vdate().v });
}
});
}
if (!_blockedPeersSlice || *_blockedPeersSlice != slice) {
_blockedPeersSlice = slice;
_blockedPeersChanges.fire(std::move(slice));
}
};
result.match([&](const MTPDcontacts_blockedSlice &data) {
_session->data().processUsers(data.vusers());
push(data.vcount().v, data.vblocked().v);
}, [&](const MTPDcontacts_blocked &data) {
_session->data().processUsers(data.vusers());
push(0, data.vblocked().v);
});
}).fail([=](const MTP::Error &error) {
_blockedPeersRequestId = 0;
}).send();
}
auto ApiWrap::blockedPeersSlice() -> rpl::producer<BlockedPeersSlice> {
if (!_blockedPeersSlice) {
reloadBlockedPeers();
}
return _blockedPeersSlice
? _blockedPeersChanges.events_starting_with_copy(*_blockedPeersSlice)
: (_blockedPeersChanges.events() | rpl::type_erased());
}
Api::Authorizations &ApiWrap::authorizations() { Api::Authorizations &ApiWrap::authorizations() {
return *_authorizations; return *_authorizations;
} }
@ -4858,6 +4730,10 @@ Api::AttachedStickers &ApiWrap::attachedStickers() {
return *_attachedStickers; return *_attachedStickers;
} }
Api::BlockedPeers &ApiWrap::blockedPeers() {
return *_blockedPeers;
}
Api::SelfDestruct &ApiWrap::selfDestruct() { Api::SelfDestruct &ApiWrap::selfDestruct() {
return *_selfDestruct; return *_selfDestruct;
} }

View file

@ -58,6 +58,7 @@ namespace Api {
class Updates; class Updates;
class Authorizations; class Authorizations;
class AttachedStickers; class AttachedStickers;
class BlockedPeers;
class SelfDestruct; class SelfDestruct;
class SensitiveContent; class SensitiveContent;
class GlobalPrivacy; class GlobalPrivacy;
@ -114,22 +115,6 @@ public:
using SendAction = Api::SendAction; using SendAction = Api::SendAction;
using MessageToSend = Api::MessageToSend; using MessageToSend = Api::MessageToSend;
struct BlockedPeersSlice {
struct Item {
PeerData *peer = nullptr;
TimeId date = 0;
bool operator==(const Item &other) const;
bool operator!=(const Item &other) const;
};
QVector<Item> list;
int total = 0;
bool operator==(const BlockedPeersSlice &other) const;
bool operator!=(const BlockedPeersSlice &other) const;
};
explicit ApiWrap(not_null<Main::Session*> session); explicit ApiWrap(not_null<Main::Session*> session);
~ApiWrap(); ~ApiWrap();
@ -272,9 +257,6 @@ public:
void joinChannel(not_null<ChannelData*> channel); void joinChannel(not_null<ChannelData*> channel);
void leaveChannel(not_null<ChannelData*> channel); void leaveChannel(not_null<ChannelData*> channel);
void blockPeer(not_null<PeerData*> peer);
void unblockPeer(not_null<PeerData*> peer, Fn<void()> onDone = nullptr);
void requestNotifySettings(const MTPInputNotifyPeer &peer); void requestNotifySettings(const MTPInputNotifyPeer &peer);
void updateNotifySettingsDelayed(not_null<const PeerData*> peer); void updateNotifySettingsDelayed(not_null<const PeerData*> peer);
void saveDraftToCloudDelayed(not_null<History*> history); void saveDraftToCloudDelayed(not_null<History*> history);
@ -417,11 +399,9 @@ public:
void saveSelfBio(const QString &text, FnMut<void()> done); void saveSelfBio(const QString &text, FnMut<void()> done);
void reloadBlockedPeers();
rpl::producer<BlockedPeersSlice> blockedPeersSlice();
[[nodiscard]] Api::Authorizations &authorizations(); [[nodiscard]] Api::Authorizations &authorizations();
[[nodiscard]] Api::AttachedStickers &attachedStickers(); [[nodiscard]] Api::AttachedStickers &attachedStickers();
[[nodiscard]] Api::BlockedPeers &blockedPeers();
[[nodiscard]] Api::SelfDestruct &selfDestruct(); [[nodiscard]] Api::SelfDestruct &selfDestruct();
[[nodiscard]] Api::SensitiveContent &sensitiveContent(); [[nodiscard]] Api::SensitiveContent &sensitiveContent();
[[nodiscard]] Api::GlobalPrivacy &globalPrivacy(); [[nodiscard]] Api::GlobalPrivacy &globalPrivacy();
@ -641,7 +621,6 @@ private:
QMap<uint64, QPair<uint64, mtpRequestId> > _stickerSetRequests; QMap<uint64, QPair<uint64, mtpRequestId> > _stickerSetRequests;
QMap<ChannelData*, mtpRequestId> _channelAmInRequests; QMap<ChannelData*, mtpRequestId> _channelAmInRequests;
base::flat_map<not_null<PeerData*>, mtpRequestId> _blockRequests;
base::flat_map<PeerId, mtpRequestId> _notifySettingRequests; base::flat_map<PeerId, mtpRequestId> _notifySettingRequests;
base::flat_map<not_null<History*>, mtpRequestId> _draftsSaveRequestIds; base::flat_map<not_null<History*>, mtpRequestId> _draftsSaveRequestIds;
base::Timer _draftsSaveTimer; base::Timer _draftsSaveTimer;
@ -736,12 +715,9 @@ private:
FnMut<void()> _saveBioDone; FnMut<void()> _saveBioDone;
QString _saveBioText; QString _saveBioText;
mtpRequestId _blockedPeersRequestId = 0;
std::optional<BlockedPeersSlice> _blockedPeersSlice;
rpl::event_stream<BlockedPeersSlice> _blockedPeersChanges;
const std::unique_ptr<Api::Authorizations> _authorizations; const std::unique_ptr<Api::Authorizations> _authorizations;
const std::unique_ptr<Api::AttachedStickers> _attachedStickers; const std::unique_ptr<Api::AttachedStickers> _attachedStickers;
const std::unique_ptr<Api::BlockedPeers> _blockedPeers;
const std::unique_ptr<Api::SelfDestruct> _selfDestruct; const std::unique_ptr<Api::SelfDestruct> _selfDestruct;
const std::unique_ptr<Api::SensitiveContent> _sensitiveContent; const std::unique_ptr<Api::SensitiveContent> _sensitiveContent;
const std::unique_ptr<Api::GlobalPrivacy> _globalPrivacy; const std::unique_ptr<Api::GlobalPrivacy> _globalPrivacy;

View file

@ -24,6 +24,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "window/window_controller.h" #include "window/window_controller.h"
#include "window/window_session_controller.h" #include "window/window_session_controller.h"
#include "apiwrap.h" #include "apiwrap.h"
#include "api/api_blocked_peers.h"
#include "main/main_session.h" #include "main/main_session.h"
#include "boxes/confirm_box.h" #include "boxes/confirm_box.h"
#include "boxes/peers/edit_contact_box.h" #include "boxes/peers/edit_contact_box.h"
@ -393,7 +394,7 @@ void ContactStatus::setupReportHandler(not_null<PeerData*> peer) {
_controller->showBackFromStack(); _controller->showBackFromStack();
}); });
if (const auto user = peer->asUser()) { if (const auto user = peer->asUser()) {
peer->session().api().blockPeer(user); peer->session().api().blockedPeers().block(user);
} }
const auto text = ((peer->isChat() || peer->isMegagroup()) const auto text = ((peer->isChat() || peer->isMegagroup())
? tr::lng_report_spam_sure_group ? tr::lng_report_spam_sure_group

View file

@ -48,6 +48,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "core/application.h" #include "core/application.h"
#include "core/click_handler_types.h" #include "core/click_handler_types.h"
#include "apiwrap.h" #include "apiwrap.h"
#include "api/api_blocked_peers.h"
#include "facades.h" #include "facades.h"
#include "styles/style_info.h" #include "styles/style_info.h"
#include "styles/style_boxes.h" #include "styles/style_boxes.h"
@ -647,7 +648,7 @@ void ActionsFiller::addBlockAction(not_null<UserData*> user) {
Ui::showPeerHistory(user, ShowAtUnreadMsgId); Ui::showPeerHistory(user, ShowAtUnreadMsgId);
} }
} else if (user->isBot()) { } else if (user->isBot()) {
user->session().api().blockPeer(user); user->session().api().blockedPeers().block(user);
} else { } else {
window->show(Box( window->show(Box(
Window::PeerMenuBlockUserBox, Window::PeerMenuBlockUserBox,

View file

@ -48,8 +48,6 @@ namespace {
using UserPrivacy = Api::UserPrivacy; using UserPrivacy = Api::UserPrivacy;
using PrivacyRule = Api::UserPrivacy::Rule; using PrivacyRule = Api::UserPrivacy::Rule;
constexpr auto kBlockedPerPage = 40;
class BlockPeerBoxController final : public ChatsListBoxController { class BlockPeerBoxController final : public ChatsListBoxController {
public: public:
explicit BlockPeerBoxController(not_null<Main::Session*> session); explicit BlockPeerBoxController(not_null<Main::Session*> session);
@ -180,8 +178,7 @@ AdminLog::OwnedItem GenerateForwardedItem(
BlockedBoxController::BlockedBoxController( BlockedBoxController::BlockedBoxController(
not_null<Window::SessionController*> window) not_null<Window::SessionController*> window)
: _window(window) : _window(window) {
, _api(&_window->session().mtp()) {
} }
Main::Session &BlockedBoxController::session() const { Main::Session &BlockedBoxController::session() const {
@ -199,52 +196,26 @@ void BlockedBoxController::prepare() {
handleBlockedEvent(update.peer); handleBlockedEvent(update.peer);
}, lifetime()); }, lifetime());
_loadRequestId = -1; session().api().blockedPeers().slice(
_window->session().api().blockedPeersSlice(
) | rpl::take( ) | rpl::take(
1 1
) | rpl::start_with_next([=](const ApiWrap::BlockedPeersSlice &result) { ) | rpl::start_with_next([=](const Api::BlockedPeers::Slice &result) {
setDescriptionText(tr::lng_blocked_list_about(tr::now)); setDescriptionText(tr::lng_blocked_list_about(tr::now));
_loadRequestId = 0; applySlice(result);
_offset = result.list.size();
_allLoaded = (_offset >= result.total);
for (const auto item : result.list) {
appendRow(item.peer);
};
delegate()->peerListRefreshRows();
loadMoreRows(); loadMoreRows();
}, lifetime()); }, lifetime());
} }
void BlockedBoxController::loadMoreRows() { void BlockedBoxController::loadMoreRows() {
if (_loadRequestId || _allLoaded) { if (_allLoaded) {
return; return;
} }
_loadRequestId = _api.request(MTPcontacts_GetBlocked( session().api().blockedPeers().request(
MTP_int(_offset), _offset,
MTP_int(kBlockedPerPage) crl::guard(&_guard, [=](const Api::BlockedPeers::Slice &slice) {
)).done([=](const MTPcontacts_Blocked &result) { applySlice(slice);
_loadRequestId = 0; }));
auto handleContactsBlocked = [&](auto &list) {
_window->session().data().processUsers(list.vusers());
_window->session().data().processChats(list.vchats());
return list.vblocked().v;
};
switch (result.type()) {
case mtpc_contacts_blockedSlice: {
receivedPeers(handleContactsBlocked(result.c_contacts_blockedSlice()));
} break;
case mtpc_contacts_blocked: {
_allLoaded = true;
receivedPeers(handleContactsBlocked(result.c_contacts_blocked()));
} break;
default: Unexpected("Bad type() in MTPcontacts_GetBlocked() result.");
}
}).fail([this](const MTP::Error &error) {
_loadRequestId = 0;
}).send();
} }
void BlockedBoxController::rowClicked(not_null<PeerListRow*> row) { void BlockedBoxController::rowClicked(not_null<PeerListRow*> row) {
@ -255,23 +226,23 @@ void BlockedBoxController::rowClicked(not_null<PeerListRow*> row) {
} }
void BlockedBoxController::rowActionClicked(not_null<PeerListRow*> row) { void BlockedBoxController::rowActionClicked(not_null<PeerListRow*> row) {
_window->session().api().unblockPeer(row->peer()); session().api().blockedPeers().unblock(row->peer());
} }
void BlockedBoxController::receivedPeers( void BlockedBoxController::applySlice(const Api::BlockedPeers::Slice &slice) {
const QVector<MTPPeerBlocked> &result) { if (slice.list.empty()) {
if (result.empty()) {
_allLoaded = true; _allLoaded = true;
} }
_offset += result.size(); _offset += slice.list.size();
for (const auto &item : result) { for (const auto &item : slice.list) {
item.match([&](const MTPDpeerBlocked &data) { if (const auto peer = session().data().peerLoaded(item.id)) {
if (const auto peer = _window->session().data().peerLoaded(peerFromMTP(data.vpeer_id()))) { appendRow(peer);
appendRow(peer); peer->setIsBlocked(true);
peer->setIsBlocked(true); }
} }
}); if (_offset >= slice.total) {
_allLoaded = true;
} }
delegate()->peerListRefreshRows(); delegate()->peerListRefreshRows();
} }
@ -295,7 +266,7 @@ void BlockedBoxController::BlockNewPeer(
auto initBox = [=, controller = controller.get()]( auto initBox = [=, controller = controller.get()](
not_null<PeerListBox*> box) { not_null<PeerListBox*> box) {
controller->setBlockPeerCallback([=](not_null<PeerData*> peer) { controller->setBlockPeerCallback([=](not_null<PeerData*> peer) {
window->session().api().blockPeer(peer); window->session().api().blockedPeers().block(peer);
box->closeBox(); box->closeBox();
}); });
box->addButton(tr::lng_cancel(), [box] { box->closeBox(); }); box->addButton(tr::lng_cancel(), [box] { box->closeBox(); });

View file

@ -10,7 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "boxes/peer_list_box.h" #include "boxes/peer_list_box.h"
#include "boxes/edit_privacy_box.h" #include "boxes/edit_privacy_box.h"
#include "history/view/history_view_element.h" #include "history/view/history_view_element.h"
#include "mtproto/sender.h" #include "api/api_blocked_peers.h"
namespace Window { namespace Window {
class SessionController; class SessionController;
@ -32,7 +32,7 @@ public:
static void BlockNewPeer(not_null<Window::SessionController*> window); static void BlockNewPeer(not_null<Window::SessionController*> window);
private: private:
void receivedPeers(const QVector<MTPPeerBlocked> &result); void applySlice(const Api::BlockedPeers::Slice &slice);
void handleBlockedEvent(not_null<PeerData*> peer); void handleBlockedEvent(not_null<PeerData*> peer);
bool appendRow(not_null<PeerData*> peer); bool appendRow(not_null<PeerData*> peer);
@ -40,12 +40,12 @@ private:
std::unique_ptr<PeerListRow> createRow(not_null<PeerData*> peer) const; std::unique_ptr<PeerListRow> createRow(not_null<PeerData*> peer) const;
const not_null<Window::SessionController*> _window; const not_null<Window::SessionController*> _window;
MTP::Sender _api;
int _offset = 0; int _offset = 0;
mtpRequestId _loadRequestId = 0;
bool _allLoaded = false; bool _allLoaded = false;
base::has_weak_ptr _guard;
}; };
class PhoneNumberPrivacyController : public EditPrivacyController { class PhoneNumberPrivacyController : public EditPrivacyController {

View file

@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "settings/settings_privacy_security.h" #include "settings/settings_privacy_security.h"
#include "api/api_authorizations.h" #include "api/api_authorizations.h"
#include "api/api_blocked_peers.h"
#include "api/api_self_destruct.h" #include "api/api_self_destruct.h"
#include "api/api_sensitive_content.h" #include "api/api_sensitive_content.h"
#include "api/api_global_privacy.h" #include "api/api_global_privacy.h"
@ -107,8 +108,8 @@ rpl::producer<QString> PrivacyString(
} }
rpl::producer<int> BlockedPeersCount(not_null<::Main::Session*> session) { rpl::producer<int> BlockedPeersCount(not_null<::Main::Session*> session) {
return session->api().blockedPeersSlice( return session->api().blockedPeers().slice(
) | rpl::map([=](const ApiWrap::BlockedPeersSlice &data) { ) | rpl::map([](const Api::BlockedPeers::Slice &data) {
return data.total; return data.total;
}); });
} }
@ -148,7 +149,7 @@ void SetupPrivacy(
std::move( std::move(
updateTrigger updateTrigger
) | rpl::start_with_next([=] { ) | rpl::start_with_next([=] {
session->api().reloadBlockedPeers(); session->api().blockedPeers().reload();
}, blockedPeers->lifetime()); }, blockedPeers->lifetime());
using Key = Privacy::Key; using Key = Privacy::Key;

View file

@ -26,6 +26,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "apiwrap.h" #include "apiwrap.h"
#include "mainwidget.h" #include "mainwidget.h"
#include "mainwindow.h" #include "mainwindow.h"
#include "api/api_blocked_peers.h"
#include "api/api_chat_filters.h" #include "api/api_chat_filters.h"
#include "api/api_updates.h" #include "api/api_updates.h"
#include "mtproto/mtproto_config.h" #include "mtproto/mtproto_config.h"
@ -428,7 +429,7 @@ void Filler::addBlockUser(not_null<UserData*> user) {
if (user->isBlocked()) { if (user->isBlocked()) {
PeerMenuUnblockUserWithBotRestart(user); PeerMenuUnblockUserWithBotRestart(user);
} else if (user->isBot()) { } else if (user->isBot()) {
user->session().api().blockPeer(user); user->session().api().blockedPeers().block(user);
} else { } else {
window->show(Box( window->show(Box(
PeerMenuBlockUserBox, PeerMenuBlockUserBox,
@ -914,7 +915,7 @@ void PeerMenuBlockUserBox(
peer->session().updates().applyUpdates(result); peer->session().updates().applyUpdates(result);
}).send(); }).send();
} else { } else {
peer->session().api().blockPeer(peer); peer->session().api().blockedPeers().block(peer);
if (reportChecked) { if (reportChecked) {
peer->session().api().request(MTPmessages_ReportSpam( peer->session().api().request(MTPmessages_ReportSpam(
peer->input peer->input
@ -938,7 +939,7 @@ void PeerMenuBlockUserBox(
} }
void PeerMenuUnblockUserWithBotRestart(not_null<UserData*> user) { void PeerMenuUnblockUserWithBotRestart(not_null<UserData*> user) {
user->session().api().unblockPeer(user, [=] { user->session().api().blockedPeers().unblock(user, [=] {
if (user->isBot() && !user->isSupport()) { if (user->isBot() && !user->isSupport()) {
user->session().api().sendBotStart(user); user->session().api().sendBotStart(user);
} }