From dc1dc8dffa8e6fdbfe5a3e4e15c1ae956cd393a3 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Tue, 8 Apr 2025 13:41:56 +0300 Subject: [PATCH] Added today birthdays to data session. --- Telegram/SourceFiles/data/data_session.cpp | 51 ++++++++++++++++++++++ Telegram/SourceFiles/data/data_session.h | 9 ++++ 2 files changed, 60 insertions(+) diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index 1114873bb1..5b74b76561 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -4909,4 +4909,55 @@ 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 = std::vector(); + 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())); + users.push_back(peerToUser(user->id)); + } + } + _contactBirthdays = std::move(users); + consumer.put_next_copy(_contactBirthdays); + }).fail([=](const MTP::Error &error) { + _contactBirthdaysRequestId = 0; + _contactBirthdaysLastDayRequest = QDate::currentDate().day(); + _contactBirthdays = {}; + consumer.put_next({}); + }).send(); + + return lifetime; + }; +} + +std::optional> Session::knownContactBirthdays() const { + if ((_contactBirthdaysLastDayRequest == -1) + || (_contactBirthdaysLastDayRequest != QDate::currentDate().day())) { + return std::nullopt; + } + return _contactBirthdays; +} + } // namespace Data diff --git a/Telegram/SourceFiles/data/data_session.h b/Telegram/SourceFiles/data/data_session.h index 14f272c6ce..108f42482b 100644 --- a/Telegram/SourceFiles/data/data_session.h +++ b/Telegram/SourceFiles/data/data_session.h @@ -816,6 +816,11 @@ public: void sentFromScheduled(SentFromScheduled value); [[nodiscard]] rpl::producer sentFromScheduled() const; + [[nodiscard]] rpl::producer> contactBirthdays( + bool force = false); + [[nodiscard]] std::optional> knownContactBirthdays( + ) const; + void clearLocalStorage(); private: @@ -1130,6 +1135,10 @@ private: not_null, mtpRequestId> _viewAsMessagesRequests; + mtpRequestId _contactBirthdaysRequestId = 0; + int _contactBirthdaysLastDayRequest = -1; + std::vector _contactBirthdays; + Groups _groups; const std::unique_ptr _chatsFilters; const std::unique_ptr _cloudThemes;