Add and use StoryId::get_input_story_ids.

This commit is contained in:
levlam 2023-06-15 18:57:12 +03:00
parent 37e5847cc3
commit e7c8b0cded
3 changed files with 30 additions and 21 deletions

View File

@ -30,6 +30,15 @@ class StoryId {
return StoryId(std::numeric_limits<int32>::max()); return StoryId(std::numeric_limits<int32>::max());
} }
static vector<int32> get_input_story_ids(const vector<StoryId> &story_ids) {
vector<int32> input_story_ids;
input_story_ids.reserve(story_ids.size());
for (auto &story_id : story_ids) {
input_story_ids.emplace_back(story_id.get());
}
return input_story_ids;
}
int32 get() const { int32 get() const {
return id; return id;
} }

View File

@ -79,14 +79,14 @@ class IncrementStoryViewsQuery final : public Td::ResultHandler {
explicit IncrementStoryViewsQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) { explicit IncrementStoryViewsQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) {
} }
void send(DialogId owner_dialog_id, vector<int32> input_story_ids) { void send(DialogId owner_dialog_id, const vector<StoryId> &story_ids) {
CHECK(owner_dialog_id.get_type() == DialogType::User); CHECK(owner_dialog_id.get_type() == DialogType::User);
auto r_input_user = td_->contacts_manager_->get_input_user(owner_dialog_id.get_user_id()); auto r_input_user = td_->contacts_manager_->get_input_user(owner_dialog_id.get_user_id());
if (r_input_user.is_error()) { if (r_input_user.is_error()) {
return on_error(r_input_user.move_as_error()); return on_error(r_input_user.move_as_error());
} }
send_query(G()->net_query_creator().create( send_query(G()->net_query_creator().create(
telegram_api::stories_incrementStoryViews(r_input_user.move_as_ok(), std::move(input_story_ids)))); telegram_api::stories_incrementStoryViews(r_input_user.move_as_ok(), StoryId::get_input_story_ids(story_ids))));
} }
void on_result(BufferSlice packet) final { void on_result(BufferSlice packet) final {
@ -137,21 +137,21 @@ class ReadStoriesQuery final : public Td::ResultHandler {
class GetStoriesByIDQuery final : public Td::ResultHandler { class GetStoriesByIDQuery final : public Td::ResultHandler {
Promise<Unit> promise_; Promise<Unit> promise_;
UserId user_id_; UserId user_id_;
vector<int32> input_story_ids_; vector<StoryId> story_ids_;
public: public:
explicit GetStoriesByIDQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) { explicit GetStoriesByIDQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) {
} }
void send(UserId user_id, vector<int32> input_story_ids) { void send(UserId user_id, vector<StoryId> story_ids) {
user_id_ = user_id; user_id_ = user_id;
input_story_ids_ = input_story_ids; story_ids_ = std::move(story_ids);
auto r_input_user = td_->contacts_manager_->get_input_user(user_id_); auto r_input_user = td_->contacts_manager_->get_input_user(user_id_);
if (r_input_user.is_error()) { if (r_input_user.is_error()) {
return on_error(r_input_user.move_as_error()); return on_error(r_input_user.move_as_error());
} }
send_query(G()->net_query_creator().create( send_query(G()->net_query_creator().create(
telegram_api::stories_getStoriesByID(r_input_user.move_as_ok(), std::move(input_story_ids)))); telegram_api::stories_getStoriesByID(r_input_user.move_as_ok(), StoryId::get_input_story_ids(story_ids_))));
} }
void on_result(BufferSlice packet) final { void on_result(BufferSlice packet) final {
@ -162,7 +162,7 @@ class GetStoriesByIDQuery final : public Td::ResultHandler {
auto result = result_ptr.move_as_ok(); auto result = result_ptr.move_as_ok();
LOG(DEBUG) << "Receive result for GetStoriesByIDQuery: " << to_string(result); LOG(DEBUG) << "Receive result for GetStoriesByIDQuery: " << to_string(result);
td_->story_manager_->on_get_stories(DialogId(user_id_), std::move(input_story_ids_), std::move(result)); td_->story_manager_->on_get_stories(DialogId(user_id_), std::move(story_ids_), std::move(result));
promise_.set_value(Unit()); promise_.set_value(Unit());
} }
@ -331,8 +331,9 @@ class DeleteStoriesQuery final : public Td::ResultHandler {
explicit DeleteStoriesQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) { explicit DeleteStoriesQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) {
} }
void send(vector<int32> story_ids) { void send(const vector<StoryId> &story_ids) {
send_query(G()->net_query_creator().create(telegram_api::stories_deleteStories(std::move(story_ids)))); send_query(
G()->net_query_creator().create(telegram_api::stories_deleteStories(StoryId::get_input_story_ids(story_ids))));
} }
void on_result(BufferSlice packet) final { void on_result(BufferSlice packet) final {
@ -763,11 +764,11 @@ void StoryManager::on_owned_story_opened(StoryFullId story_full_id) {
void StoryManager::increment_story_views(DialogId owner_dialog_id, PendingStoryViews &story_views) { void StoryManager::increment_story_views(DialogId owner_dialog_id, PendingStoryViews &story_views) {
CHECK(!story_views.has_query_); CHECK(!story_views.has_query_);
vector<int32> viewed_story_ids; vector<StoryId> viewed_story_ids;
const size_t MAX_VIEWED_STORIES = 200; // server-side limit const size_t MAX_VIEWED_STORIES = 200; // server-side limit
while (!story_views.story_ids_.empty() && viewed_story_ids.size() < MAX_VIEWED_STORIES) { while (!story_views.story_ids_.empty() && viewed_story_ids.size() < MAX_VIEWED_STORIES) {
auto story_id_it = story_views.story_ids_.begin(); auto story_id_it = story_views.story_ids_.begin();
viewed_story_ids.push_back(story_id_it->get()); viewed_story_ids.push_back(*story_id_it);
story_views.story_ids_.erase(story_id_it); story_views.story_ids_.erase(story_id_it);
} }
CHECK(!viewed_story_ids.empty()); CHECK(!viewed_story_ids.empty());
@ -1217,7 +1218,7 @@ void StoryManager::on_story_changed(StoryFullId story_full_id, const Story *stor
} }
std::pair<int32, vector<StoryId>> StoryManager::on_get_stories( std::pair<int32, vector<StoryId>> StoryManager::on_get_stories(
DialogId owner_dialog_id, vector<int32> &&expected_story_ids, DialogId owner_dialog_id, vector<StoryId> &&expected_story_ids,
telegram_api::object_ptr<telegram_api::stories_stories> &&stories) { telegram_api::object_ptr<telegram_api::stories_stories> &&stories) {
td_->contacts_manager_->on_get_users(std::move(stories->users_), "on_get_stories"); td_->contacts_manager_->on_get_users(std::move(stories->users_), "on_get_stories");
@ -1248,18 +1249,18 @@ std::pair<int32, vector<StoryId>> StoryManager::on_get_stories(
total_count = static_cast<int32>(story_ids.size()); total_count = static_cast<int32>(story_ids.size());
} }
if (!expected_story_ids.empty()) { if (!expected_story_ids.empty()) {
FlatHashSet<int32> all_story_ids; FlatHashSet<StoryId, StoryIdHash> all_story_ids;
for (auto expected_story_id : expected_story_ids) { for (auto expected_story_id : expected_story_ids) {
CHECK(expected_story_id != 0); CHECK(expected_story_id != StoryId());
all_story_ids.insert(expected_story_id); all_story_ids.insert(expected_story_id);
} }
for (auto story_id : story_ids) { for (auto story_id : story_ids) {
if (all_story_ids.erase(story_id.get()) == 0) { if (all_story_ids.erase(story_id) == 0) {
LOG(ERROR) << "Receive " << story_id << " in " << owner_dialog_id << ", but didn't request it"; LOG(ERROR) << "Receive " << story_id << " in " << owner_dialog_id << ", but didn't request it";
} }
} }
for (auto story_id : all_story_ids) { for (auto story_id : all_story_ids) {
StoryFullId story_full_id{owner_dialog_id, StoryId(story_id)}; StoryFullId story_full_id{owner_dialog_id, story_id};
LOG(INFO) << "Mark " << story_full_id << " as inaccessible"; LOG(INFO) << "Mark " << story_full_id << " as inaccessible";
inaccessible_story_full_ids_.insert(story_full_id); inaccessible_story_full_ids_.insert(story_full_id);
send_closure_later(G()->messages_manager(), send_closure_later(G()->messages_manager(),
@ -1414,7 +1415,7 @@ void StoryManager::reload_story(StoryFullId story_full_id, Promise<Unit> &&promi
return promise.set_error(Status::Error(400, "Invalid story identifier")); return promise.set_error(Status::Error(400, "Invalid story identifier"));
} }
auto user_id = dialog_id.get_user_id(); auto user_id = dialog_id.get_user_id();
td_->create_handler<GetStoriesByIDQuery>(std::move(promise))->send(user_id, {story_id.get()}); td_->create_handler<GetStoriesByIDQuery>(std::move(promise))->send(user_id, {story_id});
} }
void StoryManager::get_story(DialogId owner_dialog_id, StoryId story_id, void StoryManager::get_story(DialogId owner_dialog_id, StoryId story_id,
@ -1442,8 +1443,7 @@ void StoryManager::get_story(DialogId owner_dialog_id, StoryId story_id,
[actor_id = actor_id(this), story_full_id, promise = std::move(promise)](Result<Unit> &&result) mutable { [actor_id = actor_id(this), story_full_id, promise = std::move(promise)](Result<Unit> &&result) mutable {
send_closure(actor_id, &StoryManager::do_get_story, story_full_id, std::move(result), std::move(promise)); send_closure(actor_id, &StoryManager::do_get_story, story_full_id, std::move(result), std::move(promise));
}); });
td_->create_handler<GetStoriesByIDQuery>(std::move(query_promise)) td_->create_handler<GetStoriesByIDQuery>(std::move(query_promise))->send(owner_dialog_id.get_user_id(), {story_id});
->send(owner_dialog_id.get_user_id(), {story_id.get()});
} }
void StoryManager::do_get_story(StoryFullId story_full_id, Result<Unit> &&result, void StoryManager::do_get_story(StoryFullId story_full_id, Result<Unit> &&result,
@ -1799,7 +1799,7 @@ void StoryManager::delete_story_on_server(DialogId dialog_id, StoryId story_id,
deleted_story_full_ids_.insert({dialog_id, story_id}); deleted_story_full_ids_.insert({dialog_id, story_id});
td_->create_handler<DeleteStoriesQuery>(std::move(promise))->send({story_id.get()}); td_->create_handler<DeleteStoriesQuery>(std::move(promise))->send({story_id});
} }
telegram_api::object_ptr<telegram_api::InputMedia> StoryManager::get_input_media(StoryFullId story_full_id) const { telegram_api::object_ptr<telegram_api::InputMedia> StoryManager::get_input_media(StoryFullId story_full_id) const {

View File

@ -121,7 +121,7 @@ class StoryManager final : public Actor {
StoryId on_get_story(DialogId owner_dialog_id, telegram_api::object_ptr<telegram_api::StoryItem> &&story_item_ptr); StoryId on_get_story(DialogId owner_dialog_id, telegram_api::object_ptr<telegram_api::StoryItem> &&story_item_ptr);
std::pair<int32, vector<StoryId>> on_get_stories(DialogId owner_dialog_id, vector<int32> &&expected_story_ids, std::pair<int32, vector<StoryId>> on_get_stories(DialogId owner_dialog_id, vector<StoryId> &&expected_story_ids,
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,