Fix repairing of main user photo.
GitOrigin-RevId: 6cd643f17af99b92eec9fe230aa30fc3469c4407
This commit is contained in:
parent
62a01e2b61
commit
e0dd56ce8c
@ -6530,8 +6530,15 @@ void ContactsManager::on_get_user_photos(UserId user_id, int32 offset, int32 lim
|
|||||||
CHECK(limit == 1);
|
CHECK(limit == 1);
|
||||||
for (auto &photo_ptr : photos) {
|
for (auto &photo_ptr : photos) {
|
||||||
if (photo_ptr->get_id() == telegram_api::photo::ID) {
|
if (photo_ptr->get_id() == telegram_api::photo::ID) {
|
||||||
auto photo = get_photo(td_->file_manager_.get(), telegram_api::move_object_as<telegram_api::photo>(photo_ptr),
|
auto server_photo = telegram_api::move_object_as<telegram_api::photo>(photo_ptr);
|
||||||
DialogId());
|
auto profile_photo = convert_photo_to_profile_photo(server_photo);
|
||||||
|
if (profile_photo) {
|
||||||
|
get_profile_photo(td_->file_manager_.get(), std::move(profile_photo));
|
||||||
|
} else {
|
||||||
|
LOG(ERROR) << "Failed to get profile photo from " << to_string(server_photo);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto photo = get_photo(td_->file_manager_.get(), std::move(server_photo), DialogId());
|
||||||
add_user_photo_id(u, user_id, photo.id, photo_get_file_ids(photo));
|
add_user_photo_id(u, user_id, photo.id, photo_get_file_ids(photo));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -64,13 +64,12 @@ StringBuilder &operator<<(StringBuilder &string_builder, const Dimensions &dimen
|
|||||||
static FileId register_photo(FileManager *file_manager, FileType file_type, int64 id, int64 access_hash,
|
static FileId register_photo(FileManager *file_manager, FileType file_type, int64 id, int64 access_hash,
|
||||||
tl_object_ptr<telegram_api::FileLocation> &&location_ptr, DialogId owner_dialog_id,
|
tl_object_ptr<telegram_api::FileLocation> &&location_ptr, DialogId owner_dialog_id,
|
||||||
int32 file_size, bool is_webp = false) {
|
int32 file_size, bool is_webp = false) {
|
||||||
int32 location_id = location_ptr->get_id();
|
|
||||||
DcId dc_id;
|
DcId dc_id;
|
||||||
int32 local_id;
|
int32 local_id;
|
||||||
int64 volume_id;
|
int64 volume_id;
|
||||||
int64 secret;
|
int64 secret;
|
||||||
std::string file_reference;
|
std::string file_reference;
|
||||||
switch (location_id) {
|
switch (location_ptr->get_id()) {
|
||||||
case telegram_api::fileLocationUnavailable::ID: {
|
case telegram_api::fileLocationUnavailable::ID: {
|
||||||
auto location = move_tl_object_as<telegram_api::fileLocationUnavailable>(location_ptr);
|
auto location = move_tl_object_as<telegram_api::fileLocationUnavailable>(location_ptr);
|
||||||
dc_id = DcId::invalid();
|
dc_id = DcId::invalid();
|
||||||
@ -259,8 +258,7 @@ PhotoSize get_photo_size(FileManager *file_manager, FileType file_type, int64 id
|
|||||||
PhotoSize res;
|
PhotoSize res;
|
||||||
BufferSlice content;
|
BufferSlice content;
|
||||||
|
|
||||||
int32 size_id = size_ptr->get_id();
|
switch (size_ptr->get_id()) {
|
||||||
switch (size_id) {
|
|
||||||
case telegram_api::photoSizeEmpty::ID:
|
case telegram_api::photoSizeEmpty::ID:
|
||||||
return res;
|
return res;
|
||||||
case telegram_api::photoSize::ID: {
|
case telegram_api::photoSize::ID: {
|
||||||
@ -286,7 +284,6 @@ PhotoSize get_photo_size(FileManager *file_manager, FileType file_type, int64 id
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
break;
|
break;
|
||||||
@ -481,6 +478,9 @@ Photo get_photo(FileManager *file_manager, tl_object_ptr<telegram_api::photo> &&
|
|||||||
res.date = photo->date_;
|
res.date = photo->date_;
|
||||||
res.has_stickers = (photo->flags_ & telegram_api::photo::HAS_STICKERS_MASK) != 0;
|
res.has_stickers = (photo->flags_ & telegram_api::photo::HAS_STICKERS_MASK) != 0;
|
||||||
|
|
||||||
|
auto file_reference = photo->file_reference_.as_slice().str();
|
||||||
|
// TODO use file_reference
|
||||||
|
|
||||||
for (auto &size_ptr : photo->sizes_) {
|
for (auto &size_ptr : photo->sizes_) {
|
||||||
res.photos.push_back(get_photo_size(file_manager, FileType::Photo, photo->id_, photo->access_hash_, owner_dialog_id,
|
res.photos.push_back(get_photo_size(file_manager, FileType::Photo, photo->id_, photo->access_hash_, owner_dialog_id,
|
||||||
std::move(size_ptr), false));
|
std::move(size_ptr), false));
|
||||||
@ -662,4 +662,62 @@ StringBuilder &operator<<(StringBuilder &string_builder, const Photo &photo) {
|
|||||||
return string_builder << "[id = " << photo.id << ", photos = " << format::as_array(photo.photos) << "]";
|
return string_builder << "[id = " << photo.id << ", photos = " << format::as_array(photo.photos) << "]";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static tl_object_ptr<telegram_api::FileLocation> copy_location(
|
||||||
|
const tl_object_ptr<telegram_api::FileLocation> &location_ptr) {
|
||||||
|
CHECK(location_ptr != nullptr);
|
||||||
|
switch (location_ptr->get_id()) {
|
||||||
|
case telegram_api::fileLocationUnavailable::ID: {
|
||||||
|
auto location = static_cast<const telegram_api::fileLocationUnavailable *>(location_ptr.get());
|
||||||
|
return make_tl_object<telegram_api::fileLocationUnavailable>(location->volume_id_, location->local_id_,
|
||||||
|
location->secret_);
|
||||||
|
}
|
||||||
|
case telegram_api::fileLocation::ID: {
|
||||||
|
auto location = static_cast<const telegram_api::fileLocation *>(location_ptr.get());
|
||||||
|
return make_tl_object<telegram_api::fileLocation>(location->dc_id_, location->volume_id_, location->local_id_,
|
||||||
|
location->secret_, location->file_reference_.clone());
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
UNREACHABLE();
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tl_object_ptr<telegram_api::userProfilePhoto> convert_photo_to_profile_photo(
|
||||||
|
const tl_object_ptr<telegram_api::photo> &photo) {
|
||||||
|
CHECK(photo != nullptr);
|
||||||
|
tl_object_ptr<telegram_api::FileLocation> photo_small;
|
||||||
|
tl_object_ptr<telegram_api::FileLocation> photo_big;
|
||||||
|
for (auto &size_ptr : photo->sizes_) {
|
||||||
|
switch (size_ptr->get_id()) {
|
||||||
|
case telegram_api::photoSizeEmpty::ID:
|
||||||
|
break;
|
||||||
|
case telegram_api::photoSize::ID: {
|
||||||
|
auto size = static_cast<const telegram_api::photoSize *>(size_ptr.get());
|
||||||
|
if (size->type_ == "a") {
|
||||||
|
photo_small = copy_location(size->location_);
|
||||||
|
} else if (size->type_ == "c") {
|
||||||
|
photo_big = copy_location(size->location_);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case telegram_api::photoCachedSize::ID: {
|
||||||
|
auto size = static_cast<const telegram_api::photoCachedSize *>(size_ptr.get());
|
||||||
|
if (size->type_ == "a") {
|
||||||
|
photo_small = copy_location(size->location_);
|
||||||
|
} else if (size->type_ == "c") {
|
||||||
|
photo_big = copy_location(size->location_);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
UNREACHABLE();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (photo_small == nullptr || photo_big == nullptr) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
return make_tl_object<telegram_api::userProfilePhoto>(photo->id_, std::move(photo_small), std::move(photo_big));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
@ -124,4 +124,7 @@ bool operator!=(const Photo &lhs, const Photo &rhs);
|
|||||||
|
|
||||||
StringBuilder &operator<<(StringBuilder &string_builder, const Photo &photo);
|
StringBuilder &operator<<(StringBuilder &string_builder, const Photo &photo);
|
||||||
|
|
||||||
|
tl_object_ptr<telegram_api::userProfilePhoto> convert_photo_to_profile_photo(
|
||||||
|
const tl_object_ptr<telegram_api::photo> &photo);
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
@ -1843,7 +1843,7 @@ void FileManager::resume_upload(FileId file_id, std::vector<int> bad_parts, std:
|
|||||||
}
|
}
|
||||||
FileView file_view(node);
|
FileView file_view(node);
|
||||||
if (file_view.has_active_remote_location() && file_view.get_type() != FileType::Thumbnail &&
|
if (file_view.has_active_remote_location() && file_view.get_type() != FileType::Thumbnail &&
|
||||||
file_view.get_type() != FileType::EncryptedThumbnail) {
|
file_view.get_type() != FileType::EncryptedThumbnail && file_view.get_type() != FileType::Photo) {
|
||||||
LOG(INFO) << "File " << file_id << " is already uploaded";
|
LOG(INFO) << "File " << file_id << " is already uploaded";
|
||||||
if (callback) {
|
if (callback) {
|
||||||
callback->on_upload_ok(file_id, nullptr);
|
callback->on_upload_ok(file_id, nullptr);
|
||||||
|
Loading…
Reference in New Issue
Block a user