From d40951f068c80d78d915e3dba6a76e5e0950bac5 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 2 May 2024 03:37:26 +0300 Subject: [PATCH] Added ability to moderate non-users to moderation box. --- .../boxes/moderate_messages_box.cpp | 103 +++++++++--------- 1 file changed, 54 insertions(+), 49 deletions(-) diff --git a/Telegram/SourceFiles/boxes/moderate_messages_box.cpp b/Telegram/SourceFiles/boxes/moderate_messages_box.cpp index dbb9e7cb18..974f3bbf80 100644 --- a/Telegram/SourceFiles/boxes/moderate_messages_box.cpp +++ b/Telegram/SourceFiles/boxes/moderate_messages_box.cpp @@ -46,12 +46,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace { -using Users = std::vector>; +using Participants = std::vector>; struct ModerateOptions final { bool allCanBan = false; bool allCanDelete = false; - Users users; + Participants participants; }; ModerateOptions CalculateModerateOptions(const HistoryItemsList &items) { @@ -76,9 +76,9 @@ ModerateOptions CalculateModerateOptions(const HistoryItemsList &items) { if (!item->suggestDeleteAllReport()) { result.allCanDelete = false; } - if (const auto user = item->from()->asUser()) { - if (!ranges::contains(result.users, not_null{ user })) { - result.users.push_back(user); + if (const auto p = item->from()) { + if (!ranges::contains(result.participants, not_null{ p })) { + result.participants.push_back(p); } } } @@ -212,42 +212,45 @@ void CreateModerateMessagesBox( rpl::event_stream toggleRequestsFromTop; rpl::event_stream toggleRequestsFromInner; rpl::event_stream checkAllRequests; - Fn collectRequests; + Fn collectRequests; }; - const auto [allCanBan, allCanDelete, users] = CalculateModerateOptions( - items); + const auto [allCanBan, allCanDelete, participants] + = CalculateModerateOptions(items); const auto inner = box->verticalLayout(); - Assert(!users.empty()); + Assert(!participants.empty()); const auto confirms = inner->lifetime().make_state>(); - const auto isSingle = users.size() == 1; + const auto isSingle = participants.size() == 1; const auto buttonPadding = isSingle ? QMargins() - : QMargins(0, 0, Button::ComputeSize(users.size()).width(), 0); + : QMargins(0, 0, Button::ComputeSize(participants.size()).width(), 0); const auto session = &items.front()->history()->session(); const auto historyPeerId = items.front()->history()->peer->id; - using Request = Fn, not_null)>; - const auto sequentiallyRequest = [=](Request request, Users users) { + using Request = Fn, not_null)>; + const auto sequentiallyRequest = [=]( + Request request, + Participants participants) { constexpr auto kSmallDelayMs = 5; - const auto userIds = ranges::views::all( - users - ) | ranges::views::transform([](not_null user) { - return user->id; + const auto participantIds = ranges::views::all( + participants + ) | ranges::views::transform([](not_null peer) { + return peer->id; }) | ranges::to_vector; const auto lifetime = std::make_shared(); const auto counter = lifetime->make_state(0); const auto timer = lifetime->make_state(); timer->setCallback(crl::guard(session, [=] { - if ((*counter) < userIds.size()) { + if ((*counter) < participantIds.size()) { const auto peer = session->data().peer(historyPeerId); const auto channel = peer ? peer->asChannel() : nullptr; - const auto from = session->data().peer(userIds[*counter]); - if (const auto user = from->asUser(); channel && user) { - request(user, channel); + const auto from = session->data().peer( + participantIds[*counter]); + if (channel && from) { + request(from, channel); } (*counter)++; } else { @@ -304,7 +307,8 @@ void CreateModerateMessagesBox( }); }; - const auto createUsersList = [&](not_null controller) { + const auto createParticipantsList = [&]( + not_null controller) { const auto wrap = inner->add( object_ptr>( inner, @@ -322,8 +326,8 @@ void CreateModerateMessagesBox( auto &lifetime = wrap->lifetime(); const auto clicks = lifetime.make_state>(); const auto checkboxes = ranges::views::all( - users - ) | ranges::views::transform([&](not_null user) { + participants + ) | ranges::views::transform([&](not_null peer) { const auto line = container->add( object_ptr(container)); const auto &st = st::moderateBoxUserpic; @@ -331,11 +335,11 @@ void CreateModerateMessagesBox( const auto userpic = Ui::CreateChild( line, - user, + peer, st); const auto checkbox = Ui::CreateChild( line, - user->name(), + peer->name(), false, st::defaultBoxCheckbox); line->widthValue( @@ -381,10 +385,10 @@ void CreateModerateMessagesBox( }, container->lifetime()); controller->collectRequests = [=] { - auto result = Users(); + auto result = Participants(); for (auto i = 0; i < checkboxes.size(); i++) { if (checkboxes[i]->checked()) { - result.push_back(users[i]); + result.push_back(participants[i]); } } return result; @@ -395,12 +399,13 @@ void CreateModerateMessagesBox( not_null checkbox, not_null controller) { if (isSingle) { - const auto user = users.front(); - controller->collectRequests = [=] { return Users{ user }; }; + const auto p = participants.front(); + controller->collectRequests = [=] { return Participants{ p }; }; return; } - const auto button = Ui::CreateChild