Add updateContactCloseBirthdays.
This commit is contained in:
parent
e9794b9215
commit
cfeed162e9
@ -580,6 +580,9 @@ chatLocation location:location address:string = ChatLocation;
|
|||||||
//@description Represents a birthdate of a user @day Day of the month; 1-31 @month Month of the year; 1-12 @year Birth year; 0 if unknown
|
//@description Represents a birthdate of a user @day Day of the month; 1-31 @month Month of the year; 1-12 @year Birth year; 0 if unknown
|
||||||
birthdate day:int32 month:int32 year:int32 = Birthdate;
|
birthdate day:int32 month:int32 year:int32 = Birthdate;
|
||||||
|
|
||||||
|
//@description Describes a user that had or will have a birthday soon @user_id User identifier @birthdate Birthdate of the user
|
||||||
|
closeBirthdayUser user_id:int53 birthdate:birthdate = CloseBirthdayUser;
|
||||||
|
|
||||||
|
|
||||||
//@class BusinessAwayMessageSchedule @description Describes conditions for sending of away messages by a Telegram Business account
|
//@class BusinessAwayMessageSchedule @description Describes conditions for sending of away messages by a Telegram Business account
|
||||||
|
|
||||||
@ -7079,6 +7082,9 @@ updateAnimationSearchParameters provider:string emojis:vector<string> = Update;
|
|||||||
//@description The list of suggested to the user actions has changed @added_actions Added suggested actions @removed_actions Removed suggested actions
|
//@description The list of suggested to the user actions has changed @added_actions Added suggested actions @removed_actions Removed suggested actions
|
||||||
updateSuggestedActions added_actions:vector<SuggestedAction> removed_actions:vector<SuggestedAction> = Update;
|
updateSuggestedActions added_actions:vector<SuggestedAction> removed_actions:vector<SuggestedAction> = Update;
|
||||||
|
|
||||||
|
//@description The list of contacts that had birthdays recently or will have birthday soon has changed @close_birthday_users List of contact users with close birthday
|
||||||
|
updateContactCloseBirthdays close_birthday_users:vector<closeBirthdayUser> = Update;
|
||||||
|
|
||||||
//@description Adding users to a chat has failed because of their privacy settings. An invite link can be shared with the users if appropriate @chat_id Chat identifier @user_ids Identifiers of users, which weren't added because of their privacy settings
|
//@description Adding users to a chat has failed because of their privacy settings. An invite link can be shared with the users if appropriate @chat_id Chat identifier @user_ids Identifiers of users, which weren't added because of their privacy settings
|
||||||
updateAddChatMembersPrivacyForbidden chat_id:int53 user_ids:vector<int53> = Update;
|
updateAddChatMembersPrivacyForbidden chat_id:int53 user_ids:vector<int53> = Update;
|
||||||
|
|
||||||
|
@ -121,6 +121,28 @@ class GetContactsQuery final : public Td::ResultHandler {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class GetContactsBirthdaysQuery final : public Td::ResultHandler {
|
||||||
|
public:
|
||||||
|
void send() {
|
||||||
|
send_query(G()->net_query_creator().create(telegram_api::contacts_getBirthdays()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void on_result(BufferSlice packet) final {
|
||||||
|
auto result_ptr = fetch_result<telegram_api::contacts_getBirthdays>(packet);
|
||||||
|
if (result_ptr.is_error()) {
|
||||||
|
return on_error(result_ptr.move_as_error());
|
||||||
|
}
|
||||||
|
|
||||||
|
auto ptr = result_ptr.move_as_ok();
|
||||||
|
LOG(INFO) << "Receive result for GetContactBirthdaysQuery: " << to_string(ptr);
|
||||||
|
td_->contacts_manager_->on_get_contact_birthdates(std::move(ptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
void on_error(Status status) final {
|
||||||
|
td_->contacts_manager_->on_get_contact_birthdates(nullptr);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class GetContactsStatusesQuery final : public Td::ResultHandler {
|
class GetContactsStatusesQuery final : public Td::ResultHandler {
|
||||||
public:
|
public:
|
||||||
void send() {
|
void send() {
|
||||||
@ -5892,6 +5914,48 @@ std::pair<int32, vector<UserId>> ContactsManager::search_contacts(const string &
|
|||||||
return {narrow_cast<int32>(result.first), std::move(user_ids)};
|
return {narrow_cast<int32>(result.first), std::move(user_ids)};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ContactsManager::reload_contact_birthdates(bool force) {
|
||||||
|
if (!G()->close_flag() && !td_->auth_manager_->is_bot() && !contact_birthdates_.is_being_synced_ &&
|
||||||
|
(contact_birthdates_.next_sync_time_ < Time::now() || force)) {
|
||||||
|
contact_birthdates_.is_being_synced_ = true;
|
||||||
|
td_->create_handler<GetContactsBirthdaysQuery>()->send();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContactsManager::on_get_contact_birthdates(
|
||||||
|
telegram_api::object_ptr<telegram_api::contacts_contactBirthdays> &&birthdays) {
|
||||||
|
CHECK(contact_birthdates_.is_being_synced_);
|
||||||
|
contact_birthdates_.is_being_synced_ = false;
|
||||||
|
if (birthdays == nullptr) {
|
||||||
|
contact_birthdates_.next_sync_time_ = Time::now() + Random::fast(120, 180);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
contact_birthdates_.next_sync_time_ = Time::now() + Random::fast(86400 / 4, 86400 / 3);
|
||||||
|
|
||||||
|
td_->contacts_manager_->on_get_users(std::move(birthdays->users_), "on_get_contact_birthdates");
|
||||||
|
vector<std::pair<UserId, Birthdate>> users;
|
||||||
|
for (auto &contact : birthdays->contacts_) {
|
||||||
|
UserId user_id(contact->contact_id_);
|
||||||
|
if (is_user_contact(user_id)) {
|
||||||
|
Birthdate birthdate(std::move(contact->birthday_));
|
||||||
|
UserFull *user_full = get_user_full_force(user_id, "on_get_contact_birthdates");
|
||||||
|
if (user_full != nullptr && user_full->birthdate != birthdate) {
|
||||||
|
user_full->birthdate = birthdate;
|
||||||
|
user_full->is_changed = true;
|
||||||
|
update_user_full(user_full, user_id, "on_get_contact_birthdates");
|
||||||
|
}
|
||||||
|
if (!birthdate.is_empty()) {
|
||||||
|
users.emplace_back(user_id, birthdate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (contact_birthdates_.users_ != users) {
|
||||||
|
contact_birthdates_.users_ = std::move(users);
|
||||||
|
send_closure(G()->td(), &Td::send_update, get_update_contact_close_birthdays());
|
||||||
|
}
|
||||||
|
// there is no need to save them between restarts
|
||||||
|
}
|
||||||
|
|
||||||
vector<UserId> ContactsManager::get_close_friends(Promise<Unit> &&promise) {
|
vector<UserId> ContactsManager::get_close_friends(Promise<Unit> &&promise) {
|
||||||
if (!are_contacts_loaded_) {
|
if (!are_contacts_loaded_) {
|
||||||
load_contacts(std::move(promise));
|
load_contacts(std::move(promise));
|
||||||
@ -10500,8 +10564,7 @@ void ContactsManager::on_get_user_full(tl_object_ptr<telegram_api::userFull> &&u
|
|||||||
user_full->broadcast_administrator_rights != broadcast_administrator_rights ||
|
user_full->broadcast_administrator_rights != broadcast_administrator_rights ||
|
||||||
user_full->premium_gift_options != premium_gift_options ||
|
user_full->premium_gift_options != premium_gift_options ||
|
||||||
user_full->voice_messages_forbidden != voice_messages_forbidden ||
|
user_full->voice_messages_forbidden != voice_messages_forbidden ||
|
||||||
user_full->can_pin_messages != can_pin_messages || user_full->has_pinned_stories != has_pinned_stories ||
|
user_full->can_pin_messages != can_pin_messages || user_full->has_pinned_stories != has_pinned_stories) {
|
||||||
user_full->birthdate != birthdate) {
|
|
||||||
user_full->can_be_called = can_be_called;
|
user_full->can_be_called = can_be_called;
|
||||||
user_full->supports_video_calls = supports_video_calls;
|
user_full->supports_video_calls = supports_video_calls;
|
||||||
user_full->has_private_calls = has_private_calls;
|
user_full->has_private_calls = has_private_calls;
|
||||||
@ -10511,10 +10574,18 @@ void ContactsManager::on_get_user_full(tl_object_ptr<telegram_api::userFull> &&u
|
|||||||
user_full->voice_messages_forbidden = voice_messages_forbidden;
|
user_full->voice_messages_forbidden = voice_messages_forbidden;
|
||||||
user_full->can_pin_messages = can_pin_messages;
|
user_full->can_pin_messages = can_pin_messages;
|
||||||
user_full->has_pinned_stories = has_pinned_stories;
|
user_full->has_pinned_stories = has_pinned_stories;
|
||||||
user_full->birthdate = birthdate;
|
|
||||||
|
|
||||||
user_full->is_changed = true;
|
user_full->is_changed = true;
|
||||||
}
|
}
|
||||||
|
if (user_full->birthdate != birthdate) {
|
||||||
|
user_full->birthdate = birthdate;
|
||||||
|
user_full->is_changed = true;
|
||||||
|
|
||||||
|
if (u->is_contact) {
|
||||||
|
reload_contact_birthdates(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (user_full->private_forward_name != user->private_forward_name_) {
|
if (user_full->private_forward_name != user->private_forward_name_) {
|
||||||
if (user_full->private_forward_name.empty() != user->private_forward_name_.empty()) {
|
if (user_full->private_forward_name.empty() != user->private_forward_name_.empty()) {
|
||||||
user_full->is_changed = true;
|
user_full->is_changed = true;
|
||||||
@ -11624,6 +11695,8 @@ void ContactsManager::on_update_user_is_contact(User *u, UserId user_id, bool is
|
|||||||
if (u->is_contact != is_contact) {
|
if (u->is_contact != is_contact) {
|
||||||
u->is_contact = is_contact;
|
u->is_contact = is_contact;
|
||||||
u->is_is_contact_changed = true;
|
u->is_is_contact_changed = true;
|
||||||
|
|
||||||
|
reload_contact_birthdates(true);
|
||||||
}
|
}
|
||||||
if (u->is_mutual_contact != is_mutual_contact) {
|
if (u->is_mutual_contact != is_mutual_contact) {
|
||||||
u->is_mutual_contact = is_mutual_contact;
|
u->is_mutual_contact = is_mutual_contact;
|
||||||
@ -16206,6 +16279,14 @@ bool ContactsManager::get_user_has_unread_stories(const User *u) {
|
|||||||
return u->max_active_story_id.get() > u->max_read_story_id.get();
|
return u->max_active_story_id.get() > u->max_read_story_id.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
td_api::object_ptr<td_api::updateContactCloseBirthdays> ContactsManager::get_update_contact_close_birthdays() const {
|
||||||
|
return td_api::make_object<td_api::updateContactCloseBirthdays>(
|
||||||
|
transform(contact_birthdates_.users_, [this](auto &user) {
|
||||||
|
return td_api::make_object<td_api::closeBirthdayUser>(get_user_id_object(user.first, "closeBirthdayUser"),
|
||||||
|
user.second.get_birthdate_object());
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
td_api::object_ptr<td_api::updateUser> ContactsManager::get_update_user_object(UserId user_id, const User *u) const {
|
td_api::object_ptr<td_api::updateUser> ContactsManager::get_update_user_object(UserId user_id, const User *u) const {
|
||||||
if (u == nullptr) {
|
if (u == nullptr) {
|
||||||
return get_update_unknown_user_object(user_id);
|
return get_update_unknown_user_object(user_id);
|
||||||
@ -16653,6 +16734,10 @@ void ContactsManager::get_current_state(vector<td_api::object_ptr<td_api::Update
|
|||||||
updates.push_back(td_api::make_object<td_api::updateBasicGroupFullInfo>(
|
updates.push_back(td_api::make_object<td_api::updateBasicGroupFullInfo>(
|
||||||
chat_id.get(), get_basic_group_full_info_object(chat_id, chat_full.get())));
|
chat_id.get(), get_basic_group_full_info_object(chat_id, chat_full.get())));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (!contact_birthdates_.users_.empty()) {
|
||||||
|
updates.push_back(get_update_contact_close_birthdays());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
@ -213,10 +213,14 @@ class ContactsManager final : public Actor {
|
|||||||
|
|
||||||
void on_get_contacts_failed(Status error);
|
void on_get_contacts_failed(Status error);
|
||||||
|
|
||||||
|
void on_get_contact_birthdates(telegram_api::object_ptr<telegram_api::contacts_contactBirthdays> &&birthdays);
|
||||||
|
|
||||||
void on_get_contacts_statuses(vector<tl_object_ptr<telegram_api::contactStatus>> &&statuses);
|
void on_get_contacts_statuses(vector<tl_object_ptr<telegram_api::contactStatus>> &&statuses);
|
||||||
|
|
||||||
void reload_contacts(bool force);
|
void reload_contacts(bool force);
|
||||||
|
|
||||||
|
void reload_contact_birthdates(bool force);
|
||||||
|
|
||||||
void on_get_user(tl_object_ptr<telegram_api::User> &&user, const char *source);
|
void on_get_user(tl_object_ptr<telegram_api::User> &&user, const char *source);
|
||||||
void on_get_users(vector<tl_object_ptr<telegram_api::User>> &&users, const char *source);
|
void on_get_users(vector<tl_object_ptr<telegram_api::User>> &&users, const char *source);
|
||||||
|
|
||||||
@ -1589,6 +1593,8 @@ class ContactsManager final : public Actor {
|
|||||||
|
|
||||||
static bool get_user_has_unread_stories(const User *u);
|
static bool get_user_has_unread_stories(const User *u);
|
||||||
|
|
||||||
|
td_api::object_ptr<td_api::updateContactCloseBirthdays> get_update_contact_close_birthdays() const;
|
||||||
|
|
||||||
td_api::object_ptr<td_api::updateUser> get_update_user_object(UserId user_id, const User *u) const;
|
td_api::object_ptr<td_api::updateUser> get_update_user_object(UserId user_id, const User *u) const;
|
||||||
|
|
||||||
td_api::object_ptr<td_api::updateUser> get_update_unknown_user_object(UserId user_id) const;
|
td_api::object_ptr<td_api::updateUser> get_update_unknown_user_object(UserId user_id) const;
|
||||||
@ -1812,6 +1818,13 @@ class ContactsManager final : public Actor {
|
|||||||
WaitFreeHashSet<UserId, UserIdHash> restricted_user_ids_;
|
WaitFreeHashSet<UserId, UserIdHash> restricted_user_ids_;
|
||||||
WaitFreeHashSet<ChannelId, ChannelIdHash> restricted_channel_ids_;
|
WaitFreeHashSet<ChannelId, ChannelIdHash> restricted_channel_ids_;
|
||||||
|
|
||||||
|
struct ContactBirthdates {
|
||||||
|
vector<std::pair<UserId, Birthdate>> users_;
|
||||||
|
double next_sync_time_ = 0.0;
|
||||||
|
bool is_being_synced_ = false;
|
||||||
|
};
|
||||||
|
ContactBirthdates contact_birthdates_;
|
||||||
|
|
||||||
vector<Contact> next_all_imported_contacts_;
|
vector<Contact> next_all_imported_contacts_;
|
||||||
vector<size_t> imported_contacts_unique_id_;
|
vector<size_t> imported_contacts_unique_id_;
|
||||||
vector<size_t> imported_contacts_pos_;
|
vector<size_t> imported_contacts_pos_;
|
||||||
|
@ -2265,6 +2265,7 @@ void UpdatesManager::try_reload_data() {
|
|||||||
LOG(INFO) << "Reload data";
|
LOG(INFO) << "Reload data";
|
||||||
td_->animations_manager_->reload_saved_animations(true);
|
td_->animations_manager_->reload_saved_animations(true);
|
||||||
td_->autosave_manager_->reload_autosave_settings();
|
td_->autosave_manager_->reload_autosave_settings();
|
||||||
|
td_->contacts_manager_->reload_contact_birthdates(false);
|
||||||
td_->contacts_manager_->reload_created_public_dialogs(PublicDialogType::HasUsername, std::move(promise));
|
td_->contacts_manager_->reload_created_public_dialogs(PublicDialogType::HasUsername, std::move(promise));
|
||||||
td_->contacts_manager_->reload_created_public_dialogs(PublicDialogType::IsLocationBased, Auto());
|
td_->contacts_manager_->reload_created_public_dialogs(PublicDialogType::IsLocationBased, Auto());
|
||||||
td_->contacts_manager_->reload_created_public_dialogs(PublicDialogType::ForPersonalDialog, Auto());
|
td_->contacts_manager_->reload_created_public_dialogs(PublicDialogType::ForPersonalDialog, Auto());
|
||||||
|
Loading…
Reference in New Issue
Block a user