/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once #include "data/data_location.h" namespace Data { class Session; } // namespace Data namespace Main { class Session; } // namespace Main class PeerData; class PhotoData; class DocumentData; struct PollMedia { PhotoData *photo = nullptr; DocumentData *document = nullptr; std::optional geo; explicit operator bool() const { return photo || document || geo; } }; inline bool operator==(const PollMedia &a, const PollMedia &b) { return (a.photo == b.photo) && (a.document == b.document) && (a.geo == b.geo); } inline bool operator!=(const PollMedia &a, const PollMedia &b) { return !(a == b); } struct PollAnswer { TextWithEntities text; QByteArray option; PollMedia media; std::vector> recentVoters; PeerData *addedBy = nullptr; TimeId addedDate = 0; int votes = 0; bool chosen = false; bool correct = false; }; inline bool operator==(const PollAnswer &a, const PollAnswer &b) { return (a.text == b.text) && (a.option == b.option); } inline bool operator!=(const PollAnswer &a, const PollAnswer &b) { return !(a == b); } struct PollData { PollData(not_null owner, PollId id); [[nodiscard]] Data::Session &owner() const; [[nodiscard]] Main::Session &session() const; enum class Flag { Closed = 0x001, PublicVotes = 0x002, MultiChoice = 0x004, Quiz = 0x008, ShuffleAnswers = 0x010, RevotingDisabled = 0x020, OpenAnswers = 0x040, HideResultsUntilClose = 0x080, Creator = 0x100, }; friend inline constexpr bool is_flag_type(Flag) { return true; }; using Flags = base::flags; bool closeByTimer(); bool applyChanges(const MTPDpoll &poll); bool applyResults(const MTPPollResults &results); [[nodiscard]] bool checkResultsReload(crl::time now); [[nodiscard]] PollAnswer *answerByOption(const QByteArray &option); [[nodiscard]] const PollAnswer *answerByOption( const QByteArray &option) const; void setFlags(Flags flags); [[nodiscard]] Flags flags() const; [[nodiscard]] bool voted() const; [[nodiscard]] bool closed() const; [[nodiscard]] bool publicVotes() const; [[nodiscard]] bool multiChoice() const; [[nodiscard]] bool quiz() const; [[nodiscard]] bool shuffleAnswers() const; [[nodiscard]] bool revotingDisabled() const; [[nodiscard]] bool openAnswers() const; [[nodiscard]] bool hideResultsUntilClose() const; [[nodiscard]] bool creator() const; [[nodiscard]] QString debugString() const; PollId id = 0; TextWithEntities question; std::vector answers; std::vector> recentVoters; std::vector sendingVotes; TextWithEntities solution; PollMedia attachedMedia; PollMedia solutionMedia; TimeId closePeriod = 0; TimeId closeDate = 0; int totalVoters = 0; int version = 0; uint64 hash = 0; static constexpr auto kMaxOptions = 32; private: bool applyResultToAnswers( const MTPPollAnswerVoters &result, bool isMinResults); const not_null _owner; Flags _flags = Flags(); crl::time _lastResultsUpdate = 0; // < 0 means force reload. }; inline constexpr auto kDefaultPollCreateFlags = PollData::Flag::PublicVotes | PollData::Flag::MultiChoice | PollData::Flag::OpenAnswers | PollData::Flag::ShuffleAnswers; [[nodiscard]] QByteArray PollOptionFromLink(const QString &value); [[nodiscard]] QString PollOptionToLink(const QByteArray &option); [[nodiscard]] MTPPoll PollDataToMTP( not_null poll, bool close = false); [[nodiscard]] MTPInputMedia PollDataToInputMedia( not_null poll, bool close = false); [[nodiscard]] MTPInputMedia PollMediaToMTP(const PollMedia &media); [[nodiscard]] PollMedia PollMediaFromMTP( not_null owner, const MTPMessageMedia &media); [[nodiscard]] PollMedia PollMediaFromInputMTP( not_null owner, const MTPInputMedia &media);