From a64c8c52b4d3ff3f0800fe310ccf99e0b0a9b755 Mon Sep 17 00:00:00 2001
From: John Preston <johnprestonmail@gmail.com>
Date: Sat, 25 May 2019 17:05:57 +0200
Subject: [PATCH] Correctly display discussion posts sender.

---
 .../SourceFiles/dialogs/dialogs_layout.cpp    | 10 ++-----
 Telegram/SourceFiles/history/history_item.cpp | 28 ++++++++++++++++++-
 Telegram/SourceFiles/history/history_item.h   |  4 +++
 .../history/history_item_components.cpp       |  6 ++--
 .../SourceFiles/history/history_message.cpp   | 26 -----------------
 .../SourceFiles/history/history_message.h     |  3 --
 .../SourceFiles/history/history_widget.cpp    |  6 ++--
 7 files changed, 37 insertions(+), 46 deletions(-)

diff --git a/Telegram/SourceFiles/dialogs/dialogs_layout.cpp b/Telegram/SourceFiles/dialogs/dialogs_layout.cpp
index 48182e3be..910190f94 100644
--- a/Telegram/SourceFiles/dialogs/dialogs_layout.cpp
+++ b/Telegram/SourceFiles/dialogs/dialogs_layout.cpp
@@ -740,14 +740,8 @@ void RowPainter::paint(
 	auto history = item->history();
 	auto cloudDraft = nullptr;
 	const auto from = [&] {
-		if (const auto searchChat = row->searchInChat()) {
-			if (const auto peer = searchChat.peer()) {
-				if (peer->isSelf()) {
-					return item->senderOriginal();
-				} else if (!peer->isChannel() || peer->isMegagroup()) {
-					return item->from().get();
-				}
-			}
+		if (row->searchInChat()) {
+			return item->displayFrom();
 		}
 		return history->peer->migrateTo()
 			? history->peer->migrateTo()
diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp
index 1b20579cd..2956eed31 100644
--- a/Telegram/SourceFiles/history/history_item.cpp
+++ b/Telegram/SourceFiles/history/history_item.cpp
@@ -218,6 +218,32 @@ ReplyKeyboard *HistoryItem::inlineReplyKeyboard() {
 	return nullptr;
 }
 
+ChannelData *HistoryItem::discussionPostOriginalSender() const {
+	if (!history()->peer->isMegagroup()) {
+		return nullptr;
+	}
+	if (const auto forwarded = Get<HistoryMessageForwarded>()) {
+		const auto from = forwarded->savedFromPeer;
+		if (const auto result = from ? from->asChannel() : nullptr) {
+			return result;
+		}
+	}
+	return nullptr;
+}
+
+bool HistoryItem::isDiscussionPost() const {
+	return (discussionPostOriginalSender() != nullptr);
+}
+
+PeerData *HistoryItem::displayFrom() const {
+	if (const auto sender = discussionPostOriginalSender()) {
+		return sender;
+	} else if (history()->peer->isSelf()) {
+		return senderOriginal();
+	}
+	return author().get();
+}
+
 void HistoryItem::invalidateChatListEntry() {
 	if (const auto main = App::main()) {
 		// #TODO feeds search results
@@ -706,7 +732,7 @@ QString HistoryItem::inDialogsText(DrawInDialog way) const {
 		if (isPost() || isEmpty() || (way == DrawInDialog::WithoutSender)) {
 			return nullptr;
 		} else if (!_history->peer->isUser() || out()) {
-			return author();
+			return displayFrom();
 		} else if (_history->peer->isSelf() && !Has<HistoryMessageForwarded>()) {
 			return senderOriginal();
 		}
diff --git a/Telegram/SourceFiles/history/history_item.h b/Telegram/SourceFiles/history/history_item.h
index dc4aa5e3c..a5519d4d2 100644
--- a/Telegram/SourceFiles/history/history_item.h
+++ b/Telegram/SourceFiles/history/history_item.h
@@ -305,6 +305,10 @@ public:
 	HistoryMessageReplyMarkup *inlineReplyMarkup();
 	ReplyKeyboard *inlineReplyKeyboard();
 
+	[[nodiscard]] ChannelData *discussionPostOriginalSender() const;
+	[[nodiscard]] bool isDiscussionPost() const;
+	[[nodiscard]] PeerData *displayFrom() const;
+
 	virtual std::unique_ptr<HistoryView::Element> createView(
 		not_null<HistoryView::ElementDelegate*> delegate) = 0;
 
diff --git a/Telegram/SourceFiles/history/history_item_components.cpp b/Telegram/SourceFiles/history/history_item_components.cpp
index 30c1b6adc..b6c167586 100644
--- a/Telegram/SourceFiles/history/history_item_components.cpp
+++ b/Telegram/SourceFiles/history/history_item_components.cpp
@@ -234,10 +234,8 @@ bool HistoryMessageReply::isNameUpdated() const {
 void HistoryMessageReply::updateName() const {
 	if (replyToMsg) {
 		const auto from = [&] {
-			if (const auto message = replyToMsg->toHistoryMessage()) {
-				if (const auto from = message->displayFrom()) {
-					return from;
-				}
+			if (const auto from = replyToMsg->displayFrom()) {
+				return from;
 			}
 			return replyToMsg->author().get();
 		}();
diff --git a/Telegram/SourceFiles/history/history_message.cpp b/Telegram/SourceFiles/history/history_message.cpp
index 5472ed333..e874f1194 100644
--- a/Telegram/SourceFiles/history/history_message.cpp
+++ b/Telegram/SourceFiles/history/history_message.cpp
@@ -577,32 +577,6 @@ int HistoryMessage::viewsCount() const {
 	return HistoryItem::viewsCount();
 }
 
-ChannelData *HistoryMessage::discussionPostOriginalSender() const {
-	if (!history()->peer->isMegagroup()) {
-		return nullptr;
-	}
-	if (const auto forwarded = Get<HistoryMessageForwarded>()) {
-		const auto from = forwarded->savedFromPeer;
-		if (const auto result = from ? from->asChannel() : nullptr) {
-			return result;
-		}
-	}
-	return nullptr;
-}
-
-bool HistoryMessage::isDiscussionPost() const {
-	return (discussionPostOriginalSender() != nullptr);
-}
-
-PeerData *HistoryMessage::displayFrom() const {
-	if (const auto sender = discussionPostOriginalSender()) {
-		return sender;
-	} else if (history()->peer->isSelf()) {
-		return senderOriginal();
-	}
-	return author().get();
-}
-
 bool HistoryMessage::updateDependencyItem() {
 	if (const auto reply = Get<HistoryMessageReply>()) {
 		return reply->updateData(this, true);
diff --git a/Telegram/SourceFiles/history/history_message.h b/Telegram/SourceFiles/history/history_message.h
index 454e7147b..0ab283c42 100644
--- a/Telegram/SourceFiles/history/history_message.h
+++ b/Telegram/SourceFiles/history/history_message.h
@@ -131,13 +131,10 @@ public:
 	[[nodiscard]] bool textHasLinks() const override;
 
 	[[nodiscard]] int viewsCount() const override;
-	[[nodiscard]] PeerData *displayFrom() const;
 	bool updateDependencyItem() override;
 	[[nodiscard]] MsgId dependencyMsgId() const override {
 		return replyToId();
 	}
-	[[nodiscard]] ChannelData *discussionPostOriginalSender() const;
-	[[nodiscard]] bool isDiscussionPost() const;
 
 	// dynamic_cast optimization.
 	[[nodiscard]] HistoryMessage *toHistoryMessage() override {
diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp
index 2bd240ab4..cdd153f5c 100644
--- a/Telegram/SourceFiles/history/history_widget.cpp
+++ b/Telegram/SourceFiles/history/history_widget.cpp
@@ -6437,10 +6437,8 @@ void HistoryWidget::updateReplyToName() {
 	}
 	const auto from = [&] {
 		const auto item = _replyEditMsg ? _replyEditMsg : _kbReplyTo;
-		if (const auto message = item->toHistoryMessage()) {
-			if (const auto from = message->displayFrom()) {
-				return from;
-			}
+		if (const auto from = item->displayFrom()) {
+			return from;
 		}
 		return item->author().get();
 	}();