diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index d66174c5a0..3d77a1a073 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1335,6 +1335,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_forwarded_imported" = "This message was imported from another app. It may not be real."; "lng_signed_author" = "Author: {user}"; "lng_in_reply_to" = "In reply to"; +"lng_sponsored" = "sponsored"; "lng_edited" = "edited"; "lng_edited_date" = "Edited: {date}"; "lng_sent_date" = "Sent: {date}"; diff --git a/Telegram/SourceFiles/history/history_item_components.cpp b/Telegram/SourceFiles/history/history_item_components.cpp index 4449f9153d..8875f9d079 100644 --- a/Telegram/SourceFiles/history/history_item_components.cpp +++ b/Telegram/SourceFiles/history/history_item_components.cpp @@ -116,6 +116,17 @@ int HistoryMessageEdited::maxWidth() const { return text.maxWidth(); } +HistoryMessageSponsored::HistoryMessageSponsored() { + text.setText( + st::msgDateTextStyle, + tr::lng_sponsored(tr::now), + Ui::NameTextOptions()); +} + +int HistoryMessageSponsored::maxWidth() const { + return text.maxWidth(); +} + HiddenSenderInfo::HiddenSenderInfo(const QString &name, bool external) : name(name) , colorPeerId(Data::FakePeerIdForJustName(name)) diff --git a/Telegram/SourceFiles/history/history_item_components.h b/Telegram/SourceFiles/history/history_item_components.h index 52d129dc04..b41504da21 100644 --- a/Telegram/SourceFiles/history/history_item_components.h +++ b/Telegram/SourceFiles/history/history_item_components.h @@ -77,6 +77,15 @@ struct HistoryMessageEdited : public RuntimeComponent { + HistoryMessageSponsored(); + int maxWidth() const; + + Ui::Text::String text; +}; + struct HiddenSenderInfo { HiddenSenderInfo(const QString &name, bool external); diff --git a/Telegram/SourceFiles/history/history_message.cpp b/Telegram/SourceFiles/history/history_message.cpp index b758f0686b..a02dd8bdb8 100644 --- a/Telegram/SourceFiles/history/history_message.cpp +++ b/Telegram/SourceFiles/history/history_message.cpp @@ -423,6 +423,7 @@ struct HistoryMessage::CreateConfig { TimeId editDate = 0; bool imported = false; HistoryMessageMarkupData markup; + bool sponsored = false; // For messages created from MTP structs. const MTPMessageReplies *mtpReplies = nullptr; @@ -772,6 +773,9 @@ void HistoryMessage::createComponentsHelper( config.markup = std::move(markup); if (flags & MessageFlag::HasPostAuthor) config.author = postAuthor; if (flags & MessageFlag::HasViews) config.viewsCount = 1; + if (flags & MessageFlag::IsSponsored) { + config.sponsored = true; + } createComponents(std::move(config)); } @@ -1076,6 +1080,9 @@ void HistoryMessage::createComponents(CreateConfig &&config) { if (config.editDate != TimeId(0)) { mask |= HistoryMessageEdited::Bit(); } + if (config.sponsored) { + mask |= HistoryMessageSponsored::Bit(); + } if (config.originalDate != 0) { mask |= HistoryMessageForwarded::Bit(); } diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index 466a1db1af..05e29e092e 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -1731,6 +1731,8 @@ void Message::drawInfo( if (const auto msgsigned = item->Get() ; msgsigned && !msgsigned->isAnonymousRank) { msgsigned->signature.drawElided(p, dateX, dateY, item->_timeWidth); + } else if (const auto sponsored = displayedSponsorBadge()) { + sponsored->text.drawElided(p, dateX, dateY, item->_timeWidth); } else if (const auto edited = displayedEditBadge()) { edited->text.drawElided(p, dateX, dateY, item->_timeWidth); } else { @@ -2639,11 +2641,13 @@ void Message::refreshEditedBadge() { initTime(); } -void Message::initTime() { +void Message::initTime() const { const auto item = message(); if (const auto msgsigned = item->Get() ; msgsigned && !msgsigned->isAnonymousRank) { item->_timeWidth = msgsigned->maxWidth(); + } else if (const auto sponsored = displayedSponsorBadge()) { + item->_timeWidth = sponsored->maxWidth(); } else if (const auto edited = displayedEditBadge()) { item->_timeWidth = edited->maxWidth(); } else { @@ -2680,6 +2684,16 @@ TimeId Message::displayedEditDate() const { return TimeId(0); } +const HistoryMessageSponsored *Message::displayedSponsorBadge() const { + // Ignore media while sponsored messages are text only. + // if (const auto media = this->media()) { + // if (media->overrideEditedDate()) { + // return media->displayedEditBadge(); + // } + // } + return message()->Get(); +} + HistoryMessageEdited *Message::displayedEditBadge() { if (const auto media = this->media()) { if (media->overrideEditedDate()) { diff --git a/Telegram/SourceFiles/history/view/history_view_message.h b/Telegram/SourceFiles/history/view/history_view_message.h index a4d220afa2..e0914fc41e 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.h +++ b/Telegram/SourceFiles/history/view/history_view_message.h @@ -13,6 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL class HistoryMessage; struct HistoryMessageEdited; +struct HistoryMessageSponsored; struct HistoryMessageForwarded; namespace HistoryView { @@ -202,9 +203,11 @@ private: [[nodiscard]] ClickHandlerPtr fastReplyLink() const; [[nodiscard]] const HistoryMessageEdited *displayedEditBadge() const; [[nodiscard]] HistoryMessageEdited *displayedEditBadge(); + [[nodiscard]] auto displayedSponsorBadge() const + -> const HistoryMessageSponsored*; [[nodiscard]] bool displayPinIcon() const; - void initTime(); + void initTime() const; [[nodiscard]] int timeLeft() const; [[nodiscard]] int plainMaxWidth() const; [[nodiscard]] int monospaceMaxWidth() const;