Process telegram_api::updateStoryID.

This commit is contained in:
levlam 2023-08-11 14:07:13 +03:00
parent a5ca926971
commit 02b4793ba2
4 changed files with 78 additions and 12 deletions

View File

@ -711,9 +711,12 @@ class StoryManager::SendStoryQuery final : public Td::ResultHandler {
auto ptr = result_ptr.move_as_ok();
LOG(INFO) << "Receive result for SendStoryQuery: " << to_string(ptr);
td_->updates_manager_->on_get_updates(std::move(ptr), Promise<Unit>());
td_->story_manager_->delete_pending_story(file_id_, std::move(pending_story_), Status::OK());
td_->updates_manager_->on_get_updates(
std::move(ptr), PromiseCreator::lambda([file_id = file_id_, pending_story = std::move(pending_story_)](
Result<Unit> &&result) mutable {
send_closure(G()->story_manager(), &StoryManager::delete_pending_story, file_id, std::move(pending_story),
result.is_ok() ? Status::OK() : result.move_as_error());
}));
}
void on_error(Status status) final {
@ -2722,6 +2725,14 @@ StoryId StoryManager::on_get_new_story(DialogId owner_dialog_id,
td_->messages_manager_->force_create_dialog(owner_dialog_id, "on_get_new_story");
auto updates_story_ids_it = update_story_ids_.find(story_full_id);
if (updates_story_ids_it != update_story_ids_.end()) {
auto old_story_id = updates_story_ids_it->second;
update_story_ids_.erase(updates_story_ids_it);
LOG(INFO) << "Receive sent " << old_story_id << " as " << story_full_id;
}
bool is_bot = td_->auth_manager_->is_bot();
auto caption =
get_message_text(td_->contacts_manager_.get(), std::move(story_item->caption_), std::move(story_item->entities_),
@ -2947,6 +2958,8 @@ void StoryManager::on_delete_story(StoryFullId story_full_id) {
return;
}
update_story_ids_.erase(story_full_id);
inaccessible_story_full_ids_.set(story_full_id, Time::now());
send_closure_later(G()->messages_manager(),
&MessagesManager::update_story_max_reply_media_timestamp_in_replied_messages, story_full_id);
@ -3388,6 +3401,35 @@ void StoryManager::save_active_stories(DialogId owner_dialog_id, const ActiveSto
}
}
void StoryManager::on_update_story_id(int64 random_id, StoryId new_story_id, const char *source) {
if (!new_story_id.is_server()) {
LOG(ERROR) << "Receive " << new_story_id << " with random_id " << random_id << " from " << source;
return;
}
auto it = being_sent_stories_.find(random_id);
if (it == being_sent_stories_.end()) {
// update about a new story sent from another device
LOG(INFO) << "Receive not sent outgoing " << new_story_id << " with random_id = " << random_id;
return;
}
auto old_story_full_id = it->second;
being_sent_stories_.erase(it);
if (!have_story_force(old_story_full_id)) {
LOG(INFO) << "Can't find sent story " << old_story_full_id;
// delete_sent_story_on_server(old_story_full_id, new_story_id);
return;
}
auto old_story_id = old_story_full_id.get_story_id();
auto new_story_full_id = StoryFullId(old_story_full_id.get_dialog_id(), new_story_id);
LOG(INFO) << "Save correspondence from " << new_story_full_id << " to " << old_story_id;
CHECK(!old_story_id.is_server());
update_story_ids_[new_story_full_id] = old_story_id;
}
bool StoryManager::on_update_read_stories(DialogId owner_dialog_id, StoryId max_read_story_id) {
if (!td_->messages_manager_->have_dialog_info_force(owner_dialog_id)) {
return false;
@ -3750,7 +3792,7 @@ void StoryManager::send_story(td_api::object_ptr<td_api::InputStoryContent> &&in
int64 random_id;
do {
random_id = Random::secure_int64();
} while (random_id == 0);
} while (random_id == 0 || being_sent_stories_.count(random_id) > 0);
auto story_ptr = story.get();
@ -3758,8 +3800,6 @@ void StoryManager::send_story(td_api::object_ptr<td_api::InputStoryContent> &&in
td::make_unique<PendingStory>(dialog_id, StoryId(), ++send_story_count_, random_id, std::move(story));
pending_story->log_event_id_ = save_send_story_log_event(pending_story.get());
yet_unsent_stories_[dialog_id].insert(pending_story->send_story_num_);
do_send_story(std::move(pending_story), {});
promise.set_value(get_story_object({dialog_id, StoryId()}, story_ptr));
@ -3799,6 +3839,12 @@ int64 StoryManager::save_send_story_log_event(const PendingStory *pending_story)
void StoryManager::do_send_story(unique_ptr<PendingStory> &&pending_story, vector<int> bad_parts) {
CHECK(pending_story != nullptr);
CHECK(pending_story->story_ != nullptr);
if (bad_parts.empty() && !pending_story->story_id_.is_server()) {
yet_unsent_stories_[pending_story->dialog_id_].insert(pending_story->send_story_num_);
being_sent_stories_[pending_story->random_id_] = StoryFullId(pending_story->dialog_id_, pending_story->story_id_);
}
auto content = pending_story->story_->content_.get();
CHECK(content != nullptr);
auto upload_order = pending_story->send_story_num_;
@ -4135,6 +4181,7 @@ void StoryManager::delete_pending_story(FileId file_id, unique_ptr<PendingStory>
if (it->second.empty()) {
yet_unsent_stories_.erase(it);
}
being_sent_stories_.erase(pending_story->random_id_);
try_send_story(pending_story->dialog_id_);
if (pending_story->log_event_id_ != 0) {
@ -4381,7 +4428,6 @@ void StoryManager::on_binlog_events(vector<BinlogEvent> &&events) {
CHECK(!pending_story->story_id_.is_server());
pending_story->send_story_num_ = send_story_count_;
pending_story->story_->content_ = dup_story_content(td_, pending_story->story_->content_.get());
yet_unsent_stories_[pending_story->dialog_id_].insert(pending_story->send_story_num_);
do_send_story(std::move(pending_story), {});
break;
}

View File

@ -265,6 +265,8 @@ class StoryManager final : public Actor {
telegram_api::object_ptr<telegram_api::userStories> &&user_stories,
Promise<Unit> &&promise);
void on_update_story_id(int64 random_id, StoryId new_story_id, const char *source);
bool on_update_read_stories(DialogId owner_dialog_id, StoryId max_read_story_id);
void on_update_story_stealth_mode(telegram_api::object_ptr<telegram_api::storiesStealthMode> &&stealth_mode);
@ -583,6 +585,10 @@ class StoryManager final : public Actor {
FlatHashMap<DialogId, std::set<uint32>, DialogIdHash> yet_unsent_stories_;
FlatHashMap<int64, StoryFullId> being_sent_stories_;
FlatHashMap<StoryFullId, StoryId, StoryFullIdHash> update_story_ids_;
FlatHashMap<uint32, unique_ptr<ReadyToSendStory>> ready_to_send_stories_;
StoryList story_lists_[2];

View File

@ -1807,6 +1807,14 @@ void UpdatesManager::process_get_difference_updates(
CHECK(!running_get_difference_);
}
if (constructor_id == telegram_api::updateStoryID::ID) {
LOG(INFO) << "Receive update about sent story " << to_string(update);
auto update_story_id = move_tl_object_as<telegram_api::updateStoryID>(update);
td_->story_manager_->on_update_story_id(update_story_id->random_id_, StoryId(update_story_id->id_),
"getDifference");
CHECK(!running_get_difference_);
}
if (constructor_id == telegram_api::updateEncryption::ID) {
on_update(move_tl_object_as<telegram_api::updateEncryption>(update), Promise<Unit>());
CHECK(!running_get_difference_);
@ -2468,7 +2476,6 @@ void UpdatesManager::on_pending_updates(vector<tl_object_ptr<telegram_api::Updat
LOG(INFO) << "Receive from " << source << " pending " << to_string(update);
int32 id = update->get_id();
if (id == telegram_api::updateMessageID::ID) {
LOG(INFO) << "Receive from " << source << " " << to_string(update);
auto sent_message_update = move_tl_object_as<telegram_api::updateMessageID>(update);
MessageId message_id;
if (ordinary_new_message_count != 0) {
@ -2483,6 +2490,11 @@ void UpdatesManager::on_pending_updates(vector<tl_object_ptr<telegram_api::Updat
}
update = nullptr;
}
if (id == telegram_api::updateStoryID::ID) {
auto update_story_id = move_tl_object_as<telegram_api::updateStoryID>(update);
td_->story_manager_->on_update_story_id(update_story_id->random_id_, StoryId(update_story_id->id_), source);
update = nullptr;
}
if (id == telegram_api::updateFolderPeers::ID) {
on_update(move_tl_object_as<telegram_api::updateFolderPeers>(update), get_promise());
update = nullptr;
@ -3347,6 +3359,7 @@ void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateNewChannelMessa
void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateMessageID> update, Promise<Unit> &&promise) {
LOG(ERROR) << "Receive not in getDifference and not in on_pending_updates " << to_string(update);
promise.set_value(Unit());
}
void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateReadMessagesContents> update,
@ -4322,10 +4335,11 @@ void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateSentStoryReacti
promise.set_value(Unit());
}
// unsupported updates
void UpdatesManager::on_update(tl_object_ptr<telegram_api::updateStoryID> update, Promise<Unit> &&promise) {
LOG(ERROR) << "Receive not in getDifference and not in on_pending_updates " << to_string(update);
promise.set_value(Unit());
}
// unsupported updates
} // namespace td

View File

@ -628,9 +628,9 @@ class UpdatesManager final : public Actor {
void on_update(tl_object_ptr<telegram_api::updateSentStoryReaction> update, Promise<Unit> &&promise);
// unsupported updates
void on_update(tl_object_ptr<telegram_api::updateStoryID> update, Promise<Unit> &&promise);
// unsupported updates
};
} // namespace td