Fixed display of gift service actions for gift senders.

This commit is contained in:
23rd 2022-07-27 01:02:30 +03:00
parent e64190fb64
commit 3602155f68
7 changed files with 111 additions and 20 deletions

View file

@ -1469,6 +1469,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_action_proximity_distance_km#other" = "{count} km"; "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_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" = "{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#one" = "for {count} month";
"lng_premium_gift_duration_months#other" = "for {count} months"; "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_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_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_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_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_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"; "lng_premium_summary_subtitle_more_upload" = "4Gb Upload Size";

View file

@ -1734,13 +1734,21 @@ ClickHandlerPtr MediaDice::MakeHandler(
}); });
} }
MediaGiftBox::MediaGiftBox(not_null<HistoryItem*> parent, int months) MediaGiftBox::MediaGiftBox(
not_null<HistoryItem*> parent,
not_null<PeerData*> from,
int months)
: Media(parent) : Media(parent)
, _from(from)
, _months(months) { , _months(months) {
} }
std::unique_ptr<Media> MediaGiftBox::clone(not_null<HistoryItem*> parent) { std::unique_ptr<Media> MediaGiftBox::clone(not_null<HistoryItem*> parent) {
return std::make_unique<MediaGiftBox>(parent, _months); return std::make_unique<MediaGiftBox>(parent, _from, _months);
}
not_null<PeerData*> MediaGiftBox::from() const {
return _from;
} }
int MediaGiftBox::months() const { int MediaGiftBox::months() const {

View file

@ -477,10 +477,14 @@ private:
class MediaGiftBox final : public Media { class MediaGiftBox final : public Media {
public: public:
MediaGiftBox(not_null<HistoryItem*> parent, int months); MediaGiftBox(
not_null<HistoryItem*> parent,
not_null<PeerData*> from,
int months);
std::unique_ptr<Media> clone(not_null<HistoryItem*> parent) override; std::unique_ptr<Media> clone(not_null<HistoryItem*> parent) override;
[[nodiscard]] not_null<PeerData*> from() const;
[[nodiscard]] int months() const; [[nodiscard]] int months() const;
[[nodiscard]] bool activated() const; [[nodiscard]] bool activated() const;
@ -500,6 +504,7 @@ public:
HistoryView::Element *replacing = nullptr) override; HistoryView::Element *replacing = nullptr) override;
private: private:
not_null<PeerData*> _from;
int _months = 0; int _months = 0;
bool _activated = false; bool _activated = false;

View file

@ -617,18 +617,22 @@ void HistoryService::setMessageByAction(const MTPmessageAction &action) {
auto prepareGiftPremium = [&]( auto prepareGiftPremium = [&](
const MTPDmessageActionGiftPremium &action) { 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(); history()->session().giftBoxStickersPacks().load();
const auto amount = action.vamount().v; const auto amount = action.vamount().v;
const auto currency = qs(action.vcurrency()); const auto currency = qs(action.vcurrency());
auto result = PreparedText{}; result.links.push_back(peer->createOpenLink());
result.links.push_back(fromLink()); result.text = (isSelf
result.text = tr::lng_action_gift_received( ? tr::lng_action_gift_received_me
tr::now, : tr::lng_action_gift_received)(
lt_user, tr::now,
fromLinkText(), // Link 1. lt_user,
lt_cost, Ui::Text::Link(peer->name, 1), // Link 1.
{ Ui::FillAmountAndCurrency(amount, currency) }, lt_cost,
Ui::Text::WithEntities); { Ui::FillAmountAndCurrency(amount, currency) },
Ui::Text::WithEntities);
return result; return result;
}; };
@ -760,7 +764,10 @@ void HistoryService::applyAction(const MTPMessageAction &action) {
} }
} }
}, [&](const MTPDmessageActionGiftPremium &data) { }, [&](const MTPDmessageActionGiftPremium &data) {
_media = std::make_unique<Data::MediaGiftBox>(this, data.vmonths().v); _media = std::make_unique<Data::MediaGiftBox>(
this,
_from,
data.vmonths().v);
}, [](const auto &) { }, [](const auto &) {
}); });
} }

View file

@ -20,7 +20,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "lottie/lottie_common.h" #include "lottie/lottie_common.h"
#include "lottie/lottie_single_player.h" #include "lottie/lottie_single_player.h"
#include "main/main_session.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/chat/chat_style.h"
#include "ui/effects/ripple_animation.h" #include "ui/effects/ripple_animation.h"
#include "window/window_session_controller.h" #include "window/window_session_controller.h"
@ -66,11 +66,15 @@ MediaGift::MediaGift(
+ margins.right(), + margins.right(),
height); height);
const auto from = _gift->from();
const auto to = _parent->data()->history()->peer;
const auto months = _gift->months();
result.link = std::make_shared<LambdaClickHandler>([=]( result.link = std::make_shared<LambdaClickHandler>([=](
ClickContext context) { ClickContext context) {
const auto my = context.other.value<ClickHandlerContext>(); const auto my = context.other.value<ClickHandlerContext>();
if (const auto controller = my.sessionWindow.get()) { 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);
} }
}); });

View file

@ -31,6 +31,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/wrap/slide_wrap.h" #include "ui/wrap/slide_wrap.h"
#include "ui/wrap/vertical_layout.h" #include "ui/wrap/vertical_layout.h"
#include "window/window_controller.h" #include "window/window_controller.h"
#include "data/data_session.h"
#include "main/main_session.h" #include "main/main_session.h"
#include "main/main_account.h" #include "main/main_account.h"
#include "main/main_app_config.h" #include "main/main_app_config.h"
@ -55,6 +56,32 @@ constexpr auto kTitleAnimationPart = 0.15;
constexpr auto kTitleAdditionalScale = 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 { struct Entry {
const style::icon *icon; const style::icon *icon;
rpl::producer<QString> title; rpl::producer<QString> title;
@ -734,10 +761,26 @@ QPointer<Ui::RpWidget> Premium::createPinnedToTop(
Data::AmPremiumValue(&_controller->session()), Data::AmPremiumValue(&_controller->session()),
tr::lng_premium_summary_title_subscribed(), tr::lng_premium_summary_title_subscribed(),
tr::lng_premium_summary_title()); tr::lng_premium_summary_title());
auto about = rpl::conditional( auto about = [&] {
Data::AmPremiumValue(&_controller->session()), const auto gift = ParseGiftRef(_ref);
_controller->session().api().premium().statusTextValue(), if (gift.peerId) {
tr::lng_premium_summary_top_about(Ui::Text::RichLangValue)); 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<TopBar>( const auto content = Ui::CreateChild<TopBar>(
parent.get(), parent.get(),
@ -746,7 +789,9 @@ QPointer<Ui::RpWidget> Premium::createPinnedToTop(
std::move(about)); std::move(about));
_setPaused = [=](bool paused) { _setPaused = [=](bool paused) {
content->setPaused(paused); content->setPaused(paused);
_subscribe->setGlarePaused(paused); if (_subscribe) {
_subscribe->setGlarePaused(paused);
}
}; };
_wrap.value( _wrap.value(
@ -811,6 +856,10 @@ QPointer<Ui::RpWidget> Premium::createPinnedToBottom(
not_null<Ui::RpWidget*> parent) { not_null<Ui::RpWidget*> parent) {
const auto content = Ui::CreateChild<Ui::RpWidget>(parent.get()); const auto content = Ui::CreateChild<Ui::RpWidget>(parent.get());
if (ParseGiftRef(_ref).peerId) {
return nullptr;
}
_subscribe = CreateSubscribeButton({ _subscribe = CreateSubscribeButton({
_controller, _controller,
content, content,
@ -884,6 +933,14 @@ void ShowPremium(
controller->showSettings(Settings::PremiumId()); controller->showSettings(Settings::PremiumId());
} }
void ShowGiftPremium(
not_null<Window::SessionController*> controller,
not_null<PeerData*> peer,
int months,
bool me) {
ShowPremium(controller, SerializeRef({ peer->id, months, me }));
}
void StartPremiumPayment( void StartPremiumPayment(
not_null<Window::SessionController*> controller, not_null<Window::SessionController*> controller,
const QString &ref) { const QString &ref) {

View file

@ -32,6 +32,11 @@ void ShowPremium(not_null<::Main::Session*> session, const QString &ref);
void ShowPremium( void ShowPremium(
not_null<Window::SessionController*> controller, not_null<Window::SessionController*> controller,
const QString &ref); const QString &ref);
void ShowGiftPremium(
not_null<Window::SessionController*> controller,
not_null<PeerData*> peer,
int months,
bool me);
void StartPremiumPayment( void StartPremiumPayment(
not_null<Window::SessionController*> controller, not_null<Window::SessionController*> controller,