Add and use FileManager::extract_file_references.
This commit is contained in:
parent
96d29d141a
commit
719c03b0a2
@ -3517,13 +3517,15 @@ tl_object_ptr<telegram_api::InputMedia> get_input_media(const MessageContent *co
|
|||||||
CHECK(!had_input_thumbnail);
|
CHECK(!had_input_thumbnail);
|
||||||
}
|
}
|
||||||
if (!was_uploaded) {
|
if (!was_uploaded) {
|
||||||
auto file_reference = FileManager::extract_file_reference(input_media);
|
auto file_references = FileManager::extract_file_references(input_media);
|
||||||
if (file_reference == FileReferenceView::invalid_file_reference()) {
|
for (auto &file_reference : file_references) {
|
||||||
if (!force) {
|
if (file_reference == FileReferenceView::invalid_file_reference()) {
|
||||||
LOG(INFO) << "File " << file_id << " has invalid file reference";
|
if (!force) {
|
||||||
return nullptr;
|
LOG(INFO) << "File " << file_id << " has invalid file reference";
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
LOG(ERROR) << "File " << file_id << " has invalid file reference, but we are forced to use it";
|
||||||
}
|
}
|
||||||
LOG(ERROR) << "File " << file_id << " has invalid file reference, but we forced to use it";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return input_media;
|
return input_media;
|
||||||
@ -3532,14 +3534,16 @@ tl_object_ptr<telegram_api::InputMedia> get_input_media(const MessageContent *co
|
|||||||
tl_object_ptr<telegram_api::InputMedia> get_input_media(const MessageContent *content, Td *td,
|
tl_object_ptr<telegram_api::InputMedia> get_input_media(const MessageContent *content, Td *td,
|
||||||
MessageSelfDestructType ttl, const string &emoji, bool force) {
|
MessageSelfDestructType ttl, const string &emoji, bool force) {
|
||||||
auto input_media = get_input_media_impl(content, td, nullptr, nullptr, ttl, emoji);
|
auto input_media = get_input_media_impl(content, td, nullptr, nullptr, ttl, emoji);
|
||||||
auto file_reference = FileManager::extract_file_reference(input_media);
|
auto file_references = FileManager::extract_file_references(input_media);
|
||||||
if (file_reference == FileReferenceView::invalid_file_reference()) {
|
for (size_t i = 0; i < file_references.size(); i++) {
|
||||||
auto file_id = get_message_content_any_file_id(content);
|
if (file_references[i] == FileReferenceView::invalid_file_reference()) {
|
||||||
if (!force) {
|
auto file_id = get_message_content_any_file_id(content);
|
||||||
LOG(INFO) << "File " << file_id << " has invalid file reference";
|
if (!force) {
|
||||||
return nullptr;
|
LOG(INFO) << "File " << file_id << " has invalid file reference";
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
LOG(ERROR) << "File " << file_id << " has invalid file reference, but we are forced to use it";
|
||||||
}
|
}
|
||||||
LOG(ERROR) << "File " << file_id << " has invalid file reference, but we forced to use it";
|
|
||||||
}
|
}
|
||||||
return input_media;
|
return input_media;
|
||||||
}
|
}
|
||||||
|
@ -3197,7 +3197,7 @@ class SendMediaQuery final : public Td::ResultHandler {
|
|||||||
FileId file_id_;
|
FileId file_id_;
|
||||||
FileId thumbnail_file_id_;
|
FileId thumbnail_file_id_;
|
||||||
DialogId dialog_id_;
|
DialogId dialog_id_;
|
||||||
string file_reference_;
|
vector<string> file_references_;
|
||||||
bool was_uploaded_ = false;
|
bool was_uploaded_ = false;
|
||||||
bool was_thumbnail_uploaded_ = false;
|
bool was_thumbnail_uploaded_ = false;
|
||||||
|
|
||||||
@ -3213,7 +3213,7 @@ class SendMediaQuery final : public Td::ResultHandler {
|
|||||||
file_id_ = file_id;
|
file_id_ = file_id;
|
||||||
thumbnail_file_id_ = thumbnail_file_id;
|
thumbnail_file_id_ = thumbnail_file_id;
|
||||||
dialog_id_ = dialog_id;
|
dialog_id_ = dialog_id;
|
||||||
file_reference_ = FileManager::extract_file_reference(input_media);
|
file_references_ = FileManager::extract_file_references(input_media);
|
||||||
was_uploaded_ = FileManager::extract_was_uploaded(input_media);
|
was_uploaded_ = FileManager::extract_was_uploaded(input_media);
|
||||||
was_thumbnail_uploaded_ = FileManager::extract_was_thumbnail_uploaded(input_media);
|
was_thumbnail_uploaded_ = FileManager::extract_was_thumbnail_uploaded(input_media);
|
||||||
|
|
||||||
@ -3292,9 +3292,10 @@ class SendMediaQuery final : public Td::ResultHandler {
|
|||||||
td_->file_manager_->delete_partial_remote_location_if_needed(file_id_, status);
|
td_->file_manager_->delete_partial_remote_location_if_needed(file_id_, status);
|
||||||
}
|
}
|
||||||
} else if (!td_->auth_manager_->is_bot() && FileReferenceManager::is_file_reference_error(status)) {
|
} else if (!td_->auth_manager_->is_bot() && FileReferenceManager::is_file_reference_error(status)) {
|
||||||
if (file_id_.is_valid() && !was_uploaded_) {
|
auto pos = FileReferenceManager::get_file_reference_error_pos(status);
|
||||||
|
if (file_id_.is_valid() && !was_uploaded_ && pos == 0 && !file_references_.empty()) {
|
||||||
VLOG(file_references) << "Receive " << status << " for " << file_id_;
|
VLOG(file_references) << "Receive " << status << " for " << file_id_;
|
||||||
td_->file_manager_->delete_file_reference(file_id_, file_reference_);
|
td_->file_manager_->delete_file_reference(file_id_, file_references_[0]);
|
||||||
td_->messages_manager_->on_send_message_file_reference_error(random_id_);
|
td_->messages_manager_->on_send_message_file_reference_error(random_id_);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
|
@ -3604,7 +3604,7 @@ vector<tl_object_ptr<telegram_api::InputDocument>> FileManager::get_input_docume
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FileManager::extract_was_uploaded(const tl_object_ptr<telegram_api::InputMedia> &input_media) {
|
bool FileManager::extract_was_uploaded(const telegram_api::object_ptr<telegram_api::InputMedia> &input_media) {
|
||||||
if (input_media == nullptr) {
|
if (input_media == nullptr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -3614,7 +3614,8 @@ bool FileManager::extract_was_uploaded(const tl_object_ptr<telegram_api::InputMe
|
|||||||
input_media_id == telegram_api::inputMediaUploadedDocument::ID;
|
input_media_id == telegram_api::inputMediaUploadedDocument::ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FileManager::extract_was_thumbnail_uploaded(const tl_object_ptr<telegram_api::InputMedia> &input_media) {
|
bool FileManager::extract_was_thumbnail_uploaded(
|
||||||
|
const telegram_api::object_ptr<telegram_api::InputMedia> &input_media) {
|
||||||
if (input_media == nullptr || input_media->get_id() != telegram_api::inputMediaUploadedDocument::ID) {
|
if (input_media == nullptr || input_media->get_id() != telegram_api::inputMediaUploadedDocument::ID) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -3622,7 +3623,7 @@ bool FileManager::extract_was_thumbnail_uploaded(const tl_object_ptr<telegram_ap
|
|||||||
return static_cast<const telegram_api::inputMediaUploadedDocument *>(input_media.get())->thumb_ != nullptr;
|
return static_cast<const telegram_api::inputMediaUploadedDocument *>(input_media.get())->thumb_ != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
string FileManager::extract_file_reference(const tl_object_ptr<telegram_api::InputMedia> &input_media) {
|
string FileManager::extract_file_reference(const telegram_api::object_ptr<telegram_api::InputMedia> &input_media) {
|
||||||
if (input_media == nullptr) {
|
if (input_media == nullptr) {
|
||||||
return string();
|
return string();
|
||||||
}
|
}
|
||||||
@ -3632,12 +3633,35 @@ string FileManager::extract_file_reference(const tl_object_ptr<telegram_api::Inp
|
|||||||
return extract_file_reference(static_cast<const telegram_api::inputMediaDocument *>(input_media.get())->id_);
|
return extract_file_reference(static_cast<const telegram_api::inputMediaDocument *>(input_media.get())->id_);
|
||||||
case telegram_api::inputMediaPhoto::ID:
|
case telegram_api::inputMediaPhoto::ID:
|
||||||
return extract_file_reference(static_cast<const telegram_api::inputMediaPhoto *>(input_media.get())->id_);
|
return extract_file_reference(static_cast<const telegram_api::inputMediaPhoto *>(input_media.get())->id_);
|
||||||
|
case telegram_api::inputMediaPaidMedia::ID:
|
||||||
|
UNREACHABLE();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return string();
|
return string();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
string FileManager::extract_file_reference(const tl_object_ptr<telegram_api::InputDocument> &input_document) {
|
vector<string> FileManager::extract_file_references(
|
||||||
|
const telegram_api::object_ptr<telegram_api::InputMedia> &input_media) {
|
||||||
|
if (input_media == nullptr) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
switch (input_media->get_id()) {
|
||||||
|
case telegram_api::inputMediaDocument::ID:
|
||||||
|
case telegram_api::inputMediaPhoto::ID:
|
||||||
|
return {extract_file_reference(input_media)};
|
||||||
|
case telegram_api::inputMediaPaidMedia::ID:
|
||||||
|
return transform(static_cast<const telegram_api::inputMediaPaidMedia *>(input_media.get())->extended_media_,
|
||||||
|
[](const telegram_api::object_ptr<telegram_api::InputMedia> &media) {
|
||||||
|
return extract_file_reference(media);
|
||||||
|
});
|
||||||
|
default:
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string FileManager::extract_file_reference(
|
||||||
|
const telegram_api::object_ptr<telegram_api::InputDocument> &input_document) {
|
||||||
if (input_document == nullptr || input_document->get_id() != telegram_api::inputDocument::ID) {
|
if (input_document == nullptr || input_document->get_id() != telegram_api::inputDocument::ID) {
|
||||||
return string();
|
return string();
|
||||||
}
|
}
|
||||||
@ -3645,7 +3669,7 @@ string FileManager::extract_file_reference(const tl_object_ptr<telegram_api::Inp
|
|||||||
return static_cast<const telegram_api::inputDocument *>(input_document.get())->file_reference_.as_slice().str();
|
return static_cast<const telegram_api::inputDocument *>(input_document.get())->file_reference_.as_slice().str();
|
||||||
}
|
}
|
||||||
|
|
||||||
string FileManager::extract_file_reference(const tl_object_ptr<telegram_api::InputPhoto> &input_photo) {
|
string FileManager::extract_file_reference(const telegram_api::object_ptr<telegram_api::InputPhoto> &input_photo) {
|
||||||
if (input_photo == nullptr || input_photo->get_id() != telegram_api::inputPhoto::ID) {
|
if (input_photo == nullptr || input_photo->get_id() != telegram_api::inputPhoto::ID) {
|
||||||
return string();
|
return string();
|
||||||
}
|
}
|
||||||
@ -3653,11 +3677,12 @@ string FileManager::extract_file_reference(const tl_object_ptr<telegram_api::Inp
|
|||||||
return static_cast<const telegram_api::inputPhoto *>(input_photo.get())->file_reference_.as_slice().str();
|
return static_cast<const telegram_api::inputPhoto *>(input_photo.get())->file_reference_.as_slice().str();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FileManager::extract_was_uploaded(const tl_object_ptr<telegram_api::InputChatPhoto> &input_chat_photo) {
|
bool FileManager::extract_was_uploaded(const telegram_api::object_ptr<telegram_api::InputChatPhoto> &input_chat_photo) {
|
||||||
return input_chat_photo != nullptr && input_chat_photo->get_id() == telegram_api::inputChatUploadedPhoto::ID;
|
return input_chat_photo != nullptr && input_chat_photo->get_id() == telegram_api::inputChatUploadedPhoto::ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
string FileManager::extract_file_reference(const tl_object_ptr<telegram_api::InputChatPhoto> &input_chat_photo) {
|
string FileManager::extract_file_reference(
|
||||||
|
const telegram_api::object_ptr<telegram_api::InputChatPhoto> &input_chat_photo) {
|
||||||
if (input_chat_photo == nullptr || input_chat_photo->get_id() != telegram_api::inputChatPhoto::ID) {
|
if (input_chat_photo == nullptr || input_chat_photo->get_id() != telegram_api::inputChatPhoto::ID) {
|
||||||
return string();
|
return string();
|
||||||
}
|
}
|
||||||
|
@ -536,19 +536,21 @@ class FileManager final : public FileLoadManager::Callback {
|
|||||||
|
|
||||||
vector<tl_object_ptr<telegram_api::InputDocument>> get_input_documents(const vector<FileId> &file_ids);
|
vector<tl_object_ptr<telegram_api::InputDocument>> get_input_documents(const vector<FileId> &file_ids);
|
||||||
|
|
||||||
static bool extract_was_uploaded(const tl_object_ptr<telegram_api::InputMedia> &input_media);
|
static bool extract_was_uploaded(const telegram_api::object_ptr<telegram_api::InputMedia> &input_media);
|
||||||
|
|
||||||
static bool extract_was_thumbnail_uploaded(const tl_object_ptr<telegram_api::InputMedia> &input_media);
|
static bool extract_was_thumbnail_uploaded(const telegram_api::object_ptr<telegram_api::InputMedia> &input_media);
|
||||||
|
|
||||||
static string extract_file_reference(const tl_object_ptr<telegram_api::InputMedia> &input_media);
|
static string extract_file_reference(const telegram_api::object_ptr<telegram_api::InputMedia> &input_media);
|
||||||
|
|
||||||
static string extract_file_reference(const tl_object_ptr<telegram_api::InputDocument> &input_document);
|
static vector<string> extract_file_references(const telegram_api::object_ptr<telegram_api::InputMedia> &input_media);
|
||||||
|
|
||||||
static string extract_file_reference(const tl_object_ptr<telegram_api::InputPhoto> &input_photo);
|
static string extract_file_reference(const telegram_api::object_ptr<telegram_api::InputDocument> &input_document);
|
||||||
|
|
||||||
static bool extract_was_uploaded(const tl_object_ptr<telegram_api::InputChatPhoto> &input_chat_photo);
|
static string extract_file_reference(const telegram_api::object_ptr<telegram_api::InputPhoto> &input_photo);
|
||||||
|
|
||||||
static string extract_file_reference(const tl_object_ptr<telegram_api::InputChatPhoto> &input_chat_photo);
|
static bool extract_was_uploaded(const telegram_api::object_ptr<telegram_api::InputChatPhoto> &input_chat_photo);
|
||||||
|
|
||||||
|
static string extract_file_reference(const telegram_api::object_ptr<telegram_api::InputChatPhoto> &input_chat_photo);
|
||||||
|
|
||||||
template <class StorerT>
|
template <class StorerT>
|
||||||
void store_file(FileId file_id, StorerT &storer, int32 ttl = 5) const;
|
void store_file(FileId file_id, StorerT &storer, int32 ttl = 5) const;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user