summaryrefslogtreecommitdiff
path: root/protocols/Telegram/tdlib/td/td/telegram/PollManager.hpp
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2022-11-30 17:48:47 +0300
committerGeorge Hazan <ghazan@miranda.im>2022-11-30 17:48:47 +0300
commit0ece30dc7c0e34b4c5911969b8fa99c33c6d023c (patch)
tree671325d3fec09b999411e4e3ab84ef8259261818 /protocols/Telegram/tdlib/td/td/telegram/PollManager.hpp
parent46c53ffc6809c67e4607e99951a2846c382b63b2 (diff)
Telegram: update for TDLIB
Diffstat (limited to 'protocols/Telegram/tdlib/td/td/telegram/PollManager.hpp')
-rw-r--r--protocols/Telegram/tdlib/td/td/telegram/PollManager.hpp224
1 files changed, 224 insertions, 0 deletions
diff --git a/protocols/Telegram/tdlib/td/td/telegram/PollManager.hpp b/protocols/Telegram/tdlib/td/td/telegram/PollManager.hpp
new file mode 100644
index 0000000000..1c9f6b1a32
--- /dev/null
+++ b/protocols/Telegram/tdlib/td/td/telegram/PollManager.hpp
@@ -0,0 +1,224 @@
+//
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+#pragma once
+
+#include "td/telegram/PollManager.h"
+#include "td/telegram/Version.h"
+
+#include "td/utils/algorithm.h"
+#include "td/utils/common.h"
+#include "td/utils/tl_helpers.h"
+
+namespace td {
+
+template <class StorerT>
+void PollManager::PollOption::store(StorerT &storer) const {
+ using ::td::store;
+ BEGIN_STORE_FLAGS();
+ STORE_FLAG(is_chosen);
+ END_STORE_FLAGS();
+
+ store(text, storer);
+ store(data, storer);
+ store(voter_count, storer);
+}
+
+template <class ParserT>
+void PollManager::PollOption::parse(ParserT &parser) {
+ using ::td::parse;
+ BEGIN_PARSE_FLAGS();
+ PARSE_FLAG(is_chosen);
+ END_PARSE_FLAGS();
+
+ parse(text, parser);
+ parse(data, parser);
+ parse(voter_count, parser);
+}
+
+template <class StorerT>
+void PollManager::Poll::store(StorerT &storer) const {
+ using ::td::store;
+ bool is_public = !is_anonymous;
+ bool has_recent_voters = !recent_voter_user_ids.empty();
+ bool has_open_period = open_period != 0;
+ bool has_close_date = close_date != 0;
+ bool has_explanation = !explanation.text.empty();
+ BEGIN_STORE_FLAGS();
+ STORE_FLAG(is_closed);
+ STORE_FLAG(is_public);
+ STORE_FLAG(allow_multiple_answers);
+ STORE_FLAG(is_quiz);
+ STORE_FLAG(has_recent_voters);
+ STORE_FLAG(has_open_period);
+ STORE_FLAG(has_close_date);
+ STORE_FLAG(has_explanation);
+ STORE_FLAG(is_updated_after_close);
+ END_STORE_FLAGS();
+
+ store(question, storer);
+ store(options, storer);
+ store(total_voter_count, storer);
+ if (is_quiz) {
+ store(correct_option_id, storer);
+ }
+ if (has_recent_voters) {
+ store(recent_voter_user_ids, storer);
+ }
+ if (has_open_period) {
+ store(open_period, storer);
+ }
+ if (has_close_date) {
+ store(close_date, storer);
+ }
+ if (has_explanation) {
+ store(explanation, storer);
+ }
+}
+
+template <class ParserT>
+void PollManager::Poll::parse(ParserT &parser) {
+ using ::td::parse;
+ bool is_public;
+ bool has_recent_voters;
+ bool has_open_period;
+ bool has_close_date;
+ bool has_explanation;
+ BEGIN_PARSE_FLAGS();
+ PARSE_FLAG(is_closed);
+ PARSE_FLAG(is_public);
+ PARSE_FLAG(allow_multiple_answers);
+ PARSE_FLAG(is_quiz);
+ PARSE_FLAG(has_recent_voters);
+ PARSE_FLAG(has_open_period);
+ PARSE_FLAG(has_close_date);
+ PARSE_FLAG(has_explanation);
+ PARSE_FLAG(is_updated_after_close);
+ END_PARSE_FLAGS();
+ is_anonymous = !is_public;
+
+ parse(question, parser);
+ parse(options, parser);
+ parse(total_voter_count, parser);
+ if (is_quiz) {
+ parse(correct_option_id, parser);
+ if (correct_option_id < -1 || correct_option_id >= static_cast<int32>(options.size())) {
+ parser.set_error("Wrong correct_option_id");
+ }
+ }
+ if (has_recent_voters) {
+ parse(recent_voter_user_ids, parser);
+ }
+ if (has_open_period) {
+ parse(open_period, parser);
+ }
+ if (has_close_date) {
+ parse(close_date, parser);
+ }
+ if (has_explanation) {
+ parse(explanation, parser);
+ }
+}
+
+template <class StorerT>
+void PollManager::store_poll(PollId poll_id, StorerT &storer) const {
+ td::store(poll_id.get(), storer);
+ if (is_local_poll_id(poll_id)) {
+ auto poll = get_poll(poll_id);
+ CHECK(poll != nullptr);
+ bool has_open_period = poll->open_period != 0;
+ bool has_close_date = poll->close_date != 0;
+ bool has_explanation = !poll->explanation.text.empty();
+ BEGIN_STORE_FLAGS();
+ STORE_FLAG(poll->is_closed);
+ STORE_FLAG(poll->is_anonymous);
+ STORE_FLAG(poll->allow_multiple_answers);
+ STORE_FLAG(poll->is_quiz);
+ STORE_FLAG(has_open_period);
+ STORE_FLAG(has_close_date);
+ STORE_FLAG(has_explanation);
+ END_STORE_FLAGS();
+ store(poll->question, storer);
+ vector<string> options = transform(poll->options, [](const PollOption &option) { return option.text; });
+ store(options, storer);
+ if (poll->is_quiz) {
+ store(poll->correct_option_id, storer);
+ }
+ if (has_open_period) {
+ store(poll->open_period, storer);
+ }
+ if (has_close_date) {
+ store(poll->close_date, storer);
+ }
+ if (has_explanation) {
+ store(poll->explanation, storer);
+ }
+ }
+}
+
+template <class ParserT>
+PollId PollManager::parse_poll(ParserT &parser) {
+ int64 poll_id_int;
+ td::parse(poll_id_int, parser);
+ PollId poll_id(poll_id_int);
+ if (is_local_poll_id(poll_id)) {
+ string question;
+ vector<string> options;
+ FormattedText explanation;
+ int32 open_period = 0;
+ int32 close_date = 0;
+ bool is_closed = false;
+ bool is_anonymous = true;
+ bool allow_multiple_answers = false;
+ bool is_quiz = false;
+ bool has_open_period = false;
+ bool has_close_date = false;
+ bool has_explanation = false;
+ int32 correct_option_id = -1;
+
+ if (parser.version() >= static_cast<int32>(Version::SupportPolls2_0)) {
+ BEGIN_PARSE_FLAGS();
+ PARSE_FLAG(is_closed);
+ PARSE_FLAG(is_anonymous);
+ PARSE_FLAG(allow_multiple_answers);
+ PARSE_FLAG(is_quiz);
+ PARSE_FLAG(has_open_period);
+ PARSE_FLAG(has_close_date);
+ PARSE_FLAG(has_explanation);
+ END_PARSE_FLAGS();
+ }
+ parse(question, parser);
+ parse(options, parser);
+ if (is_quiz) {
+ parse(correct_option_id, parser);
+ if (correct_option_id < -1 || correct_option_id >= static_cast<int32>(options.size())) {
+ parser.set_error("Wrong correct_option_id");
+ }
+ }
+ if (has_open_period) {
+ parse(open_period, parser);
+ }
+ if (has_close_date) {
+ parse(close_date, parser);
+ }
+ if (has_explanation) {
+ parse(explanation, parser);
+ }
+ if (parser.get_error() != nullptr) {
+ return PollId();
+ }
+ return create_poll(std::move(question), std::move(options), is_anonymous, allow_multiple_answers, is_quiz,
+ correct_option_id, std::move(explanation), open_period, close_date, is_closed);
+ }
+
+ auto poll = get_poll_force(poll_id);
+ if (poll == nullptr) {
+ return PollId();
+ }
+ return poll_id;
+}
+
+} // namespace td