Create polls with different settings.

This commit is contained in:
John Preston 2020-01-13 13:49:18 +03:00
parent 04d9b93e17
commit f700220ec1
4 changed files with 43 additions and 8 deletions

View File

@ -5842,15 +5842,24 @@ void ApiWrap::createPoll(
sendFlags |= MTPmessages_SendMedia::Flag::f_schedule_date; sendFlags |= MTPmessages_SendMedia::Flag::f_schedule_date;
} }
const auto inputFlags = data.quiz()
? MTPDinputMediaPoll::Flag::f_correct_answers
: MTPDinputMediaPoll::Flag(0);
auto correct = QVector<MTPbytes>();
for (const auto &answer : data.answers) {
if (answer.correct) {
correct.push_back(MTP_bytes(answer.option));
}
}
const auto replyTo = action.replyTo; const auto replyTo = action.replyTo;
history->sendRequestId = request(MTPmessages_SendMedia( history->sendRequestId = request(MTPmessages_SendMedia(
MTP_flags(sendFlags), MTP_flags(sendFlags),
peer->input, peer->input,
MTP_int(replyTo), MTP_int(replyTo),
MTP_inputMediaPoll( MTP_inputMediaPoll(
MTP_flags(0), MTP_flags(inputFlags),
PollDataToMTP(&data), PollDataToMTP(&data),
MTPvector<MTPbytes>()), // correct_answers #TODO polls MTP_vector<MTPbytes>(correct)),
MTP_string(), MTP_string(),
MTP_long(rand_value<uint64>()), MTP_long(rand_value<uint64>()),
MTPReplyMarkup(), MTPReplyMarkup(),
@ -5924,15 +5933,24 @@ void ApiWrap::closePoll(not_null<HistoryItem*> item) {
return; return;
} }
const auto inputFlags = poll->quiz()
? MTPDinputMediaPoll::Flag::f_correct_answers
: MTPDinputMediaPoll::Flag(0);
auto correct = QVector<MTPbytes>();
for (const auto &answer : poll->answers) {
if (answer.correct) {
correct.push_back(MTP_bytes(answer.option));
}
}
const auto requestId = request(MTPmessages_EditMessage( const auto requestId = request(MTPmessages_EditMessage(
MTP_flags(MTPmessages_EditMessage::Flag::f_media), MTP_flags(MTPmessages_EditMessage::Flag::f_media),
item->history()->peer->input, item->history()->peer->input,
MTP_int(item->id), MTP_int(item->id),
MTPstring(), MTPstring(),
MTP_inputMediaPoll( MTP_inputMediaPoll(
MTP_flags(0), MTP_flags(inputFlags),
PollDataToMTP(poll), PollDataToMTP(poll, true),
MTPvector<MTPbytes>()), // correct_answers #TODO polls MTP_vector<MTPbytes>(correct)),
MTPReplyMarkup(), MTPReplyMarkup(),
MTPVector<MTPMessageEntity>(), MTPVector<MTPMessageEntity>(),
MTP_int(0) // schedule_date MTP_int(0) // schedule_date

View File

@ -869,9 +869,13 @@ object_ptr<Ui::RpWidget> CreatePollBox::setupContent() {
}; };
const auto collectResult = [=] { const auto collectResult = [=] {
using Flag = PollData::Flag;
auto result = PollData(&_session->data(), id); auto result = PollData(&_session->data(), id);
result.question = question->getLastText().trimmed(); result.question = question->getLastText().trimmed();
result.answers = options->toPollAnswers(); result.answers = options->toPollAnswers();
result.setFlags((anonymous->checked() ? Flag(0) : Flag::PublicVotes)
| (multiple->checked() ? Flag::MultiChoice : Flag(0))
| (quiz->checked() ? Flag::Quiz : Flag(0)));
return result; return result;
}; };
const auto send = [=](Api::SendOptions options) { const auto send = [=](Api::SendOptions options) {

View File

@ -177,6 +177,13 @@ bool PollData::applyResultToAnswers(
}); });
} }
void PollData::setFlags(Flags flags) {
if (_flags != flags) {
_flags = flags;
++version;
}
}
PollData::Flags PollData::flags() const { PollData::Flags PollData::flags() const {
return _flags; return _flags;
} }
@ -201,7 +208,7 @@ bool PollData::quiz() const {
return (_flags & Flag::Quiz); return (_flags & Flag::Quiz);
} }
MTPPoll PollDataToMTP(not_null<const PollData*> poll) { MTPPoll PollDataToMTP(not_null<const PollData*> poll, bool close) {
const auto convert = [](const PollAnswer &answer) { const auto convert = [](const PollAnswer &answer) {
return MTP_pollAnswer( return MTP_pollAnswer(
MTP_string(answer.text), MTP_string(answer.text),
@ -213,9 +220,14 @@ MTPPoll PollDataToMTP(not_null<const PollData*> poll) {
poll->answers, poll->answers,
ranges::back_inserter(answers), ranges::back_inserter(answers),
convert); convert);
using Flag = MTPDpoll::Flag;
const auto flags = ((poll->closed() || close) ? Flag::f_closed : Flag(0))
| (poll->multiChoice() ? Flag::f_multiple_choice : Flag(0))
| (poll->publicVotes() ? Flag::f_public_voters : Flag(0))
| (poll->quiz() ? Flag::f_quiz : Flag(0));
return MTP_poll( return MTP_poll(
MTP_long(poll->id), MTP_long(poll->id),
MTP_flags(MTPDpoll::Flag::f_closed), MTP_flags(flags),
MTP_string(poll->question), MTP_string(poll->question),
MTP_vector<MTPPollAnswer>(answers)); MTP_vector<MTPPollAnswer>(answers));
} }

View File

@ -48,6 +48,7 @@ struct PollData {
[[nodiscard]] const PollAnswer *answerByOption( [[nodiscard]] const PollAnswer *answerByOption(
const QByteArray &option) const; const QByteArray &option) const;
void setFlags(Flags flags);
[[nodiscard]] Flags flags() const; [[nodiscard]] Flags flags() const;
[[nodiscard]] bool voted() const; [[nodiscard]] bool voted() const;
[[nodiscard]] bool closed() const; [[nodiscard]] bool closed() const;
@ -77,4 +78,4 @@ private:
}; };
MTPPoll PollDataToMTP(not_null<const PollData*> poll); MTPPoll PollDataToMTP(not_null<const PollData*> poll, bool close = false);