diff options
| author | levlam <levlam@telegram.org> | 2026-06-28 22:03:16 +0300 |
|---|---|---|
| committer | levlam <levlam@telegram.org> | 2026-06-28 22:03:16 +0300 |
| commit | e9e18e20cc87c6d197cdbf3405fa4e76c0ba6300 (patch) | |
| tree | e521e3931a7c057255987a654877020c5a12f76c | |
| parent | 07d68536be2991ece9aed5540904140ed1f96aa6 (diff) | |
Add FileReferenceManager::process_file_reference_error.
| -rw-r--r-- | td/telegram/FileReferenceManager.cpp | 85 | ||||
| -rw-r--r-- | td/telegram/FileReferenceManager.h | 11 |
2 files changed, 96 insertions, 0 deletions
diff --git a/td/telegram/FileReferenceManager.cpp b/td/telegram/FileReferenceManager.cpp index ab2fc0243..762afd9f2 100644 --- a/td/telegram/FileReferenceManager.cpp +++ b/td/telegram/FileReferenceManager.cpp @@ -8,6 +8,7 @@ #include "td/telegram/AnimationsManager.h" #include "td/telegram/AttachMenuManager.h" +#include "td/telegram/AuthManager.h" #include "td/telegram/BackgroundManager.h" #include "td/telegram/BotInfoManager.h" #include "td/telegram/ChatManager.h" @@ -101,6 +102,90 @@ FileReferenceManager::FileReferenceErrorSource FileReferenceManager::get_file_re return {pos, begins_with(message, "COVER_")}; } +bool FileReferenceManager::process_file_reference_error(const Status &status, bool was_uploaded, + const vector<FileUploadId> &file_upload_ids, + const vector<string> &file_references, + const vector<FileId> &cover_file_ids, + const vector<string> &cover_file_references, bool expect_index, + std::function<void(size_t pos)> on_error) { + auto *td_ = G()->td().get_actor_unsafe(); + if (td_->auth_manager_->is_bot() || !is_file_reference_error(status)) { + return false; + } + auto source = get_file_reference_error_source(status); + auto pos = source.pos_; + if (pos > 0) { + pos--; + } else if (expect_index) { + LOG(ERROR) << "Expected a file reference error with an index"; + return false; + } + if (source.is_cover_) { + if (pos < cover_file_ids.size() && pos < cover_file_references.size() && cover_file_ids[pos].is_valid()) { + VLOG(file_references) << "Receive " << status << " for cover " << cover_file_ids[pos]; + td_->file_manager_->delete_file_reference(cover_file_ids[pos], cover_file_references[pos]); + on_error(pos); + return true; + } else { + LOG(ERROR) << "Receive file reference error " << status << ", but cover_file_ids = " << cover_file_ids + << ", file_references = " << cover_file_references; + } + } else { + if (pos < file_upload_ids.size() && pos < file_references.size() && !was_uploaded && + file_upload_ids[pos].is_valid()) { + VLOG(file_references) << "Receive " << status << " for " << file_upload_ids[pos]; + td_->file_manager_->delete_file_reference(file_upload_ids[pos].get_file_id(), file_references[pos]); + on_error(pos); + return true; + } else { + LOG(ERROR) << "Receive file reference error " << status << ", but file_upload_ids = " << file_upload_ids + << ", was_uploaded = " << was_uploaded << ", file_references = " << file_references; + } + } + return false; +} + +bool FileReferenceManager::process_file_reference_error(const Status &status, const vector<FileId> &file_ids, + const vector<string> &file_references, + const vector<FileId> &cover_file_ids, + const vector<string> &cover_file_references, bool expect_index, + std::function<void(size_t pos)> on_error) { + auto *td_ = G()->td().get_actor_unsafe(); + if (td_->auth_manager_->is_bot() || !is_file_reference_error(status)) { + return false; + } + auto source = get_file_reference_error_source(status); + auto pos = source.pos_; + if (pos > 0) { + pos--; + } else if (expect_index) { + LOG(ERROR) << "Expected a file reference error with an index"; + return false; + } + if (source.is_cover_) { + if (pos < cover_file_ids.size() && pos < cover_file_references.size()) { + VLOG(file_references) << "Receive " << status << " for cover " << cover_file_ids[pos]; + td_->file_manager_->delete_file_reference(cover_file_ids[pos], cover_file_references[pos]); + on_error(pos); + return true; + } else { + LOG(ERROR) << "Receive file reference error " << status << ", but cover_file_ids = " << cover_file_ids + << ", file_references = " << cover_file_references; + } + } else { + if (pos < file_ids.size() && pos < file_references.size() && file_ids[pos].is_valid()) { + VLOG(file_references) << "Receive " << status << " for " << file_ids[pos]; + td_->file_manager_->delete_file_reference(file_ids[pos], file_references[pos]); + on_error(pos); + return true; + } else { + LOG(ERROR) << "Receive file reference error " << status << ", but file_ids = " << file_ids + << ", file_references = " << file_references; + } + } + return false; +} + /* fileSourceMessage chat_id:int53 message_id:int53 = FileSource; // get_message_from_server fileSourceUserProfilePhoto user_id:int53 photo_id:int64 = FileSource; // photos.getUserPhotos diff --git a/td/telegram/FileReferenceManager.h b/td/telegram/FileReferenceManager.h index 01dee8ea3..114ecf609 100644 --- a/td/telegram/FileReferenceManager.h +++ b/td/telegram/FileReferenceManager.h @@ -12,6 +12,7 @@ #include "td/telegram/DialogId.h" #include "td/telegram/files/FileId.h" #include "td/telegram/files/FileSourceId.h" +#include "td/telegram/files/FileUploadId.h" #include "td/telegram/MessageFullId.h" #include "td/telegram/MessageTopic.h" #include "td/telegram/PhotoSizeSource.h" @@ -56,6 +57,16 @@ class FileReferenceManager final : public Actor { }; static FileReferenceErrorSource get_file_reference_error_source(const Status &error); + bool process_file_reference_error(const Status &status, bool was_uploaded, + const vector<FileUploadId> &file_upload_ids, const vector<string> &file_references, + const vector<FileId> &cover_file_ids, const vector<string> &cover_file_references, + bool expect_index, std::function<void(size_t pos)> on_error); + + bool process_file_reference_error(const Status &status, const vector<FileId> &file_ids, + const vector<string> &file_references, const vector<FileId> &cover_file_ids, + const vector<string> &cover_file_references, bool expect_index, + std::function<void(size_t pos)> on_error); + FileSourceId create_message_file_source(MessageFullId message_full_id); FileSourceId create_user_photo_file_source(UserId user_id, int64 photo_id); // file reference aren't used for chat/channel photo download and the photos can't be reused |
