Add StoryManager::get_story_force.

This commit is contained in:
levlam 2023-07-10 14:56:39 +03:00
parent b9672dbf97
commit 958aab66e6
2 changed files with 86 additions and 9 deletions

View File

@ -990,6 +990,79 @@ StoryManager::Story *StoryManager::get_story_editable(StoryFullId story_full_id)
return stories_.get_pointer(story_full_id); return stories_.get_pointer(story_full_id);
} }
StoryManager::Story *StoryManager::get_story_force(StoryFullId story_full_id, const char *source) {
if (!story_full_id.is_valid()) {
return nullptr;
}
auto result = get_story_editable(story_full_id);
if (result != nullptr) {
return result;
}
if (!G()->use_message_database() || is_inaccessible_story(story_full_id) ||
deleted_story_full_ids_.count(story_full_id) > 0) {
return nullptr;
}
LOG(INFO) << "Trying to load " << story_full_id << " from database from " << source;
auto r_value = G()->td_db()->get_story_db_sync()->get_story(story_full_id);
if (r_value.is_error()) {
return nullptr;
}
return on_get_story_from_database(story_full_id, r_value.ok(), source);
}
unique_ptr<StoryManager::Story> StoryManager::parse_story(StoryFullId story_full_id, const BufferSlice &value) {
auto story = make_unique<Story>();
auto status = log_event_parse(*story, value.as_slice());
if (status.is_error()) {
LOG(ERROR) << "Receive invalid " << story_full_id << " from database: " << status << ' '
<< format::as_hex_dump<4>(value.as_slice());
reload_story(story_full_id, Auto());
return nullptr;
}
return story;
}
StoryManager::Story *StoryManager::on_get_story_from_database(StoryFullId story_full_id, const BufferSlice &value,
const char *source) {
if (value.empty()) {
return nullptr;
}
auto story = parse_story(story_full_id, value);
if (story == nullptr) {
return nullptr;
}
auto old_story = get_story_editable(story_full_id);
if (old_story != nullptr) {
return old_story;
}
Dependencies dependencies;
add_story_dependencies(dependencies, story.get());
if (!dependencies.resolve_force(td_, "on_get_story_from_database")) {
reload_story(story_full_id, Auto());
return nullptr;
}
LOG(INFO) << "Load new " << story_full_id << " from " << source;
auto result = story.get();
stories_.set(story_full_id, std::move(story));
register_story_global_id(story_full_id, result);
CHECK(!is_inaccessible_story(story_full_id));
CHECK(being_edited_stories_.find(story_full_id) == being_edited_stories_.end());
on_story_changed(story_full_id, result, true, false, true);
return result;
}
const StoryManager::ActiveStories *StoryManager::get_active_stories(DialogId owner_dialog_id) const { const StoryManager::ActiveStories *StoryManager::get_active_stories(DialogId owner_dialog_id) const {
return active_stories_.get_pointer(owner_dialog_id); return active_stories_.get_pointer(owner_dialog_id);
} }
@ -1753,9 +1826,8 @@ bool StoryManager::have_story(StoryFullId story_full_id) const {
return get_story(story_full_id) != nullptr; return get_story(story_full_id) != nullptr;
} }
bool StoryManager::have_story_force(StoryFullId story_full_id) const { bool StoryManager::have_story_force(StoryFullId story_full_id) {
// TODO try to load story from the database return get_story_force(story_full_id, "have_story_force") != nullptr;
return have_story(story_full_id);
} }
bool StoryManager::is_inaccessible_story(StoryFullId story_full_id) const { bool StoryManager::is_inaccessible_story(StoryFullId story_full_id) const {
@ -2005,8 +2077,6 @@ StoryId StoryManager::on_get_new_story(DialogId owner_dialog_id,
register_story_global_id(story_full_id, story); register_story_global_id(story_full_id, story);
inaccessible_story_full_ids_.erase(story_full_id); inaccessible_story_full_ids_.erase(story_full_id);
send_closure_later(G()->messages_manager(),
&MessagesManager::update_story_max_reply_media_timestamp_in_replied_messages, story_full_id);
LOG(INFO) << "Add new " << story_full_id; LOG(INFO) << "Add new " << story_full_id;
} }
CHECK(story != nullptr); CHECK(story != nullptr);
@ -2215,7 +2285,7 @@ void StoryManager::delete_story_from_database(StoryFullId story_full_id) {
} }
void StoryManager::on_story_changed(StoryFullId story_full_id, const Story *story, bool is_changed, void StoryManager::on_story_changed(StoryFullId story_full_id, const Story *story, bool is_changed,
bool need_save_to_database) { bool need_save_to_database, bool from_database) {
if (is_active_story(story)) { if (is_active_story(story)) {
CHECK(story->global_id_ > 0); CHECK(story->global_id_ > 0);
story_expire_timeout_.set_timeout_in(story->global_id_, story->expire_date_ - G()->unix_time()); story_expire_timeout_.set_timeout_in(story->global_id_, story->expire_date_ - G()->unix_time());
@ -2228,7 +2298,7 @@ void StoryManager::on_story_changed(StoryFullId story_full_id, const Story *stor
return; return;
} }
if (is_changed || need_save_to_database) { if (is_changed || need_save_to_database) {
if (G()->use_message_database()) { if (G()->use_message_database() && !from_database) {
LOG(INFO) << "Add " << story_full_id << " to database"; LOG(INFO) << "Add " << story_full_id << " to database";
int32 expires_at = 0; int32 expires_at = 0;

View File

@ -215,7 +215,7 @@ class StoryManager final : public Actor {
bool have_story(StoryFullId story_full_id) const; bool have_story(StoryFullId story_full_id) const;
bool have_story_force(StoryFullId story_full_id) const; bool have_story_force(StoryFullId story_full_id);
bool is_inaccessible_story(StoryFullId story_full_id) const; bool is_inaccessible_story(StoryFullId story_full_id) const;
@ -297,11 +297,18 @@ class StoryManager final : public Actor {
Story *get_story_editable(StoryFullId story_full_id); Story *get_story_editable(StoryFullId story_full_id);
Story *get_story_force(StoryFullId story_full_id, const char *source);
unique_ptr<Story> parse_story(StoryFullId story_full_id, const BufferSlice &value);
Story *on_get_story_from_database(StoryFullId story_full_id, const BufferSlice &value, const char *source);
const ActiveStories *get_active_stories(DialogId owner_dialog_id) const; const ActiveStories *get_active_stories(DialogId owner_dialog_id) const;
ActiveStories *get_active_stories_editable(DialogId owner_dialog_id); ActiveStories *get_active_stories_editable(DialogId owner_dialog_id);
void on_story_changed(StoryFullId story_full_id, const Story *story, bool is_changed, bool need_save_to_database); void on_story_changed(StoryFullId story_full_id, const Story *story, bool is_changed, bool need_save_to_database,
bool from_database = false);
void register_story_global_id(StoryFullId story_full_id, Story *story); void register_story_global_id(StoryFullId story_full_id, Story *story);