From 9ddbc75638993655268dfc2f889017df57141ca7 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Tue, 18 Oct 2022 05:31:25 +0300 Subject: [PATCH] Added api flag support of userpic display for sponsored messages. --- Telegram/SourceFiles/data/data_sponsored_messages.cpp | 2 ++ Telegram/SourceFiles/data/data_sponsored_messages.h | 1 + Telegram/SourceFiles/history/history_inner_widget.cpp | 9 +++++++-- Telegram/SourceFiles/history/history_inner_widget.h | 3 +++ .../SourceFiles/history/history_item_components.h | 1 + Telegram/SourceFiles/history/history_message.cpp | 1 + Telegram/SourceFiles/history/history_widget.cpp | 3 +++ .../SourceFiles/history/view/history_view_message.cpp | 11 +++++++++-- 8 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Telegram/SourceFiles/data/data_sponsored_messages.cpp b/Telegram/SourceFiles/data/data_sponsored_messages.cpp index 10e69d37b..70f2793a0 100644 --- a/Telegram/SourceFiles/data/data_sponsored_messages.cpp +++ b/Telegram/SourceFiles/data/data_sponsored_messages.cpp @@ -164,6 +164,7 @@ void SponsoredMessages::append( .isExactPost = exactPost, .isRecommended = data.is_recommended(), .userpic = { .location = peer->userpicLocation() }, + .isForceUserpicDisplay = data.is_show_peer_photo(), }; }; const auto from = [&]() -> SponsoredFrom { @@ -195,6 +196,7 @@ void SponsoredMessages::append( .isChannel = data.is_channel(), .isPublic = data.is_public(), .userpic = std::move(userpic), + .isForceUserpicDisplay = message.data().is_show_peer_photo(), }; }, [&](const MTPDchatInviteAlready &data) { const auto chat = _session->data().processChat(data.vchat()); diff --git a/Telegram/SourceFiles/data/data_sponsored_messages.h b/Telegram/SourceFiles/data/data_sponsored_messages.h index be791a1c0..d61a06f9b 100644 --- a/Telegram/SourceFiles/data/data_sponsored_messages.h +++ b/Telegram/SourceFiles/data/data_sponsored_messages.h @@ -32,6 +32,7 @@ struct SponsoredFrom { bool isExactPost = false; bool isRecommended = false; ImageWithLocation userpic; + bool isForceUserpicDisplay = false; }; struct SponsoredMessage { diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 7126a9ead..a4eedfc38 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -703,6 +703,8 @@ bool HistoryInner::canHaveFromUserpics() const { && !_peer->isRepliesChat() && !_isChatWide) { return false; + } else if (_canHaveFromUserpicsSponsored) { + return true; } else if (_peer->isChannel() && !_peer->isMegagroup()) { return false; } @@ -999,8 +1001,7 @@ void HistoryInner::paintEvent(QPaintEvent *e) { : yShown(top + height / 2); if (markShown) { if (isSponsored) { - session().data().sponsoredMessages().view( - item->fullId()); + session().data().sponsoredMessages().view(item->fullId()); } else if (isUnread) { readTill = item; } @@ -3789,6 +3790,10 @@ void HistoryInner::clearChooseReportReason() { _chooseForReportReason = std::nullopt; } +void HistoryInner::setCanHaveFromUserpicsSponsored(bool value) { + _canHaveFromUserpicsSponsored = value; +} + // -1 if should not be visible, -2 if bad history() int HistoryInner::itemTop(const HistoryItem *item) const { if (!item) { diff --git a/Telegram/SourceFiles/history/history_inner_widget.h b/Telegram/SourceFiles/history/history_inner_widget.h index 6b42c2156..f9a66a113 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.h +++ b/Telegram/SourceFiles/history/history_inner_widget.h @@ -175,6 +175,8 @@ public: void setChooseReportReason(Ui::ReportReason reason); void clearChooseReportReason(); + void setCanHaveFromUserpicsSponsored(bool value); + // -1 if should not be visible, -2 if bad history() int itemTop(const HistoryItem *item) const; int itemTop(const Element *view) const; @@ -473,6 +475,7 @@ private: bool _pressWasInactive = false; bool _recountedAfterPendingResizedItems = false; bool _useCornerReaction = false; + bool _canHaveFromUserpicsSponsored = false; QPoint _trippleClickPoint; base::Timer _trippleClickTimer; diff --git a/Telegram/SourceFiles/history/history_item_components.h b/Telegram/SourceFiles/history/history_item_components.h index 2d9b71439..0b07b10a2 100644 --- a/Telegram/SourceFiles/history/history_item_components.h +++ b/Telegram/SourceFiles/history/history_item_components.h @@ -134,6 +134,7 @@ struct HistoryMessageSponsored : public RuntimeComponent sender; Type type = Type::User; bool recommended = false; + bool isForceUserpicDisplay = false; }; class ReplyToMessagePointer final { diff --git a/Telegram/SourceFiles/history/history_message.cpp b/Telegram/SourceFiles/history/history_message.cpp index 63c515061..1464ecfe2 100644 --- a/Telegram/SourceFiles/history/history_message.cpp +++ b/Telegram/SourceFiles/history/history_message.cpp @@ -1741,6 +1741,7 @@ void HistoryMessage::setSponsoredFrom(const Data::SponsoredFrom &from) { from.title, false); sponsored->recommended = from.isRecommended; + sponsored->isForceUserpicDisplay = from.isForceUserpicDisplay; if (from.userpic.location.valid()) { sponsored->sender->customUserpic.set( &history()->session(), diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 926230c03..4c43c5903 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -297,6 +297,9 @@ HistoryWidget::HistoryWidget( if (_history && _history->loadedAtBottom() && session().data().sponsoredMessages().append(_history)) { + if (_list) { + _list->setCanHaveFromUserpicsSponsored(true); + } _scroll->contentAdded(); } }, lifetime()); diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index 8e9d9c749..6b45e3830 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -1573,8 +1573,15 @@ bool Message::hasFromPhoto() const { case Context::Replies: { const auto item = message(); if (item->isPost()) { - return item->isSponsored() - && item->history()->peer->isMegagroup(); + if (item->isSponsored()) { + if (item->history()->peer->isMegagroup()) { + return true; + } + if (const auto info = item->Get()) { + return info->isForceUserpicDisplay; + } + } + return false; } if (item->isEmpty() || (context() == Context::Replies && item->isDiscussionPost())) {