From b6c966f18bb3af03d99cd50155036812c7bf2c2e Mon Sep 17 00:00:00 2001
From: AlexeyZavar <sltkval1@gmail.com>
Date: Fri, 19 Apr 2024 00:16:59 +0300
Subject: [PATCH] feat: improve hide from blocked users

---
 .../ayu/utils/telegram_helpers.cpp            | 26 +++++++++++++++++++
 .../SourceFiles/ayu/utils/telegram_helpers.h  |  2 ++
 Telegram/SourceFiles/history/history_item.cpp |  5 ++++
 .../history/view/history_view_element.cpp     | 15 ++---------
 .../history/view/history_view_send_action.cpp | 11 ++++++++
 .../info/media/info_media_provider.cpp        | 10 +++++++
 6 files changed, 56 insertions(+), 13 deletions(-)

diff --git a/Telegram/SourceFiles/ayu/utils/telegram_helpers.cpp b/Telegram/SourceFiles/ayu/utils/telegram_helpers.cpp
index c93f8171c..24560472f 100644
--- a/Telegram/SourceFiles/ayu/utils/telegram_helpers.cpp
+++ b/Telegram/SourceFiles/ayu/utils/telegram_helpers.cpp
@@ -29,12 +29,14 @@
 #include "data/data_session.h"
 #include "history/history.h"
 #include "history/history_item.h"
+#include "history/history_item_components.h"
 #include "history/history_unread_things.h"
 #include "main/main_account.h"
 #include "main/main_session.h"
 #include "ui/text/format_values.h"
 
 #include "ayu/ayu_settings.h"
+#include "ayu/ayu_state.h"
 
 // https://github.com/AyuGram/AyuGram4AX/blob/rewrite/TMessagesProj/src/main/java/com/radolyn/ayugram/AyuConstants.java
 std::unordered_set<ID> ayugram_channels = {
@@ -160,6 +162,30 @@ bool isExteraRelated(ID peerId) {
 	return extera_devs.contains(peerId) || extera_channels.contains(peerId);
 }
 
+bool isMessageHidden(const not_null<HistoryItem*> item) {
+	if (AyuState::isHidden(item)) {
+		return true;
+	}
+
+	const auto settings = &AyuSettings::getInstance();
+	if (settings->hideFromBlocked) {
+		if (item->from()->isUser() &&
+			item->from()->asUser()->isBlocked()) {
+			return true;
+		}
+
+		if (const auto forwarded = item->Get<HistoryMessageForwarded>()) {
+			if (forwarded->originalSender &&
+				forwarded->originalSender->isUser() &&
+				forwarded->originalSender->asUser()->isBlocked()) {
+				return true;
+			}
+		}
+	}
+
+	return false;
+}
+
 void MarkAsReadChatList(not_null<Dialogs::MainList*> list) {
 	auto mark = std::vector<not_null<History*>>();
 	for (const auto &row : list->indexed()->all()) {
diff --git a/Telegram/SourceFiles/ayu/utils/telegram_helpers.h b/Telegram/SourceFiles/ayu/utils/telegram_helpers.h
index 7fca26cab..f530dcb6d 100644
--- a/Telegram/SourceFiles/ayu/utils/telegram_helpers.h
+++ b/Telegram/SourceFiles/ayu/utils/telegram_helpers.h
@@ -25,6 +25,8 @@ ID getBareID(not_null<PeerData*> peer);
 bool isAyuGramRelated(ID peerId);
 bool isExteraRelated(ID peerId);
 
+bool isMessageHidden(not_null<HistoryItem*> item);
+
 void MarkAsReadChatList(not_null<Dialogs::MainList*> list);
 void MarkAsReadThread(not_null<Data::Thread*> thread);
 
diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp
index 4a523dc0d..5d275fd74 100644
--- a/Telegram/SourceFiles/history/history_item.cpp
+++ b/Telegram/SourceFiles/history/history_item.cpp
@@ -68,6 +68,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 
 // AyuGram includes
 #include "ayu/ayu_settings.h"
+#include "ayu/ayu_state.h"
 #include "ayu/features/messageshot/message_shot.h"
 #include "ayu/utils/telegram_helpers.h"
 
@@ -3200,6 +3201,10 @@ MessageGroupId HistoryItem::groupId() const {
 }
 
 bool HistoryItem::isEmpty() const {
+	if (isMessageHidden(const_cast<HistoryItem*>(this))) {
+		return true;
+	}
+
 	return _text.empty()
 		&& !_media
 		&& !Has<HistoryMessageLogEntryOriginal>();
diff --git a/Telegram/SourceFiles/history/view/history_view_element.cpp b/Telegram/SourceFiles/history/view/history_view_element.cpp
index 5546b3361..7b85383ba 100644
--- a/Telegram/SourceFiles/history/view/history_view_element.cpp
+++ b/Telegram/SourceFiles/history/view/history_view_element.cpp
@@ -52,7 +52,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 #include "ayu/ayu_settings.h"
 #include "ayu/ayu_state.h"
 #include "ayu/features/messageshot/message_shot.h"
-
+#include "ayu/utils/telegram_helpers.h"
 
 namespace HistoryView {
 namespace {
@@ -715,18 +715,7 @@ bool Element::isHiddenByGroup() const {
 }
 
 bool Element::isHidden() const {
-	if (AyuState::isHidden(data())) {
-		return true;
-	}
-	const auto settings = &AyuSettings::getInstance();
-	if (settings->hideFromBlocked) {
-		if (data()->from()->isUser() &&
-			data()->from()->asUser()->isBlocked()) {
-			return true;
-		}
-	}
-
-	return isHiddenByGroup();
+	return isMessageHidden(data()) || isHiddenByGroup();
 }
 
 void Element::overrideMedia(std::unique_ptr<Media> media) {
diff --git a/Telegram/SourceFiles/history/view/history_view_send_action.cpp b/Telegram/SourceFiles/history/view/history_view_send_action.cpp
index 460941e6d..55957c5b2 100644
--- a/Telegram/SourceFiles/history/view/history_view_send_action.cpp
+++ b/Telegram/SourceFiles/history/view/history_view_send_action.cpp
@@ -20,6 +20,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 #include "ui/painter.h"
 #include "styles/style_dialogs.h"
 
+// AyuGram includes
+#include "ayu/ayu_settings.h"
+
+
 namespace HistoryView {
 namespace {
 
@@ -63,6 +67,13 @@ bool SendActionPainter::updateNeedsAnimating(
 		return false;
 	}
 
+	const auto settings = &AyuSettings::getInstance();
+	if (settings->hideFromBlocked) {
+		if (user->isBlocked()) {
+			return false;
+		}
+	}
+
 	const auto now = crl::now();
 	const auto emplaceAction = [&](
 			Type type,
diff --git a/Telegram/SourceFiles/info/media/info_media_provider.cpp b/Telegram/SourceFiles/info/media/info_media_provider.cpp
index 2fc69733e..738eb2c24 100644
--- a/Telegram/SourceFiles/info/media/info_media_provider.cpp
+++ b/Telegram/SourceFiles/info/media/info_media_provider.cpp
@@ -26,6 +26,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 #include "styles/style_info.h"
 #include "styles/style_overview.h"
 
+// AyuGram includes
+#include "ayu/ayu_settings.h"
+#include "ayu/utils/telegram_helpers.h"
+
+
 namespace Info::Media {
 namespace {
 
@@ -410,6 +415,11 @@ std::unique_ptr<BaseLayout> Provider::createLayout(
 	if (!item) {
 		return nullptr;
 	}
+
+	if (isMessageHidden(item)) {
+		return nullptr;
+	}
+
 	const auto getPhoto = [&]() -> PhotoData* {
 		if (const auto media = item->media()) {
 			return media->photo();