From d87c9c72fbcde3f2dd8e5db9739dac13f511c88a Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 21 Apr 2022 19:34:00 +0400 Subject: [PATCH] Update API scheme on layer 142: Premium reactions. --- Telegram/Resources/tl/api.tl | 2 +- .../boxes/peers/edit_peer_info_box.cpp | 2 +- .../boxes/reactions_settings_box.cpp | 9 ++++++++ .../data/data_message_reactions.cpp | 6 +++++ .../SourceFiles/data/data_message_reactions.h | 3 +++ Telegram/SourceFiles/data/data_session.cpp | 1 + .../history/history_inner_widget.cpp | 10 +++++++-- .../history/view/history_view_list_widget.cpp | 11 ++++++++-- .../info/profile/info_profile_values.cpp | 3 ++- .../SourceFiles/window/section_widget.cpp | 22 +++++++++++++++++++ Telegram/SourceFiles/window/section_widget.h | 5 +++++ 11 files changed, 67 insertions(+), 7 deletions(-) diff --git a/Telegram/Resources/tl/api.tl b/Telegram/Resources/tl/api.tl index 6f6eec6ef1..a3c6a1e85d 100644 --- a/Telegram/Resources/tl/api.tl +++ b/Telegram/Resources/tl/api.tl @@ -1322,7 +1322,7 @@ messageReactions#4f2b9479 flags:# min:flags.0?true can_see_list:flags.2?true res messages.messageReactionsList#31bd492d flags:# count:int reactions:Vector chats:Vector users:Vector next_offset:flags.0?string = messages.MessageReactionsList; -availableReaction#c077ec01 flags:# inactive:flags.0?true reaction:string title:string static_icon:Document appear_animation:Document select_animation:Document activate_animation:Document effect_animation:Document around_animation:flags.1?Document center_icon:flags.1?Document = AvailableReaction; +availableReaction#c077ec01 flags:# inactive:flags.0?true premium:flags.2?true reaction:string title:string static_icon:Document appear_animation:Document select_animation:Document activate_animation:Document effect_animation:Document around_animation:flags.1?Document center_icon:flags.1?Document = AvailableReaction; messages.availableReactionsNotModified#9f071957 = messages.AvailableReactions; messages.availableReactions#768e3aad hash:int reactions:Vector = messages.AvailableReactions; diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp index 2b3b0ee089..c336f8bcfb 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp @@ -1016,7 +1016,7 @@ void Controller::fillManageSection() { EditAllowedReactionsBox, !_peer->isBroadcast(), session->data().reactions().list( - Data::Reactions::Type::Active), + Data::Reactions::Type::ActiveNonPremium), *Data::PeerAllowedReactions(_peer), done)); }, diff --git a/Telegram/SourceFiles/boxes/reactions_settings_box.cpp b/Telegram/SourceFiles/boxes/reactions_settings_box.cpp index 8c0bbe5503..1f47ae7ed1 100644 --- a/Telegram/SourceFiles/boxes/reactions_settings_box.cpp +++ b/Telegram/SourceFiles/boxes/reactions_settings_box.cpp @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "boxes/reactions_settings_box.h" #include "base/unixtime.h" +#include "data/data_user.h" #include "data/data_document.h" #include "data/data_document_media.h" #include "data/data_message_reactions.h" @@ -25,6 +26,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/chat/chat_theme.h" #include "ui/effects/scroll_content_shadow.h" #include "ui/layers/generic_box.h" +#include "ui/toasts/common_toasts.h" #include "ui/widgets/buttons.h" #include "ui/widgets/labels.h" #include "ui/widgets/scroll_area.h" @@ -424,6 +426,7 @@ void ReactionsSettingsBox( rpl::single(base::duplicate(r.title)), st::settingsButton); + const auto premium = r.premium; const auto iconSize = st::settingsReactionSize; AddReactionLottieIcon( button, @@ -443,6 +446,12 @@ void ReactionsSettingsBox( &button->lifetime()); button->setClickedCallback([=, emoji = r.emoji] { + if (premium && !controller->session().user()->isPremium()) { + Ui::ShowMultilineToast({ + .text = { u"Premium reaction."_q }, + }); + return; + } checkButton(button); state->selectedEmoji = emoji; }); diff --git a/Telegram/SourceFiles/data/data_message_reactions.cpp b/Telegram/SourceFiles/data/data_message_reactions.cpp index 958b85bcf6..8a1d3088f2 100644 --- a/Telegram/SourceFiles/data/data_message_reactions.cpp +++ b/Telegram/SourceFiles/data/data_message_reactions.cpp @@ -73,6 +73,7 @@ void Reactions::refresh() { const std::vector &Reactions::list(Type type) const { switch (type) { + case Type::ActiveNonPremium: return _activeNonPremium; case Type::Active: return _active; case Type::All: return _available; } @@ -301,6 +302,7 @@ void Reactions::updateFromData(const MTPDmessages_availableReactions &data) { _iconsCache.emplace(document, document->createMediaView()); } }; + _activeNonPremium.clear(); _active.clear(); _available.clear(); _active.reserve(list.size()); @@ -315,6 +317,9 @@ void Reactions::updateFromData(const MTPDmessages_availableReactions &data) { toCache(parsed->selectAnimation); toCache(parsed->centerIcon); toCache(parsed->aroundAnimation); + if (!parsed->premium) { + _activeNonPremium.push_back(*parsed); + } } } } @@ -354,6 +359,7 @@ std::optional Reactions::parse(const MTPAvailableReaction &entry) { *data.varound_animation()).get() : nullptr), .active = !data.is_inactive(), + .premium = data.is_premium(), }) : std::nullopt; }); diff --git a/Telegram/SourceFiles/data/data_message_reactions.h b/Telegram/SourceFiles/data/data_message_reactions.h index 0a587ea151..08d24e2916 100644 --- a/Telegram/SourceFiles/data/data_message_reactions.h +++ b/Telegram/SourceFiles/data/data_message_reactions.h @@ -29,6 +29,7 @@ struct Reaction { DocumentData *centerIcon = nullptr; DocumentData *aroundAnimation = nullptr; bool active = false; + bool premium = false; }; class Reactions final { @@ -39,6 +40,7 @@ public: void refresh(); enum class Type { + ActiveNonPremium, Active, All, }; @@ -101,6 +103,7 @@ private: const not_null _owner; + std::vector _activeNonPremium; std::vector _active; std::vector _available; QString _favorite; diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index efc9d8dbb3..129bceb447 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -425,6 +425,7 @@ not_null Session::processUser(const MTPUser &data) { | (data.is_scam() ? Flag::Scam : Flag()) | (data.is_fake() ? Flag::Fake : Flag()) | (data.is_bot_inline_geo() ? Flag::BotInlineGeo : Flag()) + | (data.is_premium() ? Flag::Premium : Flag()) | (data.is_support() ? Flag::Support : Flag()) | (!minimal ? (data.is_contact() ? Flag::Contact : Flag()) diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 2966887d20..6cfbba1109 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -381,7 +381,11 @@ HistoryInner::HistoryInner( _reactionsManager->chosen( ) | rpl::start_with_next([=](ChosenReaction reaction) { const auto item = session().data().message(reaction.context); - if (!item) { + if (!item + || Window::ShowReactPremiumError( + _controller, + item, + reaction.emoji)) { return; } item->toggleReaction(reaction.emoji); @@ -1876,7 +1880,9 @@ void HistoryInner::toggleFavoriteReaction(not_null view) const { return; } const auto item = view->data(); - if (item->chosenReaction() != favorite) { + if (Window::ShowReactPremiumError(_controller, item, favorite)) { + return; + } else if (item->chosenReaction() != favorite) { if (const auto top = itemTop(view); top >= 0) { view->animateReaction({ .emoji = favorite }); } diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp index 21e3d7aa21..3daa4b3892 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp @@ -28,6 +28,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "apiwrap.h" #include "api/api_who_reacted.h" #include "layout/layout_selection.h" +#include "window/section_widget.h" #include "window/window_adaptive.h" #include "window/window_session_controller.h" #include "window/window_peer_menu.h" @@ -349,7 +350,11 @@ ListWidget::ListWidget( _reactionsManager->chosen( ) | rpl::start_with_next([=](ChosenReaction reaction) { const auto item = session().data().message(reaction.context); - if (!item) { + if (!item + || Window::ShowReactPremiumError( + _controller, + item, + reaction.emoji)) { return; } item->toggleReaction(reaction.emoji); @@ -2119,7 +2124,9 @@ void ListWidget::toggleFavoriteReaction(not_null view) const { return; } const auto item = view->data(); - if (item->chosenReaction() != favorite) { + if (Window::ShowReactPremiumError(_controller, item, favorite)) { + return; + } else if (item->chosenReaction() != favorite) { if (const auto top = itemTop(view); top >= 0) { view->animateReaction({ .emoji = favorite }); } diff --git a/Telegram/SourceFiles/info/profile/info_profile_values.cpp b/Telegram/SourceFiles/info/profile/info_profile_values.cpp index f3315a7bda..3367c9d705 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_values.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_values.cpp @@ -443,7 +443,8 @@ rpl::producer FullReactionsCountValue( return rpl::single(rpl::empty) | rpl::then( reactions->updates() ) | rpl::map([=] { - return int(reactions->list(Data::Reactions::Type::Active).size()); + return int(reactions->list( + Data::Reactions::Type::ActiveNonPremium).size()); }) | rpl::distinct_until_changed(); } diff --git a/Telegram/SourceFiles/window/section_widget.cpp b/Telegram/SourceFiles/window/section_widget.cpp index 1ebb4aa5bd..e8d40e4e0e 100644 --- a/Telegram/SourceFiles/window/section_widget.cpp +++ b/Telegram/SourceFiles/window/section_widget.cpp @@ -17,6 +17,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_changes.h" #include "data/data_session.h" #include "data/data_cloud_themes.h" +#include "data/data_message_reactions.h" +#include "history/history_item.h" #include "main/main_session.h" #include "window/section_memento.h" #include "window/window_slide_animation.h" @@ -338,4 +340,24 @@ bool ShowSendPremiumError( return true; } +bool ShowReactPremiumError( + not_null controller, + not_null item, + const QString &emoji) { + if (item->chosenReaction() == emoji + || controller->session().user()->isPremium()) { + return false; + } + const auto &list = controller->session().data().reactions().list( + Data::Reactions::Type::Active); + const auto i = ranges::find(list, emoji, &Data::Reaction::emoji); + if (i == end(list) || !i->premium) { + return false; + } + Ui::ShowMultilineToast({ + .text = { u"Premium reaction."_q }, + }); + return true; +} + } // namespace Window diff --git a/Telegram/SourceFiles/window/section_widget.h b/Telegram/SourceFiles/window/section_widget.h index 6a43aaea2c..94372838e8 100644 --- a/Telegram/SourceFiles/window/section_widget.h +++ b/Telegram/SourceFiles/window/section_widget.h @@ -209,4 +209,9 @@ private: not_null controller, not_null document); +[[nodiscard]] bool ShowReactPremiumError( + not_null controller, + not_null item, + const QString &emoji); + } // namespace Window