From 606dfd29d3a943c739c5f02e15092f9fc89d2306 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 15 May 2025 09:01:42 +0300 Subject: [PATCH] Moved out data of contact birthdays to promo suggestions class. --- Telegram/SourceFiles/boxes/star_gift_box.cpp | 9 ++- .../data/components/promo_suggestions.cpp | 75 ++++++++++++++++++- .../data/components/promo_suggestions.h | 12 +++ Telegram/SourceFiles/data/data_session.cpp | 71 ------------------ Telegram/SourceFiles/data/data_session.h | 12 --- .../dialogs/dialogs_top_bar_suggestion.cpp | 7 +- 6 files changed, 95 insertions(+), 91 deletions(-) diff --git a/Telegram/SourceFiles/boxes/star_gift_box.cpp b/Telegram/SourceFiles/boxes/star_gift_box.cpp index 116704c81f..9a011b76c3 100644 --- a/Telegram/SourceFiles/boxes/star_gift_box.cpp +++ b/Telegram/SourceFiles/boxes/star_gift_box.cpp @@ -31,6 +31,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "chat_helpers/tabbed_panel.h" #include "chat_helpers/tabbed_selector.h" #include "core/ui_integration.h" +#include "data/components/promo_suggestions.h" #include "data/data_birthday.h" #include "data/data_changes.h" #include "data/data_channel.h" @@ -3441,7 +3442,8 @@ Controller::Controller(not_null session, PickCallback pick) : ContactsBoxController(session) , _pick(std::move(pick)) , _contactBirthdays( - session->data().knownContactBirthdays().value_or(std::vector{})) + session->promoSuggestions().knownContactBirthdays().value_or( + std::vector{})) , _selfOption( MakeCustomList( session, @@ -3596,7 +3598,8 @@ bool Controller::overrideKeyboardNavigation( std::unique_ptr Controller::createRow( not_null user) { - if (const auto birthday = user->owner().knownContactBirthdays()) { + if (const auto birthday + = user->session().promoSuggestions().knownContactBirthdays()) { if (ranges::contains(*birthday, peerToUser(user->id))) { return nullptr; } @@ -3627,7 +3630,7 @@ void ChooseStarGiftRecipient( not_null window) { const auto session = &window->session(); const auto lifetime = std::make_shared(); - session->data().contactBirthdays( + session->promoSuggestions().contactBirthdays( ) | rpl::start_with_next(crl::guard(session, [=] { lifetime->destroy(); auto controller = std::make_unique( diff --git a/Telegram/SourceFiles/data/components/promo_suggestions.cpp b/Telegram/SourceFiles/data/components/promo_suggestions.cpp index 9c2cf28d00..493e97ab82 100644 --- a/Telegram/SourceFiles/data/components/promo_suggestions.cpp +++ b/Telegram/SourceFiles/data/components/promo_suggestions.cpp @@ -15,12 +15,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_changes.h" #include "data/data_histories.h" #include "data/data_session.h" +#include "data/data_user.h" #include "history/history.h" #include "main/main_session.h" namespace Data { namespace { +using UserIds = std::vector; + constexpr auto kTopPromotionInterval = TimeId(60 * 60); constexpr auto kTopPromotionMinDelay = TimeId(10); @@ -194,7 +197,7 @@ bool PromoSuggestions::current(const QString &key) const { return false; } else { const auto known - = _session->data().knownBirthdaysToday(); + = PromoSuggestions::knownBirthdaysToday(); if (!known) { return true; } @@ -231,4 +234,74 @@ std::optional PromoSuggestions::custom() const { return _custom; } +rpl::producer PromoSuggestions::contactBirthdays(bool force) { + if ((_contactBirthdaysLastDayRequest != -1) + && (_contactBirthdaysLastDayRequest == QDate::currentDate().day()) + && !force) { + return rpl::single(_contactBirthdays); + } + if (_contactBirthdaysRequestId) { + _session->api().request(_contactBirthdaysRequestId).cancel(); + } + return [=](auto consumer) { + auto lifetime = rpl::lifetime(); + + _contactBirthdaysRequestId = _session->api().request( + MTPcontacts_GetBirthdays() + ).done([=](const MTPcontacts_ContactBirthdays &result) { + _contactBirthdaysRequestId = 0; + _contactBirthdaysLastDayRequest = QDate::currentDate().day(); + auto users = UserIds(); + auto today = UserIds(); + _session->data().processUsers(result.data().vusers()); + for (const auto &tlContact : result.data().vcontacts().v) { + const auto peerId = tlContact.data().vcontact_id().v; + if (const auto user = _session->data().user(peerId)) { + const auto &data = tlContact.data().vbirthday().data(); + user->setBirthday(Data::Birthday( + data.vday().v, + data.vmonth().v, + data.vyear().value_or_empty())); + if (user->isSelf() + || user->isInaccessible() + || user->isBlocked()) { + continue; + } + if (Data::IsBirthdayToday(user->birthday())) { + today.push_back(peerToUser(user->id)); + } + users.push_back(peerToUser(user->id)); + } + } + _contactBirthdays = std::move(users); + _contactBirthdaysToday = std::move(today); + consumer.put_next_copy(_contactBirthdays); + }).fail([=](const MTP::Error &error) { + _contactBirthdaysRequestId = 0; + _contactBirthdaysLastDayRequest = QDate::currentDate().day(); + _contactBirthdays = {}; + _contactBirthdaysToday = {}; + consumer.put_next({}); + }).send(); + + return lifetime; + }; +} + +std::optional PromoSuggestions::knownContactBirthdays() const { + if ((_contactBirthdaysLastDayRequest == -1) + || (_contactBirthdaysLastDayRequest != QDate::currentDate().day())) { + return std::nullopt; + } + return _contactBirthdays; +} + +std::optional PromoSuggestions::knownBirthdaysToday() const { + if ((_contactBirthdaysLastDayRequest == -1) + || (_contactBirthdaysLastDayRequest != QDate::currentDate().day())) { + return std::nullopt; + } + return _contactBirthdaysToday; +} + } // namespace Data diff --git a/Telegram/SourceFiles/data/components/promo_suggestions.h b/Telegram/SourceFiles/data/components/promo_suggestions.h index 3ca631ceff..cbc352ef1e 100644 --- a/Telegram/SourceFiles/data/components/promo_suggestions.h +++ b/Telegram/SourceFiles/data/components/promo_suggestions.h @@ -45,6 +45,13 @@ public: rpl::producer<> value() const; // Create rpl::producer<> refreshed() const; on memand. + [[nodiscard]] rpl::producer> contactBirthdays( + bool force = false); + [[nodiscard]] auto knownContactBirthdays() const + -> std::optional>; + [[nodiscard]] auto knownBirthdaysToday() const + -> std::optional>; + private: void setTopPromoted( History *promoted, @@ -60,6 +67,11 @@ private: History *_topPromoted = nullptr; + mtpRequestId _contactBirthdaysRequestId = 0; + int _contactBirthdaysLastDayRequest = -1; + std::vector _contactBirthdays; + std::vector _contactBirthdaysToday; + mtpRequestId _topPromotionRequestId = 0; std::pair _topPromotionKey; TimeId _topPromotionNextRequestTime = TimeId(0); diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index 74b391c4d0..8a19ce6483 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -85,7 +85,6 @@ namespace Data { namespace { using ViewElement = HistoryView::Element; -using UserIds = std::vector; // s: box 100x100 // m: box 320x320 @@ -4958,74 +4957,4 @@ void Session::clearLocalStorage() { _bigFileCache->clear(); } -rpl::producer Session::contactBirthdays(bool force) { - if ((_contactBirthdaysLastDayRequest != -1) - && (_contactBirthdaysLastDayRequest == QDate::currentDate().day()) - && !force) { - return rpl::single(_contactBirthdays); - } - if (_contactBirthdaysRequestId) { - _session->api().request(_contactBirthdaysRequestId).cancel(); - } - return [=](auto consumer) { - auto lifetime = rpl::lifetime(); - - _contactBirthdaysRequestId = _session->api().request( - MTPcontacts_GetBirthdays() - ).done([=](const MTPcontacts_ContactBirthdays &result) { - _contactBirthdaysRequestId = 0; - _contactBirthdaysLastDayRequest = QDate::currentDate().day(); - auto users = UserIds(); - auto today = UserIds(); - Session::processUsers(result.data().vusers()); - for (const auto &tlContact : result.data().vcontacts().v) { - const auto peerId = tlContact.data().vcontact_id().v; - if (const auto user = Session::user(peerId)) { - const auto &data = tlContact.data().vbirthday().data(); - user->setBirthday(Data::Birthday( - data.vday().v, - data.vmonth().v, - data.vyear().value_or_empty())); - if (user->isSelf() - || user->isInaccessible() - || user->isBlocked()) { - continue; - } - if (Data::IsBirthdayToday(user->birthday())) { - today.push_back(peerToUser(user->id)); - } - users.push_back(peerToUser(user->id)); - } - } - _contactBirthdays = std::move(users); - _contactBirthdaysToday = std::move(today); - consumer.put_next_copy(_contactBirthdays); - }).fail([=](const MTP::Error &error) { - _contactBirthdaysRequestId = 0; - _contactBirthdaysLastDayRequest = QDate::currentDate().day(); - _contactBirthdays = {}; - _contactBirthdaysToday = {}; - consumer.put_next({}); - }).send(); - - return lifetime; - }; -} - -std::optional Session::knownContactBirthdays() const { - if ((_contactBirthdaysLastDayRequest == -1) - || (_contactBirthdaysLastDayRequest != QDate::currentDate().day())) { - return std::nullopt; - } - return _contactBirthdays; -} - -std::optional Session::knownBirthdaysToday() const { - if ((_contactBirthdaysLastDayRequest == -1) - || (_contactBirthdaysLastDayRequest != QDate::currentDate().day())) { - return std::nullopt; - } - return _contactBirthdaysToday; -} - } // namespace Data diff --git a/Telegram/SourceFiles/data/data_session.h b/Telegram/SourceFiles/data/data_session.h index 6e94e6ed2d..2a32df2bc2 100644 --- a/Telegram/SourceFiles/data/data_session.h +++ b/Telegram/SourceFiles/data/data_session.h @@ -830,13 +830,6 @@ public: void sentFromScheduled(SentFromScheduled value); [[nodiscard]] rpl::producer sentFromScheduled() const; - [[nodiscard]] rpl::producer> contactBirthdays( - bool force = false); - [[nodiscard]] auto knownContactBirthdays() const - -> std::optional>; - [[nodiscard]] auto knownBirthdaysToday() const - -> std::optional>; - void clearLocalStorage(); private: @@ -1150,11 +1143,6 @@ private: not_null, mtpRequestId> _viewAsMessagesRequests; - mtpRequestId _contactBirthdaysRequestId = 0; - int _contactBirthdaysLastDayRequest = -1; - std::vector _contactBirthdays; - std::vector _contactBirthdaysToday; - Groups _groups; const std::unique_ptr _chatsFilters; const std::unique_ptr _cloudThemes; diff --git a/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp b/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp index 482eb87e4b..0c6655dde7 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp @@ -240,11 +240,10 @@ rpl::producer*> TopBarSuggestionValue( return; } else if (session->premiumCanBuy() && promo->current(kSugBirthdayContacts.utf8())) { - session->data().contactBirthdays( + promo->contactBirthdays( ) | rpl::start_with_next(crl::guard(content, [=] { - const auto users = session->data() - .knownBirthdaysToday().value_or( - std::vector()); + const auto users = promo->knownBirthdaysToday().value_or( + std::vector()); if (users.empty()) { repeat(repeat); return;