From 3602155f682bea1c0155640128394752c6fcf645 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 27 Jul 2022 01:02:30 +0300 Subject: [PATCH] Fixed display of gift service actions for gift senders. --- Telegram/Resources/langs/lang.strings | 5 ++ .../SourceFiles/data/data_media_types.cpp | 12 +++- Telegram/SourceFiles/data/data_media_types.h | 7 +- .../SourceFiles/history/history_service.cpp | 27 +++++--- .../media/history_view_service_media_gift.cpp | 8 ++- .../SourceFiles/settings/settings_premium.cpp | 67 +++++++++++++++++-- .../SourceFiles/settings/settings_premium.h | 5 ++ 7 files changed, 111 insertions(+), 20 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 83d8700ac4..63ba7bad96 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1469,6 +1469,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_action_proximity_distance_km#other" = "{count} km"; "lng_action_webview_data_done" = "You have just successfully transferred data from the «{text}» button to the bot."; "lng_action_gift_received" = "{user} sent you a gift for {cost}"; +"lng_action_gift_received_me" = "You sent to {user} a gift for {cost}"; "lng_premium_gift_duration_months#one" = "for {count} month"; "lng_premium_gift_duration_months#other" = "for {count} months"; @@ -1700,6 +1701,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_premium_summary_title" = "Telegram Premium"; "lng_premium_summary_top_about" = "Go **beyond the limits**, get **exclusive features** and support us by subscribing to **Telegram Premium**."; "lng_premium_summary_title_subscribed" = "You are all set!"; +"lng_premium_summary_subtitle_gift#one" = "{user} has gifted you a {count}-month subscription for Telegram Premium."; +"lng_premium_summary_subtitle_gift#other" = "{user} has gifted you a {count}-months subscription for Telegram Premium."; +"lng_premium_summary_subtitle_gift_me#one" = "You gifted {user} a {count}-month subscription for Telegram Premium."; +"lng_premium_summary_subtitle_gift_me#other" = "You gifted {user} a {count}-months subscription for Telegram Premium."; "lng_premium_summary_subtitle_double_limits" = "Doubled Limits"; "lng_premium_summary_about_double_limits" = "Up to 1000 channels, 20 folders, 10 pins, 20 public links, 4 accounts and more."; "lng_premium_summary_subtitle_more_upload" = "4Gb Upload Size"; diff --git a/Telegram/SourceFiles/data/data_media_types.cpp b/Telegram/SourceFiles/data/data_media_types.cpp index 53488bf7db..67a27f7416 100644 --- a/Telegram/SourceFiles/data/data_media_types.cpp +++ b/Telegram/SourceFiles/data/data_media_types.cpp @@ -1734,13 +1734,21 @@ ClickHandlerPtr MediaDice::MakeHandler( }); } -MediaGiftBox::MediaGiftBox(not_null parent, int months) +MediaGiftBox::MediaGiftBox( + not_null parent, + not_null from, + int months) : Media(parent) +, _from(from) , _months(months) { } std::unique_ptr MediaGiftBox::clone(not_null parent) { - return std::make_unique(parent, _months); + return std::make_unique(parent, _from, _months); +} + +not_null MediaGiftBox::from() const { + return _from; } int MediaGiftBox::months() const { diff --git a/Telegram/SourceFiles/data/data_media_types.h b/Telegram/SourceFiles/data/data_media_types.h index 5a76fd0aef..c1925bba9c 100644 --- a/Telegram/SourceFiles/data/data_media_types.h +++ b/Telegram/SourceFiles/data/data_media_types.h @@ -477,10 +477,14 @@ private: class MediaGiftBox final : public Media { public: - MediaGiftBox(not_null parent, int months); + MediaGiftBox( + not_null parent, + not_null from, + int months); std::unique_ptr clone(not_null parent) override; + [[nodiscard]] not_null from() const; [[nodiscard]] int months() const; [[nodiscard]] bool activated() const; @@ -500,6 +504,7 @@ public: HistoryView::Element *replacing = nullptr) override; private: + not_null _from; int _months = 0; bool _activated = false; diff --git a/Telegram/SourceFiles/history/history_service.cpp b/Telegram/SourceFiles/history/history_service.cpp index db100d6a71..9a10d285c9 100644 --- a/Telegram/SourceFiles/history/history_service.cpp +++ b/Telegram/SourceFiles/history/history_service.cpp @@ -617,18 +617,22 @@ void HistoryService::setMessageByAction(const MTPmessageAction &action) { auto prepareGiftPremium = [&]( const MTPDmessageActionGiftPremium &action) { + auto result = PreparedText{}; + const auto isSelf = (_from->id == _from->session().userPeerId()); + const auto peer = isSelf ? history()->peer : _from; history()->session().giftBoxStickersPacks().load(); const auto amount = action.vamount().v; const auto currency = qs(action.vcurrency()); - auto result = PreparedText{}; - result.links.push_back(fromLink()); - result.text = tr::lng_action_gift_received( - tr::now, - lt_user, - fromLinkText(), // Link 1. - lt_cost, - { Ui::FillAmountAndCurrency(amount, currency) }, - Ui::Text::WithEntities); + result.links.push_back(peer->createOpenLink()); + result.text = (isSelf + ? tr::lng_action_gift_received_me + : tr::lng_action_gift_received)( + tr::now, + lt_user, + Ui::Text::Link(peer->name, 1), // Link 1. + lt_cost, + { Ui::FillAmountAndCurrency(amount, currency) }, + Ui::Text::WithEntities); return result; }; @@ -760,7 +764,10 @@ void HistoryService::applyAction(const MTPMessageAction &action) { } } }, [&](const MTPDmessageActionGiftPremium &data) { - _media = std::make_unique(this, data.vmonths().v); + _media = std::make_unique( + this, + _from, + data.vmonths().v); }, [](const auto &) { }); } diff --git a/Telegram/SourceFiles/history/view/media/history_view_service_media_gift.cpp b/Telegram/SourceFiles/history/view/media/history_view_service_media_gift.cpp index 7f84f878ad..0eaf5a4bff 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_service_media_gift.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_service_media_gift.cpp @@ -20,7 +20,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "lottie/lottie_common.h" #include "lottie/lottie_single_player.h" #include "main/main_session.h" -#include "settings/settings_premium.h" // Settings::ShowPremium +#include "settings/settings_premium.h" // Settings::ShowGiftPremium #include "ui/chat/chat_style.h" #include "ui/effects/ripple_animation.h" #include "window/window_session_controller.h" @@ -66,11 +66,15 @@ MediaGift::MediaGift( + margins.right(), height); + const auto from = _gift->from(); + const auto to = _parent->data()->history()->peer; + const auto months = _gift->months(); result.link = std::make_shared([=]( ClickContext context) { const auto my = context.other.value(); if (const auto controller = my.sessionWindow.get()) { - Settings::ShowPremium(controller, QString()); + const auto me = (from->id == controller->session().userPeerId()); + Settings::ShowGiftPremium(controller, me ? to : from, months, me); } }); diff --git a/Telegram/SourceFiles/settings/settings_premium.cpp b/Telegram/SourceFiles/settings/settings_premium.cpp index 4bc412e647..fe0cd7a316 100644 --- a/Telegram/SourceFiles/settings/settings_premium.cpp +++ b/Telegram/SourceFiles/settings/settings_premium.cpp @@ -31,6 +31,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/wrap/slide_wrap.h" #include "ui/wrap/vertical_layout.h" #include "window/window_controller.h" +#include "data/data_session.h" #include "main/main_session.h" #include "main/main_account.h" #include "main/main_app_config.h" @@ -55,6 +56,32 @@ constexpr auto kTitleAnimationPart = 0.15; constexpr auto kTitleAdditionalScale = 0.15; +struct GiftRef { + PeerId peerId; + int months; + bool me; +}; + +[[nodiscard]] QString SerializeRef(const GiftRef &gift) { + return QString::number(gift.peerId.value) + + ':' + + QString::number(gift.months) + + ':' + + QString::number(gift.me ? 1 : 0); +} + +[[nodiscard]] GiftRef ParseGiftRef(QStringView data) { + const auto components = data.split(':'); + if (components.size() != 3) { + return {}; + } + return { + .peerId = PeerId(components[0].toULongLong()), + .months = components[1].toInt(), + .me = (components[2].toInt() == 1), + }; +} + struct Entry { const style::icon *icon; rpl::producer title; @@ -734,10 +761,26 @@ QPointer Premium::createPinnedToTop( Data::AmPremiumValue(&_controller->session()), tr::lng_premium_summary_title_subscribed(), tr::lng_premium_summary_title()); - auto about = rpl::conditional( - Data::AmPremiumValue(&_controller->session()), - _controller->session().api().premium().statusTextValue(), - tr::lng_premium_summary_top_about(Ui::Text::RichLangValue)); + auto about = [&] { + const auto gift = ParseGiftRef(_ref); + if (gift.peerId) { + auto &data = _controller->session().data(); + if (const auto peer = data.peer(gift.peerId)) { + return (gift.me + ? tr::lng_premium_summary_subtitle_gift_me + : tr::lng_premium_summary_subtitle_gift)( + lt_count, + rpl::single(float64(gift.months)), + lt_user, + rpl::single(Ui::Text::Bold(peer->name)), + Ui::Text::RichLangValue); + } + } + return rpl::conditional( + Data::AmPremiumValue(&_controller->session()), + _controller->session().api().premium().statusTextValue(), + tr::lng_premium_summary_top_about(Ui::Text::RichLangValue)); + }(); const auto content = Ui::CreateChild( parent.get(), @@ -746,7 +789,9 @@ QPointer Premium::createPinnedToTop( std::move(about)); _setPaused = [=](bool paused) { content->setPaused(paused); - _subscribe->setGlarePaused(paused); + if (_subscribe) { + _subscribe->setGlarePaused(paused); + } }; _wrap.value( @@ -811,6 +856,10 @@ QPointer Premium::createPinnedToBottom( not_null parent) { const auto content = Ui::CreateChild(parent.get()); + if (ParseGiftRef(_ref).peerId) { + return nullptr; + } + _subscribe = CreateSubscribeButton({ _controller, content, @@ -884,6 +933,14 @@ void ShowPremium( controller->showSettings(Settings::PremiumId()); } +void ShowGiftPremium( + not_null controller, + not_null peer, + int months, + bool me) { + ShowPremium(controller, SerializeRef({ peer->id, months, me })); +} + void StartPremiumPayment( not_null controller, const QString &ref) { diff --git a/Telegram/SourceFiles/settings/settings_premium.h b/Telegram/SourceFiles/settings/settings_premium.h index 69ba0a8fe9..78e675742b 100644 --- a/Telegram/SourceFiles/settings/settings_premium.h +++ b/Telegram/SourceFiles/settings/settings_premium.h @@ -32,6 +32,11 @@ void ShowPremium(not_null<::Main::Session*> session, const QString &ref); void ShowPremium( not_null controller, const QString &ref); +void ShowGiftPremium( + not_null controller, + not_null peer, + int months, + bool me); void StartPremiumPayment( not_null controller,