1use serde::{Deserialize, Serialize};
2
3use crate::chat::{Chat, Location, Venue};
4use crate::file::{Animation, Audio, Document, LivePhoto, PhotoSize, Video};
5use crate::message::MessageEntity;
6use crate::sticker::Sticker;
7use crate::user::User;
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
13pub struct PollMedia {
14 #[serde(skip_serializing_if = "Option::is_none")]
16 pub animation: Option<Animation>,
17 #[serde(skip_serializing_if = "Option::is_none")]
19 pub audio: Option<Audio>,
20 #[serde(skip_serializing_if = "Option::is_none")]
22 pub document: Option<Document>,
23 #[serde(skip_serializing_if = "Option::is_none")]
25 pub live_photo: Option<LivePhoto>,
26 #[serde(skip_serializing_if = "Option::is_none")]
28 pub location: Option<Location>,
29 #[serde(skip_serializing_if = "Option::is_none")]
31 pub photo: Option<Vec<PhotoSize>>,
32 #[serde(skip_serializing_if = "Option::is_none")]
34 pub sticker: Option<Sticker>,
35 #[serde(skip_serializing_if = "Option::is_none")]
37 pub venue: Option<Venue>,
38 #[serde(skip_serializing_if = "Option::is_none")]
40 pub video: Option<Video>,
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize)]
45#[serde(tag = "type", rename_all = "snake_case")]
46pub enum InputPollMedia {
47 Animation(crate::file::InputMediaAnimation),
49 Audio(crate::file::InputMediaAudio),
51 Document(crate::file::InputMediaDocument),
53 LivePhoto(crate::file::InputMediaLivePhoto),
55 Location(crate::file::InputMediaLocation),
57 Photo(crate::file::InputMediaPhoto),
59 Venue(crate::file::InputMediaVenue),
61 Video(crate::file::InputMediaVideo),
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize)]
67#[serde(tag = "type", rename_all = "snake_case")]
68pub enum InputPollOptionMedia {
69 Animation(crate::file::InputMediaAnimation),
71 LivePhoto(crate::file::InputMediaLivePhoto),
73 Location(crate::file::InputMediaLocation),
75 Photo(crate::file::InputMediaPhoto),
77 Sticker(crate::file::InputMediaSticker),
79 Venue(crate::file::InputMediaVenue),
81 Video(crate::file::InputMediaVideo),
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize)]
91pub struct Poll {
92 pub id: String,
94 pub question: String,
96 #[serde(skip_serializing_if = "Option::is_none")]
98 pub question_entities: Option<Vec<MessageEntity>>,
99 pub options: Vec<PollOption>,
101 pub total_voter_count: u32,
103 pub is_closed: bool,
105 pub is_anonymous: bool,
107 #[serde(rename = "type")]
109 pub kind: PollType,
110 pub allows_multiple_answers: bool,
112 pub allows_revoting: bool,
114 #[serde(skip_serializing_if = "Option::is_none")]
119 pub correct_option_ids: Option<Vec<u8>>,
120 #[serde(skip_serializing_if = "Option::is_none")]
122 pub explanation: Option<String>,
123 #[serde(skip_serializing_if = "Option::is_none")]
125 pub explanation_entities: Option<Vec<MessageEntity>>,
126 #[serde(skip_serializing_if = "Option::is_none")]
128 pub open_period: Option<u32>,
129 #[serde(skip_serializing_if = "Option::is_none")]
131 pub close_date: Option<i64>,
132 #[serde(skip_serializing_if = "Option::is_none")]
134 pub description: Option<String>,
135 #[serde(skip_serializing_if = "Option::is_none")]
137 pub description_entities: Option<Vec<MessageEntity>>,
138 #[serde(skip_serializing_if = "Option::is_none")]
140 pub media: Option<PollMedia>,
141 #[serde(skip_serializing_if = "Option::is_none")]
143 pub explanation_media: Option<PollMedia>,
144 #[serde(skip_serializing_if = "Option::is_none")]
146 pub members_only: Option<bool>,
147 #[serde(skip_serializing_if = "Option::is_none")]
150 pub country_codes: Option<Vec<String>>,
151}
152
153#[derive(Debug, Clone, Serialize, Deserialize)]
155pub struct PollOption {
156 pub persistent_id: String,
158 pub text: String,
160 #[serde(skip_serializing_if = "Option::is_none")]
162 pub text_entities: Option<Vec<MessageEntity>>,
163 pub voter_count: u32,
165 #[serde(skip_serializing_if = "Option::is_none")]
167 pub added_by_user: Option<User>,
168 #[serde(skip_serializing_if = "Option::is_none")]
170 pub added_by_chat: Option<Chat>,
171 #[serde(skip_serializing_if = "Option::is_none")]
173 pub addition_date: Option<i64>,
174 #[serde(skip_serializing_if = "Option::is_none")]
176 pub media: Option<PollMedia>,
177}
178
179#[derive(Debug, Clone, Serialize, Deserialize)]
181pub struct InputPollOption {
182 pub text: String,
184 #[serde(skip_serializing_if = "Option::is_none")]
186 pub text_parse_mode: Option<crate::message::ParseMode>,
187 #[serde(skip_serializing_if = "Option::is_none")]
189 pub text_entities: Option<Vec<MessageEntity>>,
190 #[serde(skip_serializing_if = "Option::is_none")]
192 pub media: Option<InputPollOptionMedia>,
193}
194
195impl InputPollOption {
196 pub fn new(text: impl Into<String>) -> Self {
198 Self {
199 text: text.into(),
200 text_parse_mode: None,
201 text_entities: None,
202 media: None,
203 }
204 }
205}
206
207#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
209#[serde(rename_all = "snake_case")]
210pub enum PollType {
211 Regular,
213 Quiz,
215}
216
217#[derive(Debug, Clone, Serialize, Deserialize)]
219pub struct PollAnswer {
220 pub poll_id: String,
222 #[serde(skip_serializing_if = "Option::is_none")]
224 pub voter_chat: Option<Chat>,
225 #[serde(skip_serializing_if = "Option::is_none")]
227 pub user: Option<User>,
228 pub option_ids: Vec<u8>,
230 pub option_persistent_ids: Vec<String>,
232}
233
234#[derive(Debug, Clone, Serialize, Deserialize)]
236pub struct PollOptionAdded {
237 #[serde(skip_serializing_if = "Option::is_none")]
242 pub poll_message: Option<serde_json::Value>,
243 pub option_persistent_id: String,
245 pub option_text: String,
247 #[serde(skip_serializing_if = "Option::is_none")]
249 pub option_text_entities: Option<Vec<MessageEntity>>,
250}
251
252#[derive(Debug, Clone, Serialize, Deserialize)]
254pub struct PollOptionDeleted {
255 #[serde(skip_serializing_if = "Option::is_none")]
260 pub poll_message: Option<serde_json::Value>,
261 pub option_persistent_id: String,
263 pub option_text: String,
265 #[serde(skip_serializing_if = "Option::is_none")]
267 pub option_text_entities: Option<Vec<MessageEntity>>,
268}