Support file reference repair when edit story cover.

This commit is contained in:
levlam 2024-07-27 23:02:29 +03:00
parent 1f29dc7b97
commit 1348723205
2 changed files with 36 additions and 2 deletions

View File

@ -593,14 +593,22 @@ class GetPeerStoriesQuery final : public Td::ResultHandler {
class EditStoryCoverQuery final : public Td::ResultHandler { class EditStoryCoverQuery final : public Td::ResultHandler {
Promise<Unit> promise_; Promise<Unit> promise_;
DialogId dialog_id_; DialogId dialog_id_;
StoryId story_id_;
double main_frame_timestamp_;
FileId file_id_;
string file_reference_;
public: public:
explicit EditStoryCoverQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) { explicit EditStoryCoverQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) {
} }
void send(DialogId owner_dialog_id, StoryId story_id, void send(DialogId owner_dialog_id, StoryId story_id, double main_frame_timestamp, FileId file_id,
telegram_api::object_ptr<telegram_api::InputMedia> input_media) { telegram_api::object_ptr<telegram_api::InputMedia> input_media) {
dialog_id_ = owner_dialog_id; dialog_id_ = owner_dialog_id;
story_id_ = story_id;
main_frame_timestamp_ = main_frame_timestamp;
file_id_ = file_id;
file_reference_ = FileManager::extract_file_reference(input_media);
auto input_peer = td_->dialog_manager_->get_input_peer(dialog_id_, AccessRights::Write); auto input_peer = td_->dialog_manager_->get_input_peer(dialog_id_, AccessRights::Write);
if (input_peer == nullptr) { if (input_peer == nullptr) {
return on_error(Status::Error(400, "Can't access the chat")); return on_error(Status::Error(400, "Can't access the chat"));
@ -630,6 +638,21 @@ class EditStoryCoverQuery final : public Td::ResultHandler {
if (!td_->auth_manager_->is_bot() && status.message() == "STORY_NOT_MODIFIED") { if (!td_->auth_manager_->is_bot() && status.message() == "STORY_NOT_MODIFIED") {
return promise_.set_value(Unit()); return promise_.set_value(Unit());
} }
if (!td_->auth_manager_->is_bot() && FileReferenceManager::is_file_reference_error(status)) {
td_->file_manager_->delete_file_reference(file_id_, file_reference_);
td_->file_reference_manager_->repair_file_reference(
file_id_, PromiseCreator::lambda([dialog_id = dialog_id_, story_id = story_id_,
main_frame_timestamp = main_frame_timestamp_,
promise = std::move(promise_)](Result<Unit> result) mutable {
if (result.is_error()) {
return promise.set_error(Status::Error(400, "Failed to edit cover"));
}
send_closure(G()->story_manager(), &StoryManager::edit_story_cover, dialog_id, story_id,
main_frame_timestamp, std::move(promise));
}));
return;
}
td_->dialog_manager_->on_get_dialog_error(dialog_id_, status, "EditStoryCoverQuery"); td_->dialog_manager_->on_get_dialog_error(dialog_id_, status, "EditStoryCoverQuery");
promise_.set_error(std::move(status)); promise_.set_error(std::move(status));
@ -5551,6 +5574,7 @@ void StoryManager::do_edit_story(FileId file_id, unique_ptr<PendingStory> &&pend
void StoryManager::edit_story_cover(DialogId owner_dialog_id, StoryId story_id, double main_frame_timestamp, void StoryManager::edit_story_cover(DialogId owner_dialog_id, StoryId story_id, double main_frame_timestamp,
Promise<Unit> &&promise) { Promise<Unit> &&promise) {
TRY_STATUS_PROMISE(promise, G()->close_status());
StoryFullId story_full_id{owner_dialog_id, story_id}; StoryFullId story_full_id{owner_dialog_id, story_id};
const Story *story = get_story(story_full_id); const Story *story = get_story(story_full_id);
if (story == nullptr || story->content_ == nullptr) { if (story == nullptr || story->content_ == nullptr) {
@ -5573,7 +5597,9 @@ void StoryManager::edit_story_cover(DialogId owner_dialog_id, StoryId story_id,
return promise.set_error(Status::Error(400, "Can't edit story cover")); return promise.set_error(Status::Error(400, "Can't edit story cover"));
} }
td_->create_handler<EditStoryCoverQuery>(std::move(promise))->send(owner_dialog_id, story_id, std::move(input_media)); td_->create_handler<EditStoryCoverQuery>(std::move(promise))
->send(owner_dialog_id, story_id, main_frame_timestamp, get_story_content_any_file_id(td_, story->content_.get()),
std::move(input_media));
} }
void StoryManager::delete_pending_story(FileId file_id, unique_ptr<PendingStory> &&pending_story, Status status) { void StoryManager::delete_pending_story(FileId file_id, unique_ptr<PendingStory> &&pending_story, Status status) {

View File

@ -3682,6 +3682,14 @@ string FileManager::extract_file_reference(const telegram_api::object_ptr<telegr
case telegram_api::inputMediaPaidMedia::ID: case telegram_api::inputMediaPaidMedia::ID:
UNREACHABLE(); UNREACHABLE();
return string(); return string();
case telegram_api::inputMediaUploadedDocument::ID: {
auto uploaded_document = static_cast<const telegram_api::inputMediaUploadedDocument *>(input_media.get());
if (uploaded_document->file_->get_id() != telegram_api::inputFileStoryDocument::ID) {
return string();
}
return extract_file_reference(
static_cast<const telegram_api::inputFileStoryDocument *>(uploaded_document->file_.get())->id_);
}
default: default:
return string(); return string();
} }