Add profile photo to userFullInfo.

GitOrigin-RevId: 8bf6604de32e191a0aa412cab1c00739eb774dd7
This commit is contained in:
levlam 2020-06-23 19:40:37 +03:00
parent d0499a5505
commit b02b578ab9
5 changed files with 57 additions and 23 deletions

View File

@ -344,6 +344,13 @@ botInfo description:string commands:vector<botCommand> = BotInfo;
chatLocation location:location address:string = ChatLocation; chatLocation location:location address:string = ChatLocation;
//@description Contains full information about a user profile photo @id Unique user profile photo identifier @added_date Point in time (Unix timestamp) when the photo has been added @sizes Available variants of the user photo, in different sizes
userProfilePhoto id:int64 added_date:int32 sizes:vector<photoSize> = UserProfilePhoto;
//@description Contains part of the list of user photos @total_count Total number of user profile photos @photos A list of photos
userProfilePhotos total_count:int32 photos:vector<userProfilePhoto> = UserProfilePhotos;
//@description Represents a user @id User identifier @first_name First name of the user @last_name Last name of the user @username Username of the user //@description Represents a user @id User identifier @first_name First name of the user @last_name Last name of the user @username Username of the user
//@phone_number Phone number of the user @status Current online status of the user @profile_photo Profile photo of the user; may be null //@phone_number Phone number of the user @status Current online status of the user @profile_photo Profile photo of the user; may be null
//@is_contact The user is a contact of the current user //@is_contact The user is a contact of the current user
@ -354,17 +361,13 @@ chatLocation location:location address:string = ChatLocation;
//@have_access If false, the user is inaccessible, and the only information known about the user is inside this class. It can't be passed to any method except GetUser @type Type of the user @language_code IETF language tag of the user's language; only available to bots //@have_access If false, the user is inaccessible, and the only information known about the user is inside this class. It can't be passed to any method except GetUser @type Type of the user @language_code IETF language tag of the user's language; only available to bots
user id:int32 first_name:string last_name:string username:string phone_number:string status:UserStatus profile_photo:profilePhoto is_contact:Bool is_mutual_contact:Bool is_verified:Bool is_support:Bool restriction_reason:string is_scam:Bool have_access:Bool type:UserType language_code:string = User; user id:int32 first_name:string last_name:string username:string phone_number:string status:UserStatus profile_photo:profilePhoto is_contact:Bool is_mutual_contact:Bool is_verified:Bool is_support:Bool restriction_reason:string is_scam:Bool have_access:Bool type:UserType language_code:string = User;
//@description Contains full information about a user (except the full list of profile photos) @is_blocked True, if the user is blacklisted by the current user //@description Contains full information about a user
//@photo User profile photo; may be null
//@is_blocked True, if the user is blocked by the current user
//@can_be_called True, if the user can be called @has_private_calls True, if the user can't be called due to their privacy settings //@can_be_called True, if the user can be called @has_private_calls True, if the user can't be called due to their privacy settings
//@need_phone_number_privacy_exception True, if the current user needs to explicitly allow to share their phone number with the user when the method addContact is used //@need_phone_number_privacy_exception True, if the current user needs to explicitly allow to share their phone number with the user when the method addContact is used
//@bio A short user bio @share_text For bots, the text that is included with the link when users share the bot @group_in_common_count Number of group chats where both the other user and the current user are a member; 0 for the current user @bot_info If the user is a bot, information about the bot; may be null //@bio A short user bio @share_text For bots, the text that is included with the link when users share the bot @group_in_common_count Number of group chats where both the other user and the current user are a member; 0 for the current user @bot_info If the user is a bot, information about the bot; may be null
userFullInfo is_blocked:Bool can_be_called:Bool has_private_calls:Bool need_phone_number_privacy_exception:Bool bio:string share_text:string group_in_common_count:int32 bot_info:botInfo = UserFullInfo; userFullInfo photo:userProfilePhoto is_blocked:Bool can_be_called:Bool has_private_calls:Bool need_phone_number_privacy_exception:Bool bio:string share_text:string group_in_common_count:int32 bot_info:botInfo = UserFullInfo;
//@description Contains full information about a user profile photo @id Unique user profile photo identifier @added_date Point in time (Unix timestamp) when the photo has been added @sizes Available variants of the user photo, in different sizes
userProfilePhoto id:int64 added_date:int32 sizes:vector<photoSize> = UserProfilePhoto;
//@description Contains part of the list of user photos @total_count Total number of user profile photos @photos A list of photos
userProfilePhotos total_count:int32 photos:vector<userProfilePhoto> = UserProfilePhotos;
//@description Represents a list of users @total_count Approximate total count of users found @user_ids A list of user identifiers //@description Represents a list of users @total_count Approximate total count of users found @user_ids A list of user identifiers
users total_count:int32 user_ids:vector<int32> = Users; users total_count:int32 user_ids:vector<int32> = Users;
@ -3956,10 +3959,10 @@ sendCallDebugInformation call_id:int32 debug_information:string = Ok;
//@description Adds a user to the blacklist @user_id User identifier //@description Blocks a user @user_id User identifier
blockUser user_id:int32 = Ok; blockUser user_id:int32 = Ok;
//@description Removes a user from the blacklist @user_id User identifier //@description Unblocks a user @user_id User identifier
unblockUser user_id:int32 = Ok; unblockUser user_id:int32 = Ok;
//@description Returns users that were blocked by the current user @offset Number of users to skip in the result; must be non-negative @limit The maximum number of users to return; up to 100 //@description Returns users that were blocked by the current user @offset Number of users to skip in the result; must be non-negative @limit The maximum number of users to return; up to 100

Binary file not shown.

View File

@ -8455,7 +8455,7 @@ void ContactsManager::update_user(User *u, UserId user_id, bool from_binlog, boo
add_user_photo_id(u, user_id, u->photo.id, dialog_photo_get_file_ids(u->photo)); add_user_photo_id(u, user_id, u->photo.id, dialog_photo_get_file_ids(u->photo));
drop_user_photos(user_id, u->photo.id <= 0, "update_user"); drop_user_photos(user_id, u->photo.id <= 0, true, "update_user");
} }
if (u->is_status_changed && user_id != get_my_id()) { if (u->is_status_changed && user_id != get_my_id()) {
auto left_time = get_user_was_online(u, user_id) - G()->server_time_cached(); auto left_time = get_user_was_online(u, user_id) - G()->server_time_cached();
@ -8850,7 +8850,7 @@ void ContactsManager::on_get_user_full(tl_object_ptr<telegram_api::userFull> &&u
} }
on_get_user(std::move(user_full->user_), "on_get_user_full"); on_get_user(std::move(user_full->user_), "on_get_user_full");
const User *u = get_user(user_id); User *u = get_user(user_id);
if (u == nullptr) { if (u == nullptr) {
return; return;
} }
@ -8900,10 +8900,13 @@ void ContactsManager::on_get_user_full(tl_object_ptr<telegram_api::userFull> &&u
user->is_changed = true; user->is_changed = true;
} }
Photo photo = get_photo(td_->file_manager_.get(), std::move(user_full->profile_photo_), DialogId()); user->photo = get_photo(td_->file_manager_.get(), std::move(user_full->profile_photo_), DialogId());
if (photo.id == -2) { if (user->photo.id == -2) {
drop_user_photos(user_id, true, "on_get_user_full"); drop_user_photos(user_id, true, false, "on_get_user_full");
} else {
add_user_photo_id(u, user_id, user->photo.id, photo_get_file_ids(user->photo));
} }
if (user_full->bot_info_ != nullptr) { if (user_full->bot_info_ != nullptr) {
if (on_update_bot_info(std::move(user_full->bot_info_), false)) { if (on_update_bot_info(std::move(user_full->bot_info_), false)) {
user->need_send_update = true; user->need_send_update = true;
@ -9417,7 +9420,7 @@ void ContactsManager::on_update_user_photo(User *u, UserId user_id,
bool is_empty = photo == nullptr || photo->get_id() == telegram_api::userProfilePhotoEmpty::ID; bool is_empty = photo == nullptr || photo->get_id() == telegram_api::userProfilePhotoEmpty::ID;
old_photo = std::move(photo); old_photo = std::move(photo);
drop_user_photos(user_id, is_empty, "on_update_user_photo"); drop_user_photos(user_id, is_empty, true, "on_update_user_photo");
return; return;
} }
@ -9704,7 +9707,7 @@ void ContactsManager::on_ignored_restriction_reasons_changed() {
void ContactsManager::on_delete_profile_photo(int64 profile_photo_id, Promise<Unit> promise) { void ContactsManager::on_delete_profile_photo(int64 profile_photo_id, Promise<Unit> promise) {
UserId my_id = get_my_id(); UserId my_id = get_my_id();
drop_user_photos(my_id, false, "on_delete_profile_photo"); drop_user_photos(my_id, false, true, "on_delete_profile_photo");
if (G()->close_flag()) { if (G()->close_flag()) {
return promise.set_value(Unit()); return promise.set_value(Unit());
@ -9713,7 +9716,7 @@ void ContactsManager::on_delete_profile_photo(int64 profile_photo_id, Promise<Un
reload_user(my_id, std::move(promise)); reload_user(my_id, std::move(promise));
} }
void ContactsManager::drop_user_photos(UserId user_id, bool is_empty, const char *source) { void ContactsManager::drop_user_photos(UserId user_id, bool is_empty, bool drop_user_full_photo, const char *source) {
auto it = user_photos_.find(user_id); auto it = user_photos_.find(user_id);
if (it != user_photos_.end()) { if (it != user_photos_.end()) {
auto user_photos = &it->second; auto user_photos = &it->second;
@ -9729,10 +9732,33 @@ void ContactsManager::drop_user_photos(UserId user_id, bool is_empty, const char
user_photos->count = new_count; user_photos->count = new_count;
user_photos->offset = user_photos->count; user_photos->offset = user_photos->count;
} }
if (drop_user_full_photo) {
auto user_full = get_user_full_force(user_id);
if (user_full == nullptr) {
return;
}
if (is_empty) {
if (user_full->photo.id != -2) {
user_full->photo = Photo();
user_full->photo.id = -2;
user_full->is_changed = true;
}
} else {
if (user_full->expires_at > 0.0) {
user_full->expires_at = 0.0;
user_full->need_save_to_database = true;
get_user_full(user_id, true, Auto());
}
}
update_user_full(user_full, user_id);
}
} }
void ContactsManager::drop_user_full(UserId user_id) { void ContactsManager::drop_user_full(UserId user_id) {
drop_user_photos(user_id, false, "drop_user_full"); drop_user_photos(user_id, false, false, "drop_user_full");
bot_infos_.erase(user_id); bot_infos_.erase(user_id);
if (G()->parameters().use_chat_info_db) { if (G()->parameters().use_chat_info_db) {
@ -9746,6 +9772,8 @@ void ContactsManager::drop_user_full(UserId user_id) {
user_full->expires_at = 0.0; user_full->expires_at = 0.0;
user_full->photo = Photo();
user_full->photo.id = -2;
user_full->is_blocked = false; user_full->is_blocked = false;
user_full->can_be_called = false; user_full->can_be_called = false;
user_full->has_private_calls = false; user_full->has_private_calls = false;
@ -13439,9 +13467,9 @@ tl_object_ptr<td_api::userFullInfo> ContactsManager::get_user_full_info_object(U
CHECK(user_full != nullptr); CHECK(user_full != nullptr);
bool is_bot = is_user_bot(user_id); bool is_bot = is_user_bot(user_id);
return make_tl_object<td_api::userFullInfo>( return make_tl_object<td_api::userFullInfo>(
user_full->is_blocked, user_full->can_be_called, user_full->has_private_calls, get_user_profile_photo_object(td_->file_manager_.get(), &user_full->photo), user_full->is_blocked,
user_full->need_phone_number_privacy_exception, is_bot ? string() : user_full->about, user_full->can_be_called, user_full->has_private_calls, user_full->need_phone_number_privacy_exception,
is_bot ? user_full->about : string(), user_full->common_chat_count, is_bot ? string() : user_full->about, is_bot ? user_full->about : string(), user_full->common_chat_count,
is_bot ? get_bot_info_object(user_id) : nullptr); is_bot ? get_bot_info_object(user_id) : nullptr);
} }

View File

@ -646,6 +646,8 @@ class ContactsManager : public Actor {
// do not forget to update drop_user_full and on_get_user_full // do not forget to update drop_user_full and on_get_user_full
struct UserFull { struct UserFull {
Photo photo;
string about; string about;
int32 common_chat_count = 0; int32 common_chat_count = 0;
@ -1105,7 +1107,7 @@ class ContactsManager : public Actor {
void on_update_user_full_common_chat_count(UserFull *user_full, UserId user_id, int32 common_chat_count); void on_update_user_full_common_chat_count(UserFull *user_full, UserId user_id, int32 common_chat_count);
void on_update_user_full_need_phone_number_privacy_exception(UserFull *user_full, UserId user_id, void on_update_user_full_need_phone_number_privacy_exception(UserFull *user_full, UserId user_id,
bool need_phone_number_privacy_exception); bool need_phone_number_privacy_exception);
void drop_user_photos(UserId user_id, bool is_empty, const char *source); void drop_user_photos(UserId user_id, bool is_empty, bool drop_user_full_photo, const char *source);
void drop_user_full(UserId user_id); void drop_user_full(UserId user_id);
void on_set_user_is_blocked_failed(UserId user_id, bool is_blocked, Status error); void on_set_user_is_blocked_failed(UserId user_id, bool is_blocked, Status error);

View File

@ -603,6 +603,7 @@ Photo get_photo(FileManager *file_manager, tl_object_ptr<telegram_api::Photo> &&
} }
Photo get_photo(FileManager *file_manager, tl_object_ptr<telegram_api::photo> &&photo, DialogId owner_dialog_id) { Photo get_photo(FileManager *file_manager, tl_object_ptr<telegram_api::photo> &&photo, DialogId owner_dialog_id) {
CHECK(photo != nullptr);
Photo res; Photo res;
res.id = photo->id_; res.id = photo->id_;