mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-07 15:43:55 +02:00
Moved out data of contact birthdays to promo suggestions class.
This commit is contained in:
parent
9411d0781b
commit
606dfd29d3
6 changed files with 95 additions and 91 deletions
|
@ -31,6 +31,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "chat_helpers/tabbed_panel.h"
|
#include "chat_helpers/tabbed_panel.h"
|
||||||
#include "chat_helpers/tabbed_selector.h"
|
#include "chat_helpers/tabbed_selector.h"
|
||||||
#include "core/ui_integration.h"
|
#include "core/ui_integration.h"
|
||||||
|
#include "data/components/promo_suggestions.h"
|
||||||
#include "data/data_birthday.h"
|
#include "data/data_birthday.h"
|
||||||
#include "data/data_changes.h"
|
#include "data/data_changes.h"
|
||||||
#include "data/data_channel.h"
|
#include "data/data_channel.h"
|
||||||
|
@ -3441,7 +3442,8 @@ Controller::Controller(not_null<Main::Session*> session, PickCallback pick)
|
||||||
: ContactsBoxController(session)
|
: ContactsBoxController(session)
|
||||||
, _pick(std::move(pick))
|
, _pick(std::move(pick))
|
||||||
, _contactBirthdays(
|
, _contactBirthdays(
|
||||||
session->data().knownContactBirthdays().value_or(std::vector<UserId>{}))
|
session->promoSuggestions().knownContactBirthdays().value_or(
|
||||||
|
std::vector<UserId>{}))
|
||||||
, _selfOption(
|
, _selfOption(
|
||||||
MakeCustomList(
|
MakeCustomList(
|
||||||
session,
|
session,
|
||||||
|
@ -3596,7 +3598,8 @@ bool Controller::overrideKeyboardNavigation(
|
||||||
|
|
||||||
std::unique_ptr<PeerListRow> Controller::createRow(
|
std::unique_ptr<PeerListRow> Controller::createRow(
|
||||||
not_null<UserData*> user) {
|
not_null<UserData*> user) {
|
||||||
if (const auto birthday = user->owner().knownContactBirthdays()) {
|
if (const auto birthday
|
||||||
|
= user->session().promoSuggestions().knownContactBirthdays()) {
|
||||||
if (ranges::contains(*birthday, peerToUser(user->id))) {
|
if (ranges::contains(*birthday, peerToUser(user->id))) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -3627,7 +3630,7 @@ void ChooseStarGiftRecipient(
|
||||||
not_null<Window::SessionController*> window) {
|
not_null<Window::SessionController*> window) {
|
||||||
const auto session = &window->session();
|
const auto session = &window->session();
|
||||||
const auto lifetime = std::make_shared<rpl::lifetime>();
|
const auto lifetime = std::make_shared<rpl::lifetime>();
|
||||||
session->data().contactBirthdays(
|
session->promoSuggestions().contactBirthdays(
|
||||||
) | rpl::start_with_next(crl::guard(session, [=] {
|
) | rpl::start_with_next(crl::guard(session, [=] {
|
||||||
lifetime->destroy();
|
lifetime->destroy();
|
||||||
auto controller = std::make_unique<Controller>(
|
auto controller = std::make_unique<Controller>(
|
||||||
|
|
|
@ -15,12 +15,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "data/data_changes.h"
|
#include "data/data_changes.h"
|
||||||
#include "data/data_histories.h"
|
#include "data/data_histories.h"
|
||||||
#include "data/data_session.h"
|
#include "data/data_session.h"
|
||||||
|
#include "data/data_user.h"
|
||||||
#include "history/history.h"
|
#include "history/history.h"
|
||||||
#include "main/main_session.h"
|
#include "main/main_session.h"
|
||||||
|
|
||||||
namespace Data {
|
namespace Data {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
using UserIds = std::vector<UserId>;
|
||||||
|
|
||||||
constexpr auto kTopPromotionInterval = TimeId(60 * 60);
|
constexpr auto kTopPromotionInterval = TimeId(60 * 60);
|
||||||
constexpr auto kTopPromotionMinDelay = TimeId(10);
|
constexpr auto kTopPromotionMinDelay = TimeId(10);
|
||||||
|
|
||||||
|
@ -194,7 +197,7 @@ bool PromoSuggestions::current(const QString &key) const {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
const auto known
|
const auto known
|
||||||
= _session->data().knownBirthdaysToday();
|
= PromoSuggestions::knownBirthdaysToday();
|
||||||
if (!known) {
|
if (!known) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -231,4 +234,74 @@ std::optional<CustomSuggestion> PromoSuggestions::custom() const {
|
||||||
return _custom;
|
return _custom;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rpl::producer<UserIds> 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<UserIds> PromoSuggestions::knownContactBirthdays() const {
|
||||||
|
if ((_contactBirthdaysLastDayRequest == -1)
|
||||||
|
|| (_contactBirthdaysLastDayRequest != QDate::currentDate().day())) {
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
return _contactBirthdays;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<UserIds> PromoSuggestions::knownBirthdaysToday() const {
|
||||||
|
if ((_contactBirthdaysLastDayRequest == -1)
|
||||||
|
|| (_contactBirthdaysLastDayRequest != QDate::currentDate().day())) {
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
return _contactBirthdaysToday;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Data
|
} // namespace Data
|
||||||
|
|
|
@ -45,6 +45,13 @@ public:
|
||||||
rpl::producer<> value() const;
|
rpl::producer<> value() const;
|
||||||
// Create rpl::producer<> refreshed() const; on memand.
|
// Create rpl::producer<> refreshed() const; on memand.
|
||||||
|
|
||||||
|
[[nodiscard]] rpl::producer<std::vector<UserId>> contactBirthdays(
|
||||||
|
bool force = false);
|
||||||
|
[[nodiscard]] auto knownContactBirthdays() const
|
||||||
|
-> std::optional<std::vector<UserId>>;
|
||||||
|
[[nodiscard]] auto knownBirthdaysToday() const
|
||||||
|
-> std::optional<std::vector<UserId>>;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void setTopPromoted(
|
void setTopPromoted(
|
||||||
History *promoted,
|
History *promoted,
|
||||||
|
@ -60,6 +67,11 @@ private:
|
||||||
|
|
||||||
History *_topPromoted = nullptr;
|
History *_topPromoted = nullptr;
|
||||||
|
|
||||||
|
mtpRequestId _contactBirthdaysRequestId = 0;
|
||||||
|
int _contactBirthdaysLastDayRequest = -1;
|
||||||
|
std::vector<UserId> _contactBirthdays;
|
||||||
|
std::vector<UserId> _contactBirthdaysToday;
|
||||||
|
|
||||||
mtpRequestId _topPromotionRequestId = 0;
|
mtpRequestId _topPromotionRequestId = 0;
|
||||||
std::pair<QString, uint32> _topPromotionKey;
|
std::pair<QString, uint32> _topPromotionKey;
|
||||||
TimeId _topPromotionNextRequestTime = TimeId(0);
|
TimeId _topPromotionNextRequestTime = TimeId(0);
|
||||||
|
|
|
@ -85,7 +85,6 @@ namespace Data {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
using ViewElement = HistoryView::Element;
|
using ViewElement = HistoryView::Element;
|
||||||
using UserIds = std::vector<UserId>;
|
|
||||||
|
|
||||||
// s: box 100x100
|
// s: box 100x100
|
||||||
// m: box 320x320
|
// m: box 320x320
|
||||||
|
@ -4958,74 +4957,4 @@ void Session::clearLocalStorage() {
|
||||||
_bigFileCache->clear();
|
_bigFileCache->clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
rpl::producer<UserIds> 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<UserIds> Session::knownContactBirthdays() const {
|
|
||||||
if ((_contactBirthdaysLastDayRequest == -1)
|
|
||||||
|| (_contactBirthdaysLastDayRequest != QDate::currentDate().day())) {
|
|
||||||
return std::nullopt;
|
|
||||||
}
|
|
||||||
return _contactBirthdays;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::optional<UserIds> Session::knownBirthdaysToday() const {
|
|
||||||
if ((_contactBirthdaysLastDayRequest == -1)
|
|
||||||
|| (_contactBirthdaysLastDayRequest != QDate::currentDate().day())) {
|
|
||||||
return std::nullopt;
|
|
||||||
}
|
|
||||||
return _contactBirthdaysToday;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Data
|
} // namespace Data
|
||||||
|
|
|
@ -830,13 +830,6 @@ public:
|
||||||
void sentFromScheduled(SentFromScheduled value);
|
void sentFromScheduled(SentFromScheduled value);
|
||||||
[[nodiscard]] rpl::producer<SentFromScheduled> sentFromScheduled() const;
|
[[nodiscard]] rpl::producer<SentFromScheduled> sentFromScheduled() const;
|
||||||
|
|
||||||
[[nodiscard]] rpl::producer<std::vector<UserId>> contactBirthdays(
|
|
||||||
bool force = false);
|
|
||||||
[[nodiscard]] auto knownContactBirthdays() const
|
|
||||||
-> std::optional<std::vector<UserId>>;
|
|
||||||
[[nodiscard]] auto knownBirthdaysToday() const
|
|
||||||
-> std::optional<std::vector<UserId>>;
|
|
||||||
|
|
||||||
void clearLocalStorage();
|
void clearLocalStorage();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -1150,11 +1143,6 @@ private:
|
||||||
not_null<ChannelData*>,
|
not_null<ChannelData*>,
|
||||||
mtpRequestId> _viewAsMessagesRequests;
|
mtpRequestId> _viewAsMessagesRequests;
|
||||||
|
|
||||||
mtpRequestId _contactBirthdaysRequestId = 0;
|
|
||||||
int _contactBirthdaysLastDayRequest = -1;
|
|
||||||
std::vector<UserId> _contactBirthdays;
|
|
||||||
std::vector<UserId> _contactBirthdaysToday;
|
|
||||||
|
|
||||||
Groups _groups;
|
Groups _groups;
|
||||||
const std::unique_ptr<ChatFilters> _chatsFilters;
|
const std::unique_ptr<ChatFilters> _chatsFilters;
|
||||||
const std::unique_ptr<CloudThemes> _cloudThemes;
|
const std::unique_ptr<CloudThemes> _cloudThemes;
|
||||||
|
|
|
@ -240,11 +240,10 @@ rpl::producer<Ui::SlideWrap<Ui::RpWidget>*> TopBarSuggestionValue(
|
||||||
return;
|
return;
|
||||||
} else if (session->premiumCanBuy()
|
} else if (session->premiumCanBuy()
|
||||||
&& promo->current(kSugBirthdayContacts.utf8())) {
|
&& promo->current(kSugBirthdayContacts.utf8())) {
|
||||||
session->data().contactBirthdays(
|
promo->contactBirthdays(
|
||||||
) | rpl::start_with_next(crl::guard(content, [=] {
|
) | rpl::start_with_next(crl::guard(content, [=] {
|
||||||
const auto users = session->data()
|
const auto users = promo->knownBirthdaysToday().value_or(
|
||||||
.knownBirthdaysToday().value_or(
|
std::vector<UserId>());
|
||||||
std::vector<UserId>());
|
|
||||||
if (users.empty()) {
|
if (users.empty()) {
|
||||||
repeat(repeat);
|
repeat(repeat);
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Add table
Reference in a new issue