mirror of https://github.com/procxx/kepka.git
				
				
				
			Send poll solution with entities.
This commit is contained in:
		
							parent
							
								
									6c08bab550
								
							
						
					
					
						commit
						13d22947df
					
				| 
						 | 
					@ -5754,16 +5754,6 @@ void ApiWrap::createPoll(
 | 
				
			||||||
	if (action.options.scheduled) {
 | 
						if (action.options.scheduled) {
 | 
				
			||||||
		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));
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	auto &histories = history->owner().histories();
 | 
						auto &histories = history->owner().histories();
 | 
				
			||||||
	const auto requestType = Data::Histories::RequestType::Send;
 | 
						const auto requestType = Data::Histories::RequestType::Send;
 | 
				
			||||||
	histories.sendRequest(history, requestType, [=](Fn<void()> finish) {
 | 
						histories.sendRequest(history, requestType, [=](Fn<void()> finish) {
 | 
				
			||||||
| 
						 | 
					@ -5772,12 +5762,7 @@ void ApiWrap::createPoll(
 | 
				
			||||||
			MTP_flags(sendFlags),
 | 
								MTP_flags(sendFlags),
 | 
				
			||||||
			peer->input,
 | 
								peer->input,
 | 
				
			||||||
			MTP_int(replyTo),
 | 
								MTP_int(replyTo),
 | 
				
			||||||
			MTP_inputMediaPoll(
 | 
								PollDataToInputMedia(&data),
 | 
				
			||||||
				MTP_flags(inputFlags),
 | 
					 | 
				
			||||||
				PollDataToMTP(&data),
 | 
					 | 
				
			||||||
				MTP_vector<MTPbytes>(correct),
 | 
					 | 
				
			||||||
				MTPstring(), // #TODO polls solution
 | 
					 | 
				
			||||||
				MTPvector<MTPMessageEntity>()),
 | 
					 | 
				
			||||||
			MTP_string(),
 | 
								MTP_string(),
 | 
				
			||||||
			MTP_long(rand_value<uint64>()),
 | 
								MTP_long(rand_value<uint64>()),
 | 
				
			||||||
			MTPReplyMarkup(),
 | 
								MTPReplyMarkup(),
 | 
				
			||||||
| 
						 | 
					@ -5854,27 +5839,12 @@ void ApiWrap::closePoll(not_null<HistoryItem*> item) {
 | 
				
			||||||
	if (!poll) {
 | 
						if (!poll) {
 | 
				
			||||||
		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(
 | 
							PollDataToInputMedia(poll, true),
 | 
				
			||||||
			MTP_flags(inputFlags),
 | 
					 | 
				
			||||||
			PollDataToMTP(poll, true),
 | 
					 | 
				
			||||||
			MTP_vector<MTPbytes>(correct),
 | 
					 | 
				
			||||||
			MTPstring(), // #TODO polls solution
 | 
					 | 
				
			||||||
			MTPvector<MTPMessageEntity>()),
 | 
					 | 
				
			||||||
		MTPReplyMarkup(),
 | 
							MTPReplyMarkup(),
 | 
				
			||||||
		MTPVector<MTPMessageEntity>(),
 | 
							MTPVector<MTPMessageEntity>(),
 | 
				
			||||||
		MTP_int(0) // schedule_date
 | 
							MTP_int(0) // schedule_date
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,6 +38,7 @@ constexpr auto kMaxOptionsCount = PollData::kMaxOptions;
 | 
				
			||||||
constexpr auto kOptionLimit = 100;
 | 
					constexpr auto kOptionLimit = 100;
 | 
				
			||||||
constexpr auto kWarnQuestionLimit = 80;
 | 
					constexpr auto kWarnQuestionLimit = 80;
 | 
				
			||||||
constexpr auto kWarnOptionLimit = 30;
 | 
					constexpr auto kWarnOptionLimit = 30;
 | 
				
			||||||
 | 
					constexpr auto kSolutionLimit = 400;
 | 
				
			||||||
constexpr auto kErrorLimit = 99;
 | 
					constexpr auto kErrorLimit = 99;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Options {
 | 
					class Options {
 | 
				
			||||||
| 
						 | 
					@ -816,7 +817,13 @@ not_null<Ui::InputField*> CreatePollBox::setupSolution(
 | 
				
			||||||
			tr::lng_polls_solution_placeholder()),
 | 
								tr::lng_polls_solution_placeholder()),
 | 
				
			||||||
		st::createPollFieldPadding);
 | 
							st::createPollFieldPadding);
 | 
				
			||||||
	InitField(getDelegate()->outerContainer(), solution, _session);
 | 
						InitField(getDelegate()->outerContainer(), solution, _session);
 | 
				
			||||||
	solution->setMaxLength(kQuestionLimit + kErrorLimit);
 | 
						solution->setMaxLength(kSolutionLimit + kErrorLimit);
 | 
				
			||||||
 | 
						solution->setInstantReplaces(Ui::InstantReplaces::Default());
 | 
				
			||||||
 | 
						solution->setInstantReplacesEnabled(
 | 
				
			||||||
 | 
							_session->settings().replaceEmojiValue());
 | 
				
			||||||
 | 
						solution->setMarkdownReplacesEnabled(rpl::single(true));
 | 
				
			||||||
 | 
						solution->setEditLinkCallback(
 | 
				
			||||||
 | 
							DefaultEditLinkCallback(_session, solution));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inner->add(
 | 
						inner->add(
 | 
				
			||||||
		object_ptr<Ui::FlatLabel>(
 | 
							object_ptr<Ui::FlatLabel>(
 | 
				
			||||||
| 
						 | 
					@ -901,7 +908,7 @@ object_ptr<Ui::RpWidget> CreatePollBox::setupContent() {
 | 
				
			||||||
			st::defaultCheckbox),
 | 
								st::defaultCheckbox),
 | 
				
			||||||
		st::createPollCheckboxMargin);
 | 
							st::createPollCheckboxMargin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const auto explanation = setupSolution(
 | 
						const auto solution = setupSolution(
 | 
				
			||||||
		container,
 | 
							container,
 | 
				
			||||||
		rpl::single(quiz->checked()) | rpl::then(quiz->checkedChanges()));
 | 
							rpl::single(quiz->checked()) | rpl::then(quiz->checkedChanges()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -950,6 +957,13 @@ object_ptr<Ui::RpWidget> CreatePollBox::setupContent() {
 | 
				
			||||||
		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();
 | 
				
			||||||
 | 
							const auto solutionWithTags = quiz->checked()
 | 
				
			||||||
 | 
								? solution->getTextWithAppliedMarkdown()
 | 
				
			||||||
 | 
								: TextWithTags();
 | 
				
			||||||
 | 
							result.solution = TextWithEntities{
 | 
				
			||||||
 | 
								solutionWithTags.text,
 | 
				
			||||||
 | 
								TextUtilities::ConvertTextTagsToEntities(solutionWithTags.tags)
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
		const auto publicVotes = (anonymous && !anonymous->checked());
 | 
							const auto publicVotes = (anonymous && !anonymous->checked());
 | 
				
			||||||
		const auto multiChoice = (multiple && multiple->checked());
 | 
							const auto multiChoice = (multiple && multiple->checked());
 | 
				
			||||||
		result.setFlags(Flag(0)
 | 
							result.setFlags(Flag(0)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,6 +11,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 | 
				
			||||||
#include "data/data_user.h"
 | 
					#include "data/data_user.h"
 | 
				
			||||||
#include "data/data_session.h"
 | 
					#include "data/data_session.h"
 | 
				
			||||||
#include "main/main_session.h"
 | 
					#include "main/main_session.h"
 | 
				
			||||||
 | 
					#include "api/api_text_entities.h"
 | 
				
			||||||
 | 
					#include "ui/text_options.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace {
 | 
					namespace {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -123,6 +125,15 @@ bool PollData::applyResults(const MTPPollResults &results) {
 | 
				
			||||||
				}) | ranges::to_vector;
 | 
									}) | ranges::to_vector;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							auto newSolution = TextWithEntities{
 | 
				
			||||||
 | 
								results.vsolution().value_or_empty(),
 | 
				
			||||||
 | 
								Api::EntitiesFromMTP(
 | 
				
			||||||
 | 
									results.vsolution_entities().value_or_empty())
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							if (solution != newSolution) {
 | 
				
			||||||
 | 
								solution = std::move(newSolution);
 | 
				
			||||||
 | 
								changed = true;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if (!changed) {
 | 
							if (!changed) {
 | 
				
			||||||
			return false;
 | 
								return false;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -226,12 +237,48 @@ MTPPoll PollDataToMTP(not_null<const PollData*> poll, bool close) {
 | 
				
			||||||
	const auto flags = ((poll->closed() || close) ? Flag::f_closed : Flag(0))
 | 
						const auto flags = ((poll->closed() || close) ? Flag::f_closed : Flag(0))
 | 
				
			||||||
		| (poll->multiChoice() ? Flag::f_multiple_choice : Flag(0))
 | 
							| (poll->multiChoice() ? Flag::f_multiple_choice : Flag(0))
 | 
				
			||||||
		| (poll->publicVotes() ? Flag::f_public_voters : Flag(0))
 | 
							| (poll->publicVotes() ? Flag::f_public_voters : Flag(0))
 | 
				
			||||||
		| (poll->quiz() ? Flag::f_quiz : Flag(0));
 | 
							| (poll->quiz() ? Flag::f_quiz : Flag(0))
 | 
				
			||||||
 | 
							| (poll->closePeriod > 0 ? Flag::f_close_period : Flag(0));
 | 
				
			||||||
	return MTP_poll(
 | 
						return MTP_poll(
 | 
				
			||||||
		MTP_long(poll->id),
 | 
							MTP_long(poll->id),
 | 
				
			||||||
		MTP_flags(flags),
 | 
							MTP_flags(flags),
 | 
				
			||||||
		MTP_string(poll->question),
 | 
							MTP_string(poll->question),
 | 
				
			||||||
		MTP_vector<MTPPollAnswer>(answers),
 | 
							MTP_vector<MTPPollAnswer>(answers),
 | 
				
			||||||
		MTPint(), // #TODO polls close_period
 | 
							MTP_int(poll->closePeriod),
 | 
				
			||||||
		MTPint());
 | 
							MTP_int(poll->closeDate));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MTPInputMedia PollDataToInputMedia(
 | 
				
			||||||
 | 
							not_null<const PollData*> poll,
 | 
				
			||||||
 | 
							bool close) {
 | 
				
			||||||
 | 
						auto inputFlags = MTPDinputMediaPoll::Flag(0)
 | 
				
			||||||
 | 
							| (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));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						auto solution = poll->solution;
 | 
				
			||||||
 | 
						const auto prepareFlags = Ui::ItemTextDefaultOptions().flags;
 | 
				
			||||||
 | 
						TextUtilities::PrepareForSending(solution, prepareFlags);
 | 
				
			||||||
 | 
						TextUtilities::Trim(solution);
 | 
				
			||||||
 | 
						const auto sentEntities = Api::EntitiesToMTP(
 | 
				
			||||||
 | 
							solution.entities,
 | 
				
			||||||
 | 
							Api::ConvertOption::SkipLocal);
 | 
				
			||||||
 | 
						if (!solution.text.isEmpty()) {
 | 
				
			||||||
 | 
							inputFlags |= MTPDinputMediaPoll::Flag::f_solution;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (!sentEntities.v.isEmpty()) {
 | 
				
			||||||
 | 
							inputFlags |= MTPDinputMediaPoll::Flag::f_solution_entities;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return MTP_inputMediaPoll(
 | 
				
			||||||
 | 
							MTP_flags(inputFlags),
 | 
				
			||||||
 | 
							PollDataToMTP(poll, close),
 | 
				
			||||||
 | 
							MTP_vector<MTPbytes>(correct),
 | 
				
			||||||
 | 
							MTP_string(solution.text),
 | 
				
			||||||
 | 
							sentEntities);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -60,10 +60,12 @@ struct PollData {
 | 
				
			||||||
	QString question;
 | 
						QString question;
 | 
				
			||||||
	std::vector<PollAnswer> answers;
 | 
						std::vector<PollAnswer> answers;
 | 
				
			||||||
	std::vector<not_null<UserData*>> recentVoters;
 | 
						std::vector<not_null<UserData*>> recentVoters;
 | 
				
			||||||
	int totalVoters = 0;
 | 
					 | 
				
			||||||
	std::vector<QByteArray> sendingVotes;
 | 
						std::vector<QByteArray> sendingVotes;
 | 
				
			||||||
	crl::time lastResultsUpdate = 0;
 | 
						crl::time lastResultsUpdate = 0;
 | 
				
			||||||
 | 
						TextWithEntities solution;
 | 
				
			||||||
 | 
						TimeId closePeriod = -1;
 | 
				
			||||||
 | 
						TimeId closeDate = -1;
 | 
				
			||||||
 | 
						int totalVoters = 0;
 | 
				
			||||||
	int version = 0;
 | 
						int version = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	static constexpr auto kMaxOptions = 10;
 | 
						static constexpr auto kMaxOptions = 10;
 | 
				
			||||||
| 
						 | 
					@ -78,4 +80,9 @@ private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MTPPoll PollDataToMTP(not_null<const PollData*> poll, bool close = false);
 | 
					[[nodiscard]] MTPPoll PollDataToMTP(
 | 
				
			||||||
 | 
						not_null<const PollData*> poll,
 | 
				
			||||||
 | 
						bool close = false);
 | 
				
			||||||
 | 
					[[nodiscard]] MTPInputMedia PollDataToInputMedia(
 | 
				
			||||||
 | 
						not_null<const PollData*> poll,
 | 
				
			||||||
 | 
						bool close = false);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue