Support storyItemSkipped.
This commit is contained in:
parent
eeefafc214
commit
26d8af58cc
@ -650,7 +650,7 @@ void StoryManager::open_story(DialogId owner_dialog_id, StoryId story_id, Promis
|
|||||||
|
|
||||||
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) {
|
if (story == nullptr || story->content_ == nullptr) {
|
||||||
return promise.set_value(Unit());
|
return promise.set_value(Unit());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -716,8 +716,8 @@ bool StoryManager::is_inaccessible_story(StoryFullId story_full_id) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int32 StoryManager::get_story_duration(StoryFullId story_full_id) const {
|
int32 StoryManager::get_story_duration(StoryFullId story_full_id) const {
|
||||||
auto story = get_story(story_full_id);
|
const Story *story = get_story(story_full_id);
|
||||||
if (story == nullptr) {
|
if (story == nullptr || story->content_ == nullptr) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
auto *content = story->content_.get();
|
auto *content = story->content_.get();
|
||||||
@ -770,10 +770,9 @@ td_api::object_ptr<td_api::story> StoryManager::get_story_object(StoryFullId sto
|
|||||||
}
|
}
|
||||||
|
|
||||||
td_api::object_ptr<td_api::story> StoryManager::get_story_object(StoryFullId story_full_id, const Story *story) const {
|
td_api::object_ptr<td_api::story> StoryManager::get_story_object(StoryFullId story_full_id, const Story *story) const {
|
||||||
if (story == nullptr) {
|
if (story == nullptr || story->content_ == nullptr) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
story->is_update_sent_ = true;
|
|
||||||
auto dialog_id = story_full_id.get_dialog_id();
|
auto dialog_id = story_full_id.get_dialog_id();
|
||||||
bool is_owned = is_story_owned(dialog_id);
|
bool is_owned = is_story_owned(dialog_id);
|
||||||
if (!is_owned && !story->is_pinned_ && G()->unix_time() >= story->expire_date_) {
|
if (!is_owned && !story->is_pinned_ && G()->unix_time() >= story->expire_date_) {
|
||||||
@ -806,6 +805,8 @@ td_api::object_ptr<td_api::story> StoryManager::get_story_object(StoryFullId sto
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
story->is_update_sent_ = true;
|
||||||
|
|
||||||
CHECK(dialog_id.get_type() == DialogType::User);
|
CHECK(dialog_id.get_type() == DialogType::User);
|
||||||
return td_api::make_object<td_api::story>(
|
return td_api::make_object<td_api::story>(
|
||||||
story_full_id.get_story_id().get(),
|
story_full_id.get_story_id().get(),
|
||||||
@ -911,7 +912,7 @@ StoryId StoryManager::on_get_story(DialogId owner_dialog_id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
StoryFullId story_full_id{owner_dialog_id, story_id};
|
StoryFullId story_full_id{owner_dialog_id, story_id};
|
||||||
auto story = get_story_editable(story_full_id);
|
Story *story = get_story_editable(story_full_id);
|
||||||
bool is_changed = false;
|
bool is_changed = false;
|
||||||
bool need_save_to_database = false;
|
bool need_save_to_database = false;
|
||||||
if (story == nullptr) {
|
if (story == nullptr) {
|
||||||
@ -996,6 +997,36 @@ StoryId StoryManager::on_get_story(DialogId owner_dialog_id,
|
|||||||
return story_id;
|
return story_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StoryId StoryManager::on_get_skipped_story(DialogId owner_dialog_id,
|
||||||
|
telegram_api::object_ptr<telegram_api::storyItemSkipped> &&story_item) {
|
||||||
|
CHECK(story_item != nullptr);
|
||||||
|
StoryId story_id(story_item->id_);
|
||||||
|
if (!story_id.is_server()) {
|
||||||
|
LOG(ERROR) << "Receive " << to_string(story_item);
|
||||||
|
return StoryId();
|
||||||
|
}
|
||||||
|
if (deleted_story_full_ids_.count({owner_dialog_id, story_id}) > 0) {
|
||||||
|
return StoryId();
|
||||||
|
}
|
||||||
|
|
||||||
|
StoryFullId story_full_id{owner_dialog_id, story_id};
|
||||||
|
Story *story = get_story_editable(story_full_id);
|
||||||
|
if (story == nullptr) {
|
||||||
|
auto s = make_unique<Story>();
|
||||||
|
story = s.get();
|
||||||
|
stories_.set(story_full_id, std::move(s));
|
||||||
|
|
||||||
|
inaccessible_story_full_ids_.erase(story_full_id);
|
||||||
|
}
|
||||||
|
CHECK(story != nullptr);
|
||||||
|
if (story->date_ != story_item->date_ || story->expire_date_ != story_item->expire_date_) {
|
||||||
|
story->date_ = story_item->date_;
|
||||||
|
story->expire_date_ = story_item->expire_date_;
|
||||||
|
on_story_changed(story_full_id, story, true, true);
|
||||||
|
}
|
||||||
|
return story_id;
|
||||||
|
}
|
||||||
|
|
||||||
void StoryManager::on_delete_story(DialogId owner_dialog_id, StoryId story_id) {
|
void StoryManager::on_delete_story(DialogId owner_dialog_id, StoryId story_id) {
|
||||||
if (!story_id.is_server()) {
|
if (!story_id.is_server()) {
|
||||||
LOG(ERROR) << "Receive deleted " << story_id << " in " << owner_dialog_id;
|
LOG(ERROR) << "Receive deleted " << story_id << " in " << owner_dialog_id;
|
||||||
@ -1020,6 +1051,9 @@ void StoryManager::on_delete_story(DialogId owner_dialog_id, StoryId story_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) {
|
||||||
|
if (story->content_ == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (is_changed || need_save_to_database) {
|
if (is_changed || need_save_to_database) {
|
||||||
// TODO save Story and BeingEditedStory
|
// TODO save Story and BeingEditedStory
|
||||||
// save_story(story, story_id);
|
// save_story(story, story_id);
|
||||||
@ -1122,9 +1156,14 @@ StoryManager::ActiveStories StoryManager::on_get_user_stories(
|
|||||||
case telegram_api::storyItemDeleted::ID:
|
case telegram_api::storyItemDeleted::ID:
|
||||||
LOG(ERROR) << "Receive " << to_string(story);
|
LOG(ERROR) << "Receive " << to_string(story);
|
||||||
break;
|
break;
|
||||||
case telegram_api::storyItemSkipped::ID:
|
case telegram_api::storyItemSkipped::ID: {
|
||||||
// TODO
|
auto story_id =
|
||||||
|
on_get_skipped_story(owner_dialog_id, telegram_api::move_object_as<telegram_api::storyItemSkipped>(story));
|
||||||
|
if (story_id.is_valid()) {
|
||||||
|
story_ids.push_back(story_id);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case telegram_api::storyItem::ID: {
|
case telegram_api::storyItem::ID: {
|
||||||
auto story_id = on_get_story(owner_dialog_id, telegram_api::move_object_as<telegram_api::storyItem>(story));
|
auto story_id = on_get_story(owner_dialog_id, telegram_api::move_object_as<telegram_api::storyItem>(story));
|
||||||
if (story_id.is_valid()) {
|
if (story_id.is_valid()) {
|
||||||
@ -1192,7 +1231,7 @@ void StoryManager::get_story(DialogId owner_dialog_id, StoryId story_id,
|
|||||||
|
|
||||||
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) {
|
if (story != nullptr && story->content_ != nullptr) {
|
||||||
return promise.set_value(get_story_object(story_full_id, story));
|
return promise.set_value(get_story_object(story_full_id, story));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1353,7 +1392,7 @@ void StoryManager::edit_story(StoryId story_id, td_api::object_ptr<td_api::Input
|
|||||||
DialogId dialog_id(td_->contacts_manager_->get_my_id());
|
DialogId dialog_id(td_->contacts_manager_->get_my_id());
|
||||||
StoryFullId story_full_id{dialog_id, story_id};
|
StoryFullId story_full_id{dialog_id, story_id};
|
||||||
const Story *story = get_story(story_full_id);
|
const Story *story = get_story(story_full_id);
|
||||||
if (story == nullptr) {
|
if (story == nullptr || story->content_ == nullptr) {
|
||||||
return promise.set_error(Status::Error(400, "Story not found"));
|
return promise.set_error(Status::Error(400, "Story not found"));
|
||||||
}
|
}
|
||||||
if (!story_id.is_server()) {
|
if (!story_id.is_server()) {
|
||||||
@ -1427,6 +1466,7 @@ void StoryManager::do_edit_story(FileId file_id, unique_ptr<PendingStory> &&pend
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
CHECK(story->content_ != nullptr);
|
||||||
td_->create_handler<EditStoryQuery>()->send(file_id, std::move(pending_story), std::move(input_file),
|
td_->create_handler<EditStoryQuery>()->send(file_id, std::move(pending_story), std::move(input_file),
|
||||||
it->second.get());
|
it->second.get());
|
||||||
}
|
}
|
||||||
@ -1445,6 +1485,7 @@ void StoryManager::on_story_edited(FileId file_id, unique_ptr<PendingStory> pend
|
|||||||
LOG(INFO) << "Ignore outdated edit of " << story_full_id;
|
LOG(INFO) << "Ignore outdated edit of " << story_full_id;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
CHECK(story->content_ != nullptr);
|
||||||
if (pending_story->log_event_id_ != 0) {
|
if (pending_story->log_event_id_ != 0) {
|
||||||
binlog_erase(G()->td_db()->get_binlog(), pending_story->log_event_id_);
|
binlog_erase(G()->td_db()->get_binlog(), pending_story->log_event_id_);
|
||||||
}
|
}
|
||||||
@ -1467,7 +1508,7 @@ void StoryManager::set_story_privacy_rules(StoryId story_id,
|
|||||||
Promise<Unit> &&promise) {
|
Promise<Unit> &&promise) {
|
||||||
DialogId dialog_id(td_->contacts_manager_->get_my_id());
|
DialogId dialog_id(td_->contacts_manager_->get_my_id());
|
||||||
const Story *story = get_story({dialog_id, story_id});
|
const Story *story = get_story({dialog_id, story_id});
|
||||||
if (story == nullptr) {
|
if (story == nullptr || story->content_ == nullptr) {
|
||||||
return promise.set_error(Status::Error(400, "Story not found"));
|
return promise.set_error(Status::Error(400, "Story not found"));
|
||||||
}
|
}
|
||||||
TRY_RESULT_PROMISE(promise, privacy_rules,
|
TRY_RESULT_PROMISE(promise, privacy_rules,
|
||||||
@ -1478,7 +1519,7 @@ void StoryManager::set_story_privacy_rules(StoryId story_id,
|
|||||||
void StoryManager::toggle_story_is_pinned(StoryId story_id, bool is_pinned, Promise<Unit> &&promise) {
|
void StoryManager::toggle_story_is_pinned(StoryId story_id, bool is_pinned, Promise<Unit> &&promise) {
|
||||||
DialogId dialog_id(td_->contacts_manager_->get_my_id());
|
DialogId dialog_id(td_->contacts_manager_->get_my_id());
|
||||||
const Story *story = get_story({dialog_id, story_id});
|
const Story *story = get_story({dialog_id, story_id});
|
||||||
if (story == nullptr) {
|
if (story == nullptr || story->content_ == nullptr) {
|
||||||
return promise.set_error(Status::Error(400, "Story not found"));
|
return promise.set_error(Status::Error(400, "Story not found"));
|
||||||
}
|
}
|
||||||
auto query_promise = PromiseCreator::lambda(
|
auto query_promise = PromiseCreator::lambda(
|
||||||
@ -1496,6 +1537,7 @@ void StoryManager::on_toggle_story_is_pinned(StoryId story_id, bool is_pinned, P
|
|||||||
DialogId dialog_id(td_->contacts_manager_->get_my_id());
|
DialogId dialog_id(td_->contacts_manager_->get_my_id());
|
||||||
Story *story = get_story_editable({dialog_id, story_id});
|
Story *story = get_story_editable({dialog_id, story_id});
|
||||||
if (story != nullptr) {
|
if (story != nullptr) {
|
||||||
|
CHECK(story->content_ != nullptr);
|
||||||
story->is_pinned_ = is_pinned;
|
story->is_pinned_ = is_pinned;
|
||||||
on_story_changed({dialog_id, story_id}, story, true, true);
|
on_story_changed({dialog_id, story_id}, story, true, true);
|
||||||
}
|
}
|
||||||
|
@ -176,6 +176,9 @@ class StoryManager final : public Actor {
|
|||||||
|
|
||||||
StoryId on_get_story(DialogId owner_dialog_id, telegram_api::object_ptr<telegram_api::storyItem> &&story_item);
|
StoryId on_get_story(DialogId owner_dialog_id, telegram_api::object_ptr<telegram_api::storyItem> &&story_item);
|
||||||
|
|
||||||
|
StoryId on_get_skipped_story(DialogId owner_dialog_id,
|
||||||
|
telegram_api::object_ptr<telegram_api::storyItemSkipped> &&story_item);
|
||||||
|
|
||||||
void on_delete_story(DialogId owner_dialog_id, StoryId story_id);
|
void on_delete_story(DialogId owner_dialog_id, StoryId story_id);
|
||||||
|
|
||||||
ActiveStories on_get_user_stories(DialogId owner_dialog_id,
|
ActiveStories on_get_user_stories(DialogId owner_dialog_id,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user