Add promise to StoryManager::on_get_user_stories.

This commit is contained in:
levlam 2023-07-16 15:39:55 +03:00
parent 7fb0bd5382
commit 956e31810a
3 changed files with 41 additions and 26 deletions

View File

@ -12540,7 +12540,7 @@ void ContactsManager::on_get_user_full(tl_object_ptr<telegram_api::userFull> &&u
td_->messages_manager_->on_update_dialog_is_translatable(DialogId(user_id), !user->translations_disabled_); td_->messages_manager_->on_update_dialog_is_translatable(DialogId(user_id), !user->translations_disabled_);
td_->story_manager_->on_get_user_stories(DialogId(user_id), std::move(user->stories_)); td_->story_manager_->on_get_user_stories(DialogId(user_id), std::move(user->stories_), Promise<Unit>());
UserFull *user_full = add_user_full(user_id); UserFull *user_full = add_user_full(user_id);
user_full->expires_at = Time::now() + USER_FULL_EXPIRE_TIME; user_full->expires_at = Time::now() + USER_FULL_EXPIRE_TIME;

View File

@ -992,7 +992,8 @@ void StoryManager::on_story_expire_timeout(int64 story_global_id) {
auto active_stories = get_active_stories(owner_dialog_id); auto active_stories = get_active_stories(owner_dialog_id);
if (active_stories != nullptr && contains(active_stories->story_ids_, story_full_id.get_story_id())) { if (active_stories != nullptr && contains(active_stories->story_ids_, story_full_id.get_story_id())) {
auto story_ids = active_stories->story_ids_; auto story_ids = active_stories->story_ids_;
on_update_active_stories(owner_dialog_id, active_stories->max_read_story_id_, std::move(story_ids)); on_update_active_stories(owner_dialog_id, active_stories->max_read_story_id_, std::move(story_ids),
Promise<Unit>());
} }
} }
@ -1240,7 +1241,7 @@ StoryManager::ActiveStories *StoryManager::on_get_active_stories_from_database(D
if (status.is_error()) { if (status.is_error()) {
LOG(ERROR) << "Receive invalid active stories in " << owner_dialog_id << " from database: " << status << ' ' LOG(ERROR) << "Receive invalid active stories in " << owner_dialog_id << " from database: " << status << ' '
<< format::as_hex_dump<4>(value.as_slice()); << format::as_hex_dump<4>(value.as_slice());
save_active_stories(owner_dialog_id, nullptr); save_active_stories(owner_dialog_id, nullptr, Promise<Unit>());
failed_to_load_active_stories_.insert(owner_dialog_id); failed_to_load_active_stories_.insert(owner_dialog_id);
return nullptr; return nullptr;
} }
@ -1250,7 +1251,8 @@ StoryManager::ActiveStories *StoryManager::on_get_active_stories_from_database(D
story_ids.push_back(on_get_story_info(owner_dialog_id, std::move(story_info))); story_ids.push_back(on_get_story_info(owner_dialog_id, std::move(story_info)));
} }
on_update_active_stories(owner_dialog_id, saved_active_stories.max_read_story_id_, std::move(story_ids)); on_update_active_stories(owner_dialog_id, saved_active_stories.max_read_story_id_, std::move(story_ids),
Promise<Unit>());
return get_active_stories_editable(owner_dialog_id); return get_active_stories_editable(owner_dialog_id);
} }
@ -1347,7 +1349,7 @@ void StoryManager::on_load_active_stories(
auto max_story_date = MIN_DIALOG_DATE; auto max_story_date = MIN_DIALOG_DATE;
vector<DialogId> owner_dialog_ids; vector<DialogId> owner_dialog_ids;
for (auto &user_stories : stories->user_stories_) { for (auto &user_stories : stories->user_stories_) {
auto owner_dialog_id = on_get_user_stories(DialogId(), std::move(user_stories)); auto owner_dialog_id = on_get_user_stories(DialogId(), std::move(user_stories), Promise<Unit>());
auto active_stories = get_active_stories(owner_dialog_id); auto active_stories = get_active_stories(owner_dialog_id);
if (active_stories == nullptr) { if (active_stories == nullptr) {
LOG(ERROR) << "Receive invalid stories"; LOG(ERROR) << "Receive invalid stories";
@ -1385,7 +1387,7 @@ void StoryManager::on_load_active_stories(
LOG(INFO) << "Delete active stories in " << delete_dialog_ids; LOG(INFO) << "Delete active stories in " << delete_dialog_ids;
} }
for (auto dialog_id : delete_dialog_ids) { for (auto dialog_id : delete_dialog_ids) {
on_update_active_stories(dialog_id, StoryId(), vector<StoryId>()); on_update_active_stories(dialog_id, StoryId(), vector<StoryId>(), Promise<Unit>());
load_dialog_expiring_stories(dialog_id, 0, "on_load_active_stories 1"); load_dialog_expiring_stories(dialog_id, 0, "on_load_active_stories 1");
} }
update_story_list_sent_total_count(story_list_id, story_list); update_story_list_sent_total_count(story_list_id, story_list);
@ -1670,7 +1672,7 @@ void StoryManager::on_get_dialog_expiring_stories(DialogId owner_dialog_id,
Promise<td_api::object_ptr<td_api::chatActiveStories>> &&promise) { Promise<td_api::object_ptr<td_api::chatActiveStories>> &&promise) {
TRY_STATUS_PROMISE(promise, G()->close_status()); TRY_STATUS_PROMISE(promise, G()->close_status());
td_->contacts_manager_->on_get_users(std::move(stories->users_), "on_get_dialog_expiring_stories"); td_->contacts_manager_->on_get_users(std::move(stories->users_), "on_get_dialog_expiring_stories");
owner_dialog_id = on_get_user_stories(owner_dialog_id, std::move(stories->stories_)); owner_dialog_id = on_get_user_stories(owner_dialog_id, std::move(stories->stories_), Promise<Unit>());
if (promise) { if (promise) {
promise.set_value(get_chat_active_stories_object(owner_dialog_id)); promise.set_value(get_chat_active_stories_object(owner_dialog_id));
} else { } else {
@ -2391,7 +2393,8 @@ StoryId StoryManager::on_get_new_story(DialogId owner_dialog_id,
i--; i--;
} }
story_ids[i] = story_id; story_ids[i] = story_id;
on_update_active_stories(owner_dialog_id, active_stories->max_read_story_id_, std::move(story_ids)); on_update_active_stories(owner_dialog_id, active_stories->max_read_story_id_, std::move(story_ids),
Promise<Unit>());
} }
} }
@ -2498,7 +2501,8 @@ void StoryManager::on_delete_story(StoryFullId story_full_id) {
if (active_stories != nullptr && contains(active_stories->story_ids_, story_id)) { if (active_stories != nullptr && contains(active_stories->story_ids_, story_id)) {
auto story_ids = active_stories->story_ids_; auto story_ids = active_stories->story_ids_;
td::remove(story_ids, story_id); td::remove(story_ids, story_id);
on_update_active_stories(owner_dialog_id, active_stories->max_read_story_id_, std::move(story_ids)); on_update_active_stories(owner_dialog_id, active_stories->max_read_story_id_, std::move(story_ids),
Promise<Unit>());
} }
delete_story_from_database(story_full_id); delete_story_from_database(story_full_id);
@ -2623,11 +2627,14 @@ std::pair<int32, vector<StoryId>> StoryManager::on_get_stories(
} }
DialogId StoryManager::on_get_user_stories(DialogId owner_dialog_id, DialogId StoryManager::on_get_user_stories(DialogId owner_dialog_id,
telegram_api::object_ptr<telegram_api::userStories> &&user_stories) { telegram_api::object_ptr<telegram_api::userStories> &&user_stories,
Promise<Unit> &&promise) {
if (user_stories == nullptr) { if (user_stories == nullptr) {
if (owner_dialog_id.is_valid()) { if (owner_dialog_id.is_valid()) {
LOG(INFO) << "Receive no stories in " << owner_dialog_id; LOG(INFO) << "Receive no stories in " << owner_dialog_id;
on_update_active_stories(owner_dialog_id, StoryId(), {}); on_update_active_stories(owner_dialog_id, StoryId(), {}, std::move(promise));
} else {
promise.set_value(Unit());
} }
return owner_dialog_id; return owner_dialog_id;
} }
@ -2635,11 +2642,12 @@ DialogId StoryManager::on_get_user_stories(DialogId owner_dialog_id,
DialogId story_dialog_id(UserId(user_stories->user_id_)); DialogId story_dialog_id(UserId(user_stories->user_id_));
if (owner_dialog_id.is_valid() && owner_dialog_id != story_dialog_id) { if (owner_dialog_id.is_valid() && owner_dialog_id != story_dialog_id) {
LOG(ERROR) << "Receive stories from " << story_dialog_id << " instead of " << owner_dialog_id; LOG(ERROR) << "Receive stories from " << story_dialog_id << " instead of " << owner_dialog_id;
on_update_active_stories(owner_dialog_id, StoryId(), {}); on_update_active_stories(owner_dialog_id, StoryId(), {}, std::move(promise));
return owner_dialog_id; return owner_dialog_id;
} }
if (!story_dialog_id.is_valid()) { if (!story_dialog_id.is_valid()) {
LOG(ERROR) << "Receive stories in " << story_dialog_id; LOG(ERROR) << "Receive stories in " << story_dialog_id;
promise.set_value(Unit());
return owner_dialog_id; return owner_dialog_id;
} }
owner_dialog_id = story_dialog_id; owner_dialog_id = story_dialog_id;
@ -2669,12 +2677,12 @@ DialogId StoryManager::on_get_user_stories(DialogId owner_dialog_id,
} }
} }
on_update_active_stories(story_dialog_id, max_read_story_id, std::move(story_ids)); on_update_active_stories(story_dialog_id, max_read_story_id, std::move(story_ids), std::move(promise));
return story_dialog_id; return story_dialog_id;
} }
void StoryManager::on_update_active_stories(DialogId owner_dialog_id, StoryId max_read_story_id, void StoryManager::on_update_active_stories(DialogId owner_dialog_id, StoryId max_read_story_id,
vector<StoryId> &&story_ids) { vector<StoryId> &&story_ids, Promise<Unit> &&promise) {
td::remove_if(story_ids, [&](StoryId story_id) { td::remove_if(story_ids, [&](StoryId story_id) {
if (!story_id.is_server()) { if (!story_id.is_server()) {
return true; return true;
@ -2704,10 +2712,11 @@ void StoryManager::on_update_active_stories(DialogId owner_dialog_id, StoryId ma
update_story_list_sent_total_count(active_stories->story_list_id_); update_story_list_sent_total_count(active_stories->story_list_id_);
} }
active_stories_.erase(owner_dialog_id); active_stories_.erase(owner_dialog_id);
save_active_stories(owner_dialog_id, nullptr); save_active_stories(owner_dialog_id, nullptr, std::move(promise));
send_update_chat_active_stories(owner_dialog_id, nullptr); send_update_chat_active_stories(owner_dialog_id, nullptr);
} else { } else {
max_read_story_ids_.erase(owner_dialog_id); max_read_story_ids_.erase(owner_dialog_id);
promise.set_value(Unit());
} }
failed_to_load_active_stories_.insert(owner_dialog_id); failed_to_load_active_stories_.insert(owner_dialog_id);
return; return;
@ -2745,7 +2754,9 @@ void StoryManager::on_update_active_stories(DialogId owner_dialog_id, StoryId ma
send_update_chat_active_stories(owner_dialog_id, active_stories.get()); send_update_chat_active_stories(owner_dialog_id, active_stories.get());
} }
if (need_save_to_database) { if (need_save_to_database) {
save_active_stories(owner_dialog_id, active_stories.get()); save_active_stories(owner_dialog_id, active_stories.get(), std::move(promise));
} else {
promise.set_value(Unit());
} }
} }
@ -2847,13 +2858,14 @@ void StoryManager::send_update_chat_active_stories(DialogId owner_dialog_id,
send_closure(G()->td(), &Td::send_update, get_update_chat_active_stories(owner_dialog_id, active_stories)); send_closure(G()->td(), &Td::send_update, get_update_chat_active_stories(owner_dialog_id, active_stories));
} }
void StoryManager::save_active_stories(DialogId owner_dialog_id, const ActiveStories *active_stories) const { void StoryManager::save_active_stories(DialogId owner_dialog_id, const ActiveStories *active_stories,
Promise<Unit> &&promise) const {
if (!G()->use_message_database()) { if (!G()->use_message_database()) {
return; return promise.set_value(Unit());
} }
if (active_stories == nullptr) { if (active_stories == nullptr) {
LOG(INFO) << "Delete active stories of " << owner_dialog_id << " from database"; LOG(INFO) << "Delete active stories of " << owner_dialog_id << " from database";
G()->td_db()->get_story_db_async()->delete_active_stories(owner_dialog_id, Promise<Unit>()); G()->td_db()->get_story_db_async()->delete_active_stories(owner_dialog_id, std::move(promise));
} else { } else {
LOG(INFO) << "Add active stories of " << owner_dialog_id << " to database"; LOG(INFO) << "Add active stories of " << owner_dialog_id << " to database";
auto order = active_stories->story_list_id_.is_valid() ? active_stories->private_order_ : 0; auto order = active_stories->story_list_id_.is_valid() ? active_stories->private_order_ : 0;
@ -2866,7 +2878,7 @@ void StoryManager::save_active_stories(DialogId owner_dialog_id, const ActiveSto
} }
} }
G()->td_db()->get_story_db_async()->add_active_stories(owner_dialog_id, active_stories->story_list_id_, order, G()->td_db()->get_story_db_async()->add_active_stories(owner_dialog_id, active_stories->story_list_id_, order,
log_event_store(saved_active_stories), Promise<Unit>()); log_event_store(saved_active_stories), std::move(promise));
} }
} }
@ -2897,7 +2909,7 @@ bool StoryManager::on_update_read_stories(DialogId owner_dialog_id, StoryId max_
<< active_stories->story_ids_ << " from " << active_stories->max_read_story_id_ << " to " << active_stories->story_ids_ << " from " << active_stories->max_read_story_id_ << " to "
<< max_read_story_id; << max_read_story_id;
auto story_ids = active_stories->story_ids_; auto story_ids = active_stories->story_ids_;
on_update_active_stories(owner_dialog_id, max_read_story_id, std::move(story_ids)); on_update_active_stories(owner_dialog_id, max_read_story_id, std::move(story_ids), Promise<Unit>());
return true; return true;
} }
return false; return false;
@ -2957,7 +2969,7 @@ void StoryManager::on_dialog_active_stories_order_updated(DialogId owner_dialog_
send_update_chat_active_stories(owner_dialog_id, active_stories); send_update_chat_active_stories(owner_dialog_id, active_stories);
} }
if (need_save_to_database) { if (need_save_to_database) {
save_active_stories(owner_dialog_id, active_stories); save_active_stories(owner_dialog_id, active_stories, Promise<Unit>());
} }
} }
@ -3654,7 +3666,7 @@ void StoryManager::on_binlog_events(vector<BinlogEvent> &&events) {
} }
} else { } else {
auto story_ids = active_stories->story_ids_; auto story_ids = active_stories->story_ids_;
on_update_active_stories(dialog_id, max_read_story_id, std::move(story_ids)); on_update_active_stories(dialog_id, max_read_story_id, std::move(story_ids), Promise<Unit>());
} }
read_stories_on_server(dialog_id, max_read_story_id, event.id_); read_stories_on_server(dialog_id, max_read_story_id, event.id_);
break; break;

View File

@ -229,7 +229,8 @@ class StoryManager final : public Actor {
telegram_api::object_ptr<telegram_api::stories_stories> &&stories); telegram_api::object_ptr<telegram_api::stories_stories> &&stories);
DialogId on_get_user_stories(DialogId owner_dialog_id, DialogId on_get_user_stories(DialogId owner_dialog_id,
telegram_api::object_ptr<telegram_api::userStories> &&user_stories); telegram_api::object_ptr<telegram_api::userStories> &&user_stories,
Promise<Unit> &&promise);
bool on_update_read_stories(DialogId owner_dialog_id, StoryId max_read_story_id); bool on_update_read_stories(DialogId owner_dialog_id, StoryId max_read_story_id);
@ -438,7 +439,8 @@ class StoryManager final : public Actor {
void on_toggle_story_is_pinned(StoryId story_id, bool is_pinned, Promise<Unit> &&promise); void on_toggle_story_is_pinned(StoryId story_id, bool is_pinned, Promise<Unit> &&promise);
void on_update_active_stories(DialogId owner_dialog_id, StoryId max_read_story_id, vector<StoryId> &&story_ids); void on_update_active_stories(DialogId owner_dialog_id, StoryId max_read_story_id, vector<StoryId> &&story_ids,
Promise<Unit> &&promise);
bool update_active_stories_order(DialogId owner_dialog_id, ActiveStories *active_stories, bool update_active_stories_order(DialogId owner_dialog_id, ActiveStories *active_stories,
bool *need_save_to_database); bool *need_save_to_database);
@ -452,7 +454,8 @@ class StoryManager final : public Actor {
void send_update_chat_active_stories(DialogId owner_dialog_id, const ActiveStories *active_stories) const; void send_update_chat_active_stories(DialogId owner_dialog_id, const ActiveStories *active_stories) const;
void save_active_stories(DialogId owner_dialog_id, const ActiveStories *active_stories) const; void save_active_stories(DialogId owner_dialog_id, const ActiveStories *active_stories,
Promise<Unit> &&promise) const;
void increment_story_views(DialogId owner_dialog_id, PendingStoryViews &story_views); void increment_story_views(DialogId owner_dialog_id, PendingStoryViews &story_views);