From 3c44cf0251c37bd24fa2ab2de005473e5c4d3c10 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 23 Jun 2023 20:05:58 +0400 Subject: [PATCH] Track all sponsored messages clicks. --- Telegram/SourceFiles/core/ui_integration.cpp | 12 ++++++++++++ Telegram/SourceFiles/core/ui_integration.h | 3 +++ .../SourceFiles/data/data_sponsored_messages.cpp | 14 ++++++++++++++ .../SourceFiles/data/data_sponsored_messages.h | 1 + .../history/view/history_view_element.cpp | 5 ++++- Telegram/lib_ui | 2 +- 6 files changed, 35 insertions(+), 2 deletions(-) diff --git a/Telegram/SourceFiles/core/ui_integration.cpp b/Telegram/SourceFiles/core/ui_integration.cpp index d0d7580cc..e7351e8fd 100644 --- a/Telegram/SourceFiles/core/ui_integration.cpp +++ b/Telegram/SourceFiles/core/ui_integration.cpp @@ -15,6 +15,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "core/click_handler_types.h" #include "data/stickers/data_custom_emoji.h" #include "data/data_session.h" +#include "data/data_sponsored_messages.h" #include "ui/text/text_custom_emoji.h" #include "ui/basic_click_handlers.h" #include "ui/emoji_config.h" @@ -26,6 +27,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_app_config.h" #include "mtproto/mtproto_config.h" #include "window/window_controller.h" +#include "window/window_session_controller.h" #include "mainwindow.h" namespace Core { @@ -264,6 +266,16 @@ Fn UiIntegration::createSpoilerRepaint(const std::any &context) { return my ? my->customEmojiRepaint : nullptr; } +bool UiIntegration::allowClickHandlerActivation( + const std::shared_ptr &handler, + const ClickContext &context) { + const auto my = context.other.value(); + if (const auto window = my.sessionWindow.get()) { + window->session().data().sponsoredMessages().clicked(my.itemId); + } + return true; +} + rpl::producer<> UiIntegration::forcePopupMenuHideRequests() { return Core::App().passcodeLockChanges() | rpl::to_empty; } diff --git a/Telegram/SourceFiles/core/ui_integration.h b/Telegram/SourceFiles/core/ui_integration.h index a71c9cfbe..65661ecfd 100644 --- a/Telegram/SourceFiles/core/ui_integration.h +++ b/Telegram/SourceFiles/core/ui_integration.h @@ -60,6 +60,9 @@ public: const QString &data, const std::any &context) override; Fn createSpoilerRepaint(const std::any &context) override; + bool allowClickHandlerActivation( + const std::shared_ptr &handler, + const ClickContext &context) override; QString phraseContextCopyText() override; QString phraseContextCopyEmail() override; diff --git a/Telegram/SourceFiles/data/data_sponsored_messages.cpp b/Telegram/SourceFiles/data/data_sponsored_messages.cpp index c586b219e..bbf6273c5 100644 --- a/Telegram/SourceFiles/data/data_sponsored_messages.cpp +++ b/Telegram/SourceFiles/data/data_sponsored_messages.cpp @@ -445,6 +445,20 @@ SponsoredMessages::Details SponsoredMessages::lookupDetails( }; } +void SponsoredMessages::clicked(const FullMsgId &fullId) { + const auto entryPtr = find(fullId); + if (!entryPtr) { + return; + } + const auto randomId = entryPtr->sponsored.randomId; + const auto channel = entryPtr->item->history()->peer->asChannel(); + Assert(channel != nullptr); + _session->api().request(MTPchannels_ClickSponsoredMessage( + channel->inputChannel, + MTP_bytes(randomId) + )).send(); +} + SponsoredMessages::State SponsoredMessages::state( not_null history) const { const auto it = _data.find(history); diff --git a/Telegram/SourceFiles/data/data_sponsored_messages.h b/Telegram/SourceFiles/data/data_sponsored_messages.h index 9c309ade3..e9cd46b45 100644 --- a/Telegram/SourceFiles/data/data_sponsored_messages.h +++ b/Telegram/SourceFiles/data/data_sponsored_messages.h @@ -72,6 +72,7 @@ public: void request(not_null history, Fn done); void clearItems(not_null history); [[nodiscard]] Details lookupDetails(const FullMsgId &fullId) const; + void clicked(const FullMsgId &fullId); [[nodiscard]] bool append(not_null history); void inject( diff --git a/Telegram/SourceFiles/history/view/history_view_element.cpp b/Telegram/SourceFiles/history/view/history_view_element.cpp index 763978823..6a3f78b8a 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.cpp +++ b/Telegram/SourceFiles/history/view/history_view_element.cpp @@ -27,6 +27,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "core/application.h" #include "core/core_settings.h" #include "core/click_handler_types.h" +#include "core/file_utilities.h" #include "core/ui_integration.h" #include "main/main_session.h" #include "main/main_domain.h" @@ -992,7 +993,9 @@ ClickHandlerPtr Element::fromLink() const { auto &sponsored = session->data().sponsoredMessages(); const auto itemId = my.itemId ? my.itemId : item->fullId(); const auto details = sponsored.lookupDetails(itemId); - if (const auto &hash = details.hash) { + if (!details.externalLink.isEmpty()) { + File::OpenUrl(details.externalLink); + } else if (const auto &hash = details.hash) { Api::CheckChatInvite(window, *hash); } else if (const auto peer = details.peer) { window->showPeerInfo(peer); diff --git a/Telegram/lib_ui b/Telegram/lib_ui index 8a5604880..fc8d4d25d 160000 --- a/Telegram/lib_ui +++ b/Telegram/lib_ui @@ -1 +1 @@ -Subproject commit 8a560488011f833b7ba534999f878d20d5152e6c +Subproject commit fc8d4d25dee6e3ded99749c06fd870e6df4615f8