Reopen closed polls when copying them.

This commit is contained in:
levlam 2021-09-05 23:11:25 +03:00
parent 96ffd57881
commit 73290dcda8
3 changed files with 35 additions and 4 deletions

View File

@ -4362,7 +4362,12 @@ unique_ptr<MessageContent> dup_message_content(Td *td, DialogId dialog_id, const
return std::move(result); return std::move(result);
} }
case MessageContentType::Poll: case MessageContentType::Poll:
if (type == MessageContentDupType::Copy) {
return make_unique<MessagePoll>(
td->poll_manager_->dup_poll(static_cast<const MessagePoll *>(content)->poll_id));
} else {
return make_unique<MessagePoll>(*static_cast<const MessagePoll *>(content)); return make_unique<MessagePoll>(*static_cast<const MessagePoll *>(content));
}
case MessageContentType::Sticker: { case MessageContentType::Sticker: {
auto result = make_unique<MessageSticker>(*static_cast<const MessageSticker *>(content)); auto result = make_unique<MessageSticker>(*static_cast<const MessageSticker *>(content));
if (td->stickers_manager_->has_input_media(result->file_id, to_secret)) { if (td->stickers_manager_->has_input_media(result->file_id, to_secret)) {

View File

@ -576,6 +576,10 @@ td_api::object_ptr<td_api::poll> PollManager::get_poll_object(PollId poll_id, co
open_period = close_date - now; open_period = close_date - now;
} }
} }
if (poll->is_closed) {
open_period = 0;
close_date = 0;
}
return td_api::make_object<td_api::poll>( return td_api::make_object<td_api::poll>(
poll_id.get(), poll->question, std::move(poll_options), total_voter_count, poll_id.get(), poll->question, std::move(poll_options), total_voter_count,
td_->contacts_manager_->get_user_ids_object(poll->recent_voter_user_ids, "get_poll_object"), poll->is_anonymous, td_->contacts_manager_->get_user_ids_object(poll->recent_voter_user_ids, "get_poll_object"), poll->is_anonymous,
@ -1246,6 +1250,18 @@ void PollManager::on_online() {
} }
} }
PollId PollManager::dup_poll(PollId poll_id) {
auto poll = get_poll(poll_id);
CHECK(poll != nullptr);
auto question = poll->question;
auto options = transform(poll->options, [](auto &option) { return option.text; });
auto explanation = poll->explanation;
return create_poll(std::move(question), std::move(options), poll->is_anonymous, poll->allow_multiple_answers,
poll->is_quiz, poll->correct_option_id, std::move(explanation), poll->open_period,
poll->open_period == 0 ? 0 : G()->unix_time(), false);
}
bool PollManager::has_input_media(PollId poll_id) const { bool PollManager::has_input_media(PollId poll_id) const {
auto poll = get_poll(poll_id); auto poll = get_poll(poll_id);
CHECK(poll != nullptr); CHECK(poll != nullptr);
@ -1346,6 +1362,7 @@ PollId PollManager::on_get_poll(PollId poll_id, tl_object_ptr<telegram_api::poll
auto poll = get_poll_force(poll_id); auto poll = get_poll_force(poll_id);
bool is_changed = false; bool is_changed = false;
bool need_save_to_database = false;
if (poll == nullptr) { if (poll == nullptr) {
if (poll_server == nullptr) { if (poll_server == nullptr) {
LOG(INFO) << "Ignore " << poll_id << ", because have no data about it"; LOG(INFO) << "Ignore " << poll_id << ", because have no data about it";
@ -1428,13 +1445,16 @@ PollId PollManager::on_get_poll(PollId poll_id, tl_object_ptr<telegram_api::poll
} }
if (open_period != poll->open_period) { if (open_period != poll->open_period) {
poll->open_period = open_period; poll->open_period = open_period;
if (!poll->is_closed) {
is_changed = true; is_changed = true;
} else {
need_save_to_database = true;
}
} }
if (close_date != poll->close_date) { if (close_date != poll->close_date) {
poll->close_date = close_date; poll->close_date = close_date;
is_changed = true;
if (!poll->is_closed) { if (!poll->is_closed) {
is_changed = true;
if (close_date != 0) { if (close_date != 0) {
if (close_date <= G()->server_time()) { if (close_date <= G()->server_time()) {
poll->is_closed = true; poll->is_closed = true;
@ -1444,6 +1464,8 @@ PollId PollManager::on_get_poll(PollId poll_id, tl_object_ptr<telegram_api::poll
} else { } else {
close_poll_timeout_.cancel_timeout(poll_id.get()); close_poll_timeout_.cancel_timeout(poll_id.get());
} }
} else {
need_save_to_database = true;
} }
} }
bool is_anonymous = (poll_server->flags_ & telegram_api::poll::PUBLIC_VOTERS_MASK) == 0; bool is_anonymous = (poll_server->flags_ & telegram_api::poll::PUBLIC_VOTERS_MASK) == 0;
@ -1608,6 +1630,8 @@ PollId PollManager::on_get_poll(PollId poll_id, tl_object_ptr<telegram_api::poll
} }
if (is_changed) { if (is_changed) {
notify_on_poll_update(poll_id); notify_on_poll_update(poll_id);
}
if (is_changed || need_save_to_database) {
save_poll(poll, poll_id); save_poll(poll, poll_id);
} }
if (need_update_poll && (is_changed || (poll->is_closed && being_closed_polls_.erase(poll_id) != 0))) { if (need_update_poll && (is_changed || (poll->is_closed && being_closed_polls_.erase(poll_id) != 0))) {

View File

@ -70,6 +70,8 @@ class PollManager final : public Actor {
void stop_local_poll(PollId poll_id); void stop_local_poll(PollId poll_id);
PollId dup_poll(PollId poll_id);
bool has_input_media(PollId poll_id) const; bool has_input_media(PollId poll_id) const;
tl_object_ptr<telegram_api::InputMedia> get_input_media(PollId poll_id) const; tl_object_ptr<telegram_api::InputMedia> get_input_media(PollId poll_id) const;