From a23f7350743830fa203fcaafefd0e98eef4f9ff2 Mon Sep 17 00:00:00 2001 From: Misty Date: Mon, 9 Jan 2023 14:25:26 +0800 Subject: [PATCH] Add an option to hide messages from blocked users in groups Cherry picked from https://github.com/ilya-fedin/kotatogram-desktop/commit/51ec84e88a3c60d6ba65ba2400d76eea97ef7745 --- Telegram/Resources/langs/lang.strings | 1 + Telegram/SourceFiles/core/fork_settings.cpp | 5 +++ Telegram/SourceFiles/core/fork_settings.h | 7 ++++ .../history/history_item_components.cpp | 10 ++++- .../history/view/history_view_element.cpp | 7 ++++ Telegram/SourceFiles/main/main_session.cpp | 40 +++++++++++++++++++ .../SourceFiles/settings/settings_fork.cpp | 9 +++++ 7 files changed, 77 insertions(+), 2 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 7296d040b6c25..5e046b4b65c84 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -461,6 +461,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_settings_use_original_tray_icon" = "Use original tray icon"; "lng_settings_auto_submit_passcode" = "Auto-submit local passcode"; "lng_settings_emoji_on_click" = "Disable emoji popup display on hovering"; +"lng_settings_block_users_in_groups" = "Block users in groups"; "lng_settings_custom_sticker_size" = "Custom Sticker Size"; "lng_settings_sticker_size_label" = "Allowed values are between 50 and 256."; diff --git a/Telegram/SourceFiles/core/fork_settings.cpp b/Telegram/SourceFiles/core/fork_settings.cpp index 20d13a5d4d4b1..f40572c02d404 100644 --- a/Telegram/SourceFiles/core/fork_settings.cpp +++ b/Telegram/SourceFiles/core/fork_settings.cpp @@ -42,6 +42,7 @@ QByteArray ForkSettings::serialize() const { << qint32(_useOriginalTrayIcon ? 1 : 0) << qint32(_autoSubmitPasscode ? 1 : 0) << qint32(_emojiPopupOnClick ? 1 : 0) + << qint32(_blockUsersInGroups ? 1 : 0) ; } return result; @@ -68,6 +69,7 @@ void ForkSettings::addFromSerialized(const QByteArray &serialized) { qint32 useOriginalTrayIcon = _useOriginalTrayIcon; qint32 autoSubmitPasscode = _autoSubmitPasscode; qint32 emojiPopupOnClick = _emojiPopupOnClick; + qint32 blockUsersInGroups = _blockUsersInGroups; if (!stream.atEnd()) { stream @@ -84,6 +86,7 @@ void ForkSettings::addFromSerialized(const QByteArray &serialized) { >> useOriginalTrayIcon >> autoSubmitPasscode >> emojiPopupOnClick + >> blockUsersInGroups ; } if (stream.status() != QDataStream::Ok) { @@ -106,6 +109,7 @@ void ForkSettings::addFromSerialized(const QByteArray &serialized) { _useOriginalTrayIcon = (useOriginalTrayIcon == 1); _autoSubmitPasscode = (autoSubmitPasscode == 1); _emojiPopupOnClick = (emojiPopupOnClick == 1); + _blockUsersInGroups = (blockUsersInGroups == 1); } void ForkSettings::resetOnLastLogout() { @@ -121,6 +125,7 @@ void ForkSettings::resetOnLastLogout() { _useOriginalTrayIcon = false; _autoSubmitPasscode = false; _emojiPopupOnClick = false; + _blockUsersInGroups = false; } } // namespace Core diff --git a/Telegram/SourceFiles/core/fork_settings.h b/Telegram/SourceFiles/core/fork_settings.h index 8a5a7c274ad8d..7e3826d0f83bb 100644 --- a/Telegram/SourceFiles/core/fork_settings.h +++ b/Telegram/SourceFiles/core/fork_settings.h @@ -92,6 +92,12 @@ class ForkSettings final { void setEmojiPopupOnClick(bool newValue) { _emojiPopupOnClick = newValue; } + [[nodiscard]] bool blockUsersInGroups() const { + return _blockUsersInGroups; + } + void setBlockUsersInGroups(bool newValue) { + _blockUsersInGroups = newValue; + } private: bool _squareUserpics = false; @@ -107,6 +113,7 @@ class ForkSettings final { bool _useOriginalTrayIcon = false; bool _autoSubmitPasscode = false; bool _emojiPopupOnClick = false; + bool _blockUsersInGroups = false; }; diff --git a/Telegram/SourceFiles/history/history_item_components.cpp b/Telegram/SourceFiles/history/history_item_components.cpp index af040478229c1..1c4b4a54da923 100644 --- a/Telegram/SourceFiles/history/history_item_components.cpp +++ b/Telegram/SourceFiles/history/history_item_components.cpp @@ -24,6 +24,8 @@ For license and copyright information please follow this link: #include "history/view/history_view_message.h" // FromNameFg. #include "history/view/history_view_service_message.h" #include "history/view/media/history_view_document.h" +#include "core/application.h" +#include "core/core_settings.h" #include "core/click_handler_types.h" #include "core/ui_integration.h" #include "layout/layout_position.h" @@ -477,7 +479,11 @@ void HistoryMessageReply::paint( } if (w > st::msgReplyBarSkip) { - if (replyToMsg) { + auto blocked = replyToMsg + && replyToMsg->from()->isUser() + && replyToMsg->from()->asUser()->isBlocked(); + const auto blockUsersInGroups = Core::App().settings().fork().blockUsersInGroups(); + if (replyToMsg && (!blocked || !blockUsersInGroups)) { const auto media = replyToMsg->media(); auto hasPreview = media && media->hasReplyPreview(); if (hasPreview && w < st::msgReplyBarSkip + st::msgReplyBarSize.height()) { @@ -546,7 +552,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/view/history_view_element.cpp b/Telegram/SourceFiles/history/view/history_view_element.cpp index b7f60e954c903..7ecc536c8199e 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.cpp +++ b/Telegram/SourceFiles/history/view/history_view_element.cpp @@ -42,6 +42,7 @@ For license and copyright information please follow this link: #include "ui/item_text_options.h" #include "ui/painter.h" #include "data/data_session.h" +#include "data/data_user.h" #include "data/data_groups.h" #include "data/data_forum.h" #include "data/data_forum_topic.h" @@ -586,6 +587,12 @@ bool Element::isHiddenByGroup() const { } bool Element::isHidden() const { + const auto blockUsersInGroups = Core::App().settings().fork().blockUsersInGroups(); + if (blockUsersInGroups + && data()->from()->isUser() + && data()->from()->asUser()->isBlocked()) { + return true; + } return isHiddenByGroup(); } diff --git a/Telegram/SourceFiles/main/main_session.cpp b/Telegram/SourceFiles/main/main_session.cpp index 2fa2592470ee3..755c8bda20c7d 100644 --- a/Telegram/SourceFiles/main/main_session.cpp +++ b/Telegram/SourceFiles/main/main_session.cpp @@ -11,6 +11,7 @@ For license and copyright information please follow this link: #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" @@ -72,6 +73,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( @@ -179,6 +217,8 @@ Session::Session( _api->requestNotifySettings(MTP_inputNotifyChats()); _api->requestNotifySettings(MTP_inputNotifyBroadcasts()); + InitializeBlockedPeers(this); + Core::App().downloadManager().trackSession(this); } diff --git a/Telegram/SourceFiles/settings/settings_fork.cpp b/Telegram/SourceFiles/settings/settings_fork.cpp index 58af3c609bba1..8d0c5ccf6fbaf 100644 --- a/Telegram/SourceFiles/settings/settings_fork.cpp +++ b/Telegram/SourceFiles/settings/settings_fork.cpp @@ -407,6 +407,15 @@ void SetupForkContent( Core::App().settings().fork().setEmojiPopupOnClick(checked); }); + // + addRestart( + tr::lng_settings_block_users_in_groups(tr::now), + [] { return Core::App().settings().fork().blockUsersInGroups(); }, + [=](bool checked) { + Core::App().settings().fork().setBlockUsersInGroups(checked); + Core::App().saveSettingsDelayed(); + }); + AddDivider(inner); }