From 1a636ab4e3dce29a08a32c5282441076fa199f23 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Sun, 14 Jun 2020 03:25:53 +0400 Subject: [PATCH] Add an option to hide messages from blocked users in groups --- Telegram/Resources/langs/rewrites/en.json | 1 + Telegram/Resources/langs/rewrites/ru.json | 1 + .../history/history_item_components.cpp | 7 +++- .../SourceFiles/history/history_widget.cpp | 29 ++++++++++++++ .../history/view/history_view_element.cpp | 7 ++++ Telegram/SourceFiles/kotato/json_settings.cpp | 5 +++ Telegram/SourceFiles/kotato/settings.cpp | 11 +++++ Telegram/SourceFiles/kotato/settings.h | 4 ++ Telegram/SourceFiles/kotato/settings_menu.cpp | 1 + Telegram/SourceFiles/main/main_session.cpp | 40 +++++++++++++++++++ 10 files changed, 104 insertions(+), 2 deletions(-) diff --git a/Telegram/Resources/langs/rewrites/en.json b/Telegram/Resources/langs/rewrites/en.json index 846807a44..3d3f8205d 100644 --- a/Telegram/Resources/langs/rewrites/en.json +++ b/Telegram/Resources/langs/rewrites/en.json @@ -167,6 +167,7 @@ "ktg_admin_log_banned_send_games": "Send games", "ktg_admin_log_banned_use_inline": "Use inline bots", "ktg_forward_go_to_chat": "Go to chat", + "ktg_settings_block_users_in_groups": "Block users in groups", "ktg_settings_forward": "Forward", "ktg_settings_forward_retain_selection": "Retain selection after forward", "ktg_settings_forward_chat_on_click": "Open chat on click", diff --git a/Telegram/Resources/langs/rewrites/ru.json b/Telegram/Resources/langs/rewrites/ru.json index be0be9f7e..e8085cb45 100644 --- a/Telegram/Resources/langs/rewrites/ru.json +++ b/Telegram/Resources/langs/rewrites/ru.json @@ -167,6 +167,7 @@ "ktg_admin_log_banned_send_games": "Отправка игр", "ktg_admin_log_banned_use_inline": "Отправка через ботов", "ktg_forward_go_to_chat": "Перейти в чат", + "ktg_settings_block_users_in_groups": "Блокировать пользователей в группах", "ktg_settings_forward": "Пересылка", "ktg_settings_forward_retain_selection": "Сохранять выделение после пересылки", "ktg_settings_forward_chat_on_click": "Открывать чат по клику", diff --git a/Telegram/SourceFiles/history/history_item_components.cpp b/Telegram/SourceFiles/history/history_item_components.cpp index 563cc4bcf..6535a7ba9 100644 --- a/Telegram/SourceFiles/history/history_item_components.cpp +++ b/Telegram/SourceFiles/history/history_item_components.cpp @@ -355,7 +355,10 @@ void HistoryMessageReply::paint( p.fillRect(rbar, bar); if (w > st::msgReplyBarSkip) { - if (replyToMsg) { + auto blocked = replyToMsg + && replyToMsg->from()->isUser() + && replyToMsg->from()->asUser()->isBlocked(); + if (replyToMsg && (!blocked || !BlockUsersInGroups())) { auto hasPreview = replyToMsg->media() ? replyToMsg->media()->hasReplyPreview() : false; if (hasPreview && w < st::msgReplyBarSkip + st::msgReplyBarSize.height()) { hasPreview = false; @@ -402,7 +405,7 @@ void HistoryMessageReply::paint( p.setPen(inBubble ? stm->msgDateFg : st->msgDateImgFg()); - p.drawTextLeft(x + st::msgReplyBarSkip, y + st::msgReplyPadding.top() + (st::msgReplyBarSize.height() - st::msgDateFont->height) / 2, w + 2 * x, st::msgDateFont->elided(replyToMsgId ? tr::lng_profile_loading(tr::now) : tr::lng_deleted_message(tr::now), w - st::msgReplyBarSkip)); + p.drawTextLeft(x + st::msgReplyBarSkip, y + st::msgReplyPadding.top() + (st::msgReplyBarSize.height() - st::msgDateFont->height) / 2, w + 2 * x, st::msgDateFont->elided((replyToMsgId && (!blocked || !BlockUsersInGroups())) ? tr::lng_profile_loading(tr::now) : tr::lng_deleted_message(tr::now), w - st::msgReplyBarSkip)); } } } diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 4324c7edc..8466e0055 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -641,6 +641,35 @@ HistoryWidget::HistoryWidget( }); }, lifetime()); + BlockUsersInGroupsChanges( + ) | rpl::start_with_next([=] { + crl::on_main(this, [=] { + if (_history) { + _history->forceFullResize(); + if (_migrated) { + _migrated->forceFullResize(); + } + updateHistoryGeometry(); + update(); + } + }); + }, lifetime()); + + session().changes().peerUpdates( + Data::PeerUpdate::Flag::IsBlocked + ) | rpl::start_with_next([=] { + crl::on_main(this, [=] { + if (_history) { + _history->forceFullResize(); + if (_migrated) { + _migrated->forceFullResize(); + } + updateHistoryGeometry(); + update(); + } + }); + }, lifetime()); + HoverEmojiPanelChanges( ) | rpl::start_with_next([=] { crl::on_main(this, [=] { diff --git a/Telegram/SourceFiles/history/view/history_view_element.cpp b/Telegram/SourceFiles/history/view/history_view_element.cpp index e588bdb92..ee8133474 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.cpp +++ b/Telegram/SourceFiles/history/view/history_view_element.cpp @@ -28,6 +28,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/toast/toast.h" #include "ui/toasts/common_toasts.h" #include "data/data_session.h" +#include "data/data_user.h" #include "data/data_groups.h" #include "data/data_media_types.h" #include "lang/lang_keys.h" @@ -477,6 +478,12 @@ bool Element::isHiddenByGroup() const { } bool Element::isHidden() const { + if (BlockUsersInGroups() + && data()->from()->isUser() + && data()->from()->asUser()->isBlocked()) { + return true; + } + return isHiddenByGroup(); } diff --git a/Telegram/SourceFiles/kotato/json_settings.cpp b/Telegram/SourceFiles/kotato/json_settings.cpp index 7b1fab50a..37f657bd4 100644 --- a/Telegram/SourceFiles/kotato/json_settings.cpp +++ b/Telegram/SourceFiles/kotato/json_settings.cpp @@ -366,6 +366,7 @@ QByteArray GenerateSettingsJson(bool areDefault = false) { settings.insert(qsl("sticker_scale_both"), StickerScaleBoth()); settings.insert(qsl("adaptive_bubbles"), AdaptiveBubbles()); settings.insert(qsl("big_emoji_outline"), BigEmojiOutline()); + settings.insert(qsl("block_users_in_groups"), BlockUsersInGroups()); settings.insert(qsl("always_show_scheduled"), cAlwaysShowScheduled()); settings.insert(qsl("show_chat_id"), ShowChatId()); settings.insert(qsl("show_phone_in_drawer"), cShowPhoneInDrawer()); @@ -529,6 +530,10 @@ bool Manager::readCustomFile() { SetBigEmojiOutline(v); }); + ReadBoolOption(settings, "block_users_in_groups", [&](auto v) { + SetBlockUsersInGroups(v); + }); + ReadBoolOption(settings, "always_show_scheduled", [&](auto v) { cSetAlwaysShowScheduled(v); }); diff --git a/Telegram/SourceFiles/kotato/settings.cpp b/Telegram/SourceFiles/kotato/settings.cpp index e073d96f6..0b2dd5241 100644 --- a/Telegram/SourceFiles/kotato/settings.cpp +++ b/Telegram/SourceFiles/kotato/settings.cpp @@ -79,6 +79,17 @@ rpl::producer MonospaceLargeBubblesChanges() { return gMonospaceLargeBubbles.changes(); } +rpl::variable gBlockUsersInGroups = false; +void SetBlockUsersInGroups(bool enabled) { + gBlockUsersInGroups = enabled; +} +bool BlockUsersInGroups() { + return gBlockUsersInGroups.current(); +} +rpl::producer BlockUsersInGroupsChanges() { + return gBlockUsersInGroups.changes(); +} + bool gAlwaysShowScheduled = false; rpl::variable gShowChatId = 2; diff --git a/Telegram/SourceFiles/kotato/settings.h b/Telegram/SourceFiles/kotato/settings.h index 6d3a82d9d..dcc98b319 100644 --- a/Telegram/SourceFiles/kotato/settings.h +++ b/Telegram/SourceFiles/kotato/settings.h @@ -62,6 +62,10 @@ void SetMonospaceLargeBubbles(bool enabled); [[nodiscard]] bool MonospaceLargeBubbles(); [[nodiscard]] rpl::producer MonospaceLargeBubblesChanges(); +void SetBlockUsersInGroups(bool enabled); +[[nodiscard]] bool BlockUsersInGroups(); +[[nodiscard]] rpl::producer BlockUsersInGroupsChanges(); + DeclareSetting(bool, AlwaysShowScheduled); void SetShowChatId(int chatIdType); diff --git a/Telegram/SourceFiles/kotato/settings_menu.cpp b/Telegram/SourceFiles/kotato/settings_menu.cpp index 6c9ab475b..d7760b729 100644 --- a/Telegram/SourceFiles/kotato/settings_menu.cpp +++ b/Telegram/SourceFiles/kotato/settings_menu.cpp @@ -444,6 +444,7 @@ void SetupKotatoMessages(not_null container) { } SettingsMenuSwitch(ktg_settings_emoji_outline, BigEmojiOutline); + SettingsMenuSwitch(ktg_settings_block_users_in_groups, BlockUsersInGroups); AddSkip(container); } diff --git a/Telegram/SourceFiles/main/main_session.cpp b/Telegram/SourceFiles/main/main_session.cpp index 99e02e2aa..40d4f8fa1 100644 --- a/Telegram/SourceFiles/main/main_session.cpp +++ b/Telegram/SourceFiles/main/main_session.cpp @@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_updates.h" #include "api/api_send_progress.h" #include "api/api_user_privacy.h" +#include "api/api_blocked_peers.h" #include "main/main_account.h" #include "main/main_domain.h" #include "main/main_session_settings.h" @@ -61,6 +62,43 @@ constexpr auto kTmpPasswordReserveTime = TimeId(10); return MTP::ConfigFields().internalLinksDomain; } +void InitializeBlockedPeers(not_null session) { + const auto offset = std::make_shared(0); + const auto allLoaded = std::make_shared(false); + const auto applySlice = [=]( + const Api::BlockedPeers::Slice &slice, + auto self) -> void { + if (slice.list.empty()) { + *allLoaded = true; + } + + *offset += slice.list.size(); + for (const auto &item : slice.list) { + if (const auto peer = session->data().peerLoaded(item.id)) { + peer->setIsBlocked(true); + } + } + if (*offset >= slice.total) { + *allLoaded = true; + } + + if (!*allLoaded) { + session->api().blockedPeers().request( + *offset, + [=](const Api::BlockedPeers::Slice &slice) { + self(slice, self); + }); + } + }; + + session->api().blockedPeers().slice( + ) | rpl::take( + 1 + ) | rpl::start_with_next([=](const Api::BlockedPeers::Slice &result) { + applySlice(result, applySlice); + }, session->lifetime()); +} + } // namespace Session::Session( @@ -149,6 +187,8 @@ Session::Session( _api->requestNotifySettings(MTP_inputNotifyUsers()); _api->requestNotifySettings(MTP_inputNotifyChats()); _api->requestNotifySettings(MTP_inputNotifyBroadcasts()); + + InitializeBlockedPeers(this); } void Session::setTmpPassword(const QByteArray &password, TimeId validUntil) { -- 2.33.1