Added today birthdays to data session.

This commit is contained in:
23rd 2025-04-08 13:41:56 +03:00 committed by John Preston
parent 16a77e2975
commit dc1dc8dffa
2 changed files with 60 additions and 0 deletions

View file

@ -4909,4 +4909,55 @@ void Session::clearLocalStorage() {
_bigFileCache->clear();
}
rpl::producer<std::vector<UserId>> 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<UserId>();
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<std::vector<UserId>> Session::knownContactBirthdays() const {
if ((_contactBirthdaysLastDayRequest == -1)
|| (_contactBirthdaysLastDayRequest != QDate::currentDate().day())) {
return std::nullopt;
}
return _contactBirthdays;
}
} // namespace Data

View file

@ -816,6 +816,11 @@ public:
void sentFromScheduled(SentFromScheduled value);
[[nodiscard]] rpl::producer<SentFromScheduled> sentFromScheduled() const;
[[nodiscard]] rpl::producer<std::vector<UserId>> contactBirthdays(
bool force = false);
[[nodiscard]] std::optional<std::vector<UserId>> knownContactBirthdays(
) const;
void clearLocalStorage();
private:
@ -1130,6 +1135,10 @@ private:
not_null<ChannelData*>,
mtpRequestId> _viewAsMessagesRequests;
mtpRequestId _contactBirthdaysRequestId = 0;
int _contactBirthdaysLastDayRequest = -1;
std::vector<UserId> _contactBirthdays;
Groups _groups;
const std::unique_ptr<ChatFilters> _chatsFilters;
const std::unique_ptr<CloudThemes> _cloudThemes;