| 75 | } |
| 76 | |
| 77 | void BlockedPeers::block(not_null<PeerData*> peer) { |
| 78 | if (peer->isBlocked()) { |
| 79 | _session->changes().peerUpdated( |
| 80 | peer, |
| 81 | Data::PeerUpdate::Flag::IsBlocked); |
| 82 | return; |
| 83 | } else if (blockAlreadySent(peer, true)) { |
| 84 | return; |
| 85 | } |
| 86 | const auto requestId = _api.request(MTPcontacts_Block( |
| 87 | MTP_flags(0), |
| 88 | peer->input() |
| 89 | )).done([=] { |
| 90 | const auto data = _blockRequests.take(peer); |
| 91 | peer->setIsBlocked(true); |
| 92 | |
| 93 | if (GetEnhancedBool("blocked_user_spoiler_mode")) { |
| 94 | if (!blockExist(peer->id.value)) { |
| 95 | EnhancedSettings::Manager().addIdToBlocklist(int64(peer->id.value)); |
| 96 | } |
| 97 | auto &histories = _session->data().histories(); |
| 98 | histories.editHistoriesMessages(peer, true); |
| 99 | } |
| 100 | |
| 101 | if (_slice) { |
| 102 | _slice->list.insert( |
| 103 | _slice->list.begin(), |
| 104 | { peer->id, base::unixtime::now() }); |
| 105 | ++_slice->total; |
| 106 | _changes.fire_copy(*_slice); |
| 107 | } |
| 108 | if (data) { |
| 109 | for (const auto &callback : data->callbacks) { |
| 110 | callback(false); |
| 111 | } |
| 112 | } |
| 113 | }).fail([=] { |
| 114 | if (const auto data = _blockRequests.take(peer)) { |
| 115 | for (const auto &callback : data->callbacks) { |
| 116 | callback(false); |
| 117 | } |
| 118 | } |
| 119 | }).send(); |
| 120 | |
| 121 | _blockRequests.emplace(peer, Request{ |
| 122 | .requestId = requestId, |
| 123 | .blocking = true, |
| 124 | }); |
| 125 | } |
| 126 | |
| 127 | void BlockedPeers::unblock( |
| 128 | not_null<PeerData*> peer, |
no test coverage detected