diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index 78974d85e3..6189cbd069 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -85,6 +85,7 @@ namespace Data { namespace { using ViewElement = HistoryView::Element; +using UserIds = std::vector; // s: box 100x100 // m: box 320x320 @@ -4985,7 +4986,7 @@ void Session::clearLocalStorage() { _bigFileCache->clear(); } -rpl::producer> Session::contactBirthdays(bool force) { +rpl::producer Session::contactBirthdays(bool force) { if ((_contactBirthdaysLastDayRequest != -1) && (_contactBirthdaysLastDayRequest == QDate::currentDate().day()) && !force) { @@ -5002,7 +5003,8 @@ rpl::producer> Session::contactBirthdays(bool force) { ).done([=](const MTPcontacts_ContactBirthdays &result) { _contactBirthdaysRequestId = 0; _contactBirthdaysLastDayRequest = QDate::currentDate().day(); - auto users = std::vector(); + 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; @@ -5012,15 +5014,20 @@ rpl::producer> Session::contactBirthdays(bool force) { data.vday().v, data.vmonth().v, data.vyear().value_or_empty())); + 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(); @@ -5028,7 +5035,7 @@ rpl::producer> Session::contactBirthdays(bool force) { }; } -std::optional> Session::knownContactBirthdays() const { +std::optional Session::knownContactBirthdays() const { if ((_contactBirthdaysLastDayRequest == -1) || (_contactBirthdaysLastDayRequest != QDate::currentDate().day())) { return std::nullopt; @@ -5036,4 +5043,12 @@ std::optional> Session::knownContactBirthdays() const { 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 d46290d775..36818359f3 100644 --- a/Telegram/SourceFiles/data/data_session.h +++ b/Telegram/SourceFiles/data/data_session.h @@ -835,8 +835,10 @@ public: [[nodiscard]] rpl::producer> contactBirthdays( bool force = false); - [[nodiscard]] std::optional> knownContactBirthdays( - ) const; + [[nodiscard]] auto knownContactBirthdays() const + -> std::optional>; + [[nodiscard]] auto knownBirthdaysToday() const + -> std::optional>; void clearLocalStorage(); @@ -1156,6 +1158,7 @@ private: mtpRequestId _contactBirthdaysRequestId = 0; int _contactBirthdaysLastDayRequest = -1; std::vector _contactBirthdays; + std::vector _contactBirthdaysToday; Groups _groups; const std::unique_ptr _chatsFilters; diff --git a/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp b/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp index 4b384f9030..eb372c1561 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_top_bar_suggestion.cpp @@ -218,10 +218,14 @@ rpl::producer*> TopBarSuggestionValue( return; } else if (session->premiumCanBuy() - && config->suggestionCurrent(kSugBirthdayContacts.utf8())) { + && config->suggestionCurrent(kSugBirthdayContacts.utf8()) + && (!session->data().knownBirthdaysToday() + || !session->data().knownBirthdaysToday()->size())) { session->data().contactBirthdays( - ) | rpl::start_with_next(crl::guard(content, [=]( - std::vector users) { + ) | rpl::start_with_next(crl::guard(content, [=] { + const auto users = session->data() + .knownBirthdaysToday().value_or( + std::vector()); if (users.empty()) { repeat(repeat); return;