From 0fb42ed82af61c998a05e5c141b9b268498edbc4 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 25 Sep 2020 15:31:36 +0300 Subject: [PATCH] Use special method for blocking from Replies. --- Telegram/Resources/tl/api.tl | 1 + Telegram/SourceFiles/boxes/report_box.cpp | 8 +-- Telegram/SourceFiles/boxes/report_box.h | 2 +- .../history/history_inner_widget.cpp | 13 +--- .../SourceFiles/window/window_peer_menu.cpp | 62 +++++++++---------- .../SourceFiles/window/window_peer_menu.h | 5 +- 6 files changed, 40 insertions(+), 51 deletions(-) diff --git a/Telegram/Resources/tl/api.tl b/Telegram/Resources/tl/api.tl index 750e1b6f8e..ce2e3b0b7e 100644 --- a/Telegram/Resources/tl/api.tl +++ b/Telegram/Resources/tl/api.tl @@ -1294,6 +1294,7 @@ contacts.toggleTopPeers#8514bdda enabled:Bool = Bool; contacts.addContact#e8f463d0 flags:# add_phone_privacy_exception:flags.0?true id:InputUser first_name:string last_name:string phone:string = Updates; contacts.acceptContact#f831a20f id:InputUser = Updates; contacts.getLocated#d348bc44 flags:# background:flags.1?true geo_point:InputGeoPoint self_expires:flags.0?int = Updates; +contacts.blockFromReplies#29a8962c flags:# delete_message:flags.0?true delete_history:flags.1?true report_spam:flags.2?true msg_id:int = Updates; messages.getMessages#63c66506 id:Vector = messages.Messages; messages.getDialogs#a0ee3b73 flags:# exclude_pinned:flags.0?true folder_id:flags.1?int offset_date:int offset_id:int offset_peer:InputPeer limit:int hash:int = messages.Dialogs; diff --git a/Telegram/SourceFiles/boxes/report_box.cpp b/Telegram/SourceFiles/boxes/report_box.cpp index 280f6f2d75..0a26a020ac 100644 --- a/Telegram/SourceFiles/boxes/report_box.cpp +++ b/Telegram/SourceFiles/boxes/report_box.cpp @@ -215,10 +215,8 @@ void ReportBox::updateMaxHeight() { void BlockSenderFromRepliesBox( not_null box, not_null controller, - MessageIdsList ids) { - Expects(!ids.empty()); - - const auto item = controller->session().data().message(ids.front()); + FullMsgId id) { + const auto item = controller->session().data().message(id); Assert(item != nullptr); PeerMenuBlockUserBox( @@ -226,5 +224,5 @@ void BlockSenderFromRepliesBox( &controller->window(), item->senderOriginal(), true, - std::move(ids)); + Window::ClearReply{ id }); } diff --git a/Telegram/SourceFiles/boxes/report_box.h b/Telegram/SourceFiles/boxes/report_box.h index f8cd90a438..04b5beb5de 100644 --- a/Telegram/SourceFiles/boxes/report_box.h +++ b/Telegram/SourceFiles/boxes/report_box.h @@ -69,4 +69,4 @@ private: void BlockSenderFromRepliesBox( not_null box, not_null controller, - MessageIdsList ids); + FullMsgId id); diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 8f24ca6f47..94a26404b6 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -3177,21 +3177,12 @@ void HistoryInner::blockSenderItem(FullMsgId itemId) { Ui::show(Box( BlockSenderFromRepliesBox, _controller, - MessageIdsList(1, itemId))); + itemId)); } } void HistoryInner::blockSenderAsGroup(FullMsgId itemId) { - if (const auto item = session().data().message(itemId)) { - const auto group = session().data().groups().find(item); - if (!group) { - return blockSenderItem(itemId); - } - Ui::show(Box( - BlockSenderFromRepliesBox, - _controller, - session().data().itemsToIds(group->items))); - } + blockSenderItem(itemId); } void HistoryInner::addSelectionRange( diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index 0ed971053a..fb03c1c69c 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -26,6 +26,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "mainwidget.h" #include "mainwindow.h" #include "api/api_chat_filters.h" +#include "api/api_updates.h" #include "mtproto/mtproto_config.h" #include "history/history.h" #include "history/history_item.h" @@ -858,7 +859,7 @@ void PeerMenuBlockUserBox( not_null window, not_null peer, std::variant suggestReport, - std::variant suggestClear) { + std::variant suggestClear) { using Flag = MTPDpeerSettings::Flag; const auto settings = peer->settings().value_or(Flag(0)); const auto reportNeeded = v::is_null(suggestReport) @@ -896,15 +897,25 @@ void PeerMenuBlockUserBox( tr::lng_blocked_list_confirm_clear(tr::now), true, st::defaultBoxCheckbox)) - : v::is(suggestClear) + : v::is(suggestClear) ? box->addRow(object_ptr( box, tr::lng_context_delete_msg(tr::now), true, st::defaultBoxCheckbox)) : nullptr; + if (clear) { + box->addSkip(st::boxMediumSkip); + } + const auto allFromUser = v::is(suggestClear) + ? box->addRow(object_ptr( + box, + tr::lng_delete_all_from(tr::now), + true, + st::defaultBoxCheckbox)) + : nullptr; - if (report || clear) { + if (allFromUser) { box->addSkip(st::boxLittleSkip); } @@ -915,43 +926,28 @@ void PeerMenuBlockUserBox( box->addButton(tr::lng_blocked_list_confirm_ok(), [=] { const auto reportChecked = report && report->checked(); const auto clearChecked = clear && clear->checked(); + const auto fromUserChecked = allFromUser && allFromUser->checked(); box->closeBox(); - peer->session().api().blockPeer(peer); - if (reportChecked) { - if (const auto ids = std::get_if(&suggestClear)) { - Assert(!ids->empty()); - const auto itemsPeer = [&]() -> PeerData* { - for (const auto &itemId : *ids) { - if (const auto item = peer->owner().message(itemId)) { - return item->history()->peer; - } - } - return nullptr; - }(); - if (itemsPeer) { - auto items = QVector(); - items.reserve(ids->size()); - for (const auto &itemId : *ids) { - items.push_back(MTP_int(itemId.msg)); - } - peer->session().api().request(MTPmessages_Report( - itemsPeer->input, - MTP_vector(items), - MTP_inputReportReasonSpam() - )).send(); - } - } else { + if (const auto clearReply = std::get_if(&suggestClear)) { + using Flag = MTPcontacts_BlockFromReplies::Flag; + peer->session().api().request(MTPcontacts_BlockFromReplies( + MTP_flags((clearChecked ? Flag::f_delete_message : Flag(0)) + | (fromUserChecked ? Flag::f_delete_history : Flag(0)) + | (reportChecked ? Flag::f_report_spam : Flag(0))), + MTP_int(clearReply->replyId.msg) + )).done([=](const MTPUpdates &result) { + peer->session().updates().applyUpdates(result); + }).send(); + } else { + peer->session().api().blockPeer(peer); + if (reportChecked) { peer->session().api().request(MTPmessages_ReportSpam( peer->input )).send(); } - } - if (clearChecked) { - if (const auto ids = std::get_if(&suggestClear)) { - peer->owner().histories().deleteMessages(*ids, false); - } else if (v::is(suggestClear)) { + if (clearChecked) { crl::on_main(&peer->session(), [=] { peer->session().api().deleteConversation(peer, false); }); diff --git a/Telegram/SourceFiles/window/window_peer_menu.h b/Telegram/SourceFiles/window/window_peer_menu.h index e64fb072c0..f4b7a34152 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.h +++ b/Telegram/SourceFiles/window/window_peer_menu.h @@ -72,12 +72,15 @@ void PeerMenuCreatePoll( struct ClearChat { }; +struct ClearReply { + FullMsgId replyId; +}; void PeerMenuBlockUserBox( not_null box, not_null window, not_null peer, std::variant suggestReport, - std::variant suggestClear); + std::variant suggestClear); void PeerMenuUnblockUserWithBotRestart(not_null user); void ToggleHistoryArchived(not_null history, bool archived);