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 #[serde(skip_serializing_if = "Option::is_none")]
43 pub link: Option<crate::chat::Link>,
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize)]
48#[serde(tag = "type", rename_all = "snake_case")]
49pub enum InputPollMedia {
50 Animation(crate::file::InputMediaAnimation),
52 Audio(crate::file::InputMediaAudio),
54 Document(crate::file::InputMediaDocument),
56 LivePhoto(crate::file::InputMediaLivePhoto),
58 Location(crate::file::InputMediaLocation),
60 Photo(crate::file::InputMediaPhoto),
62 Venue(crate::file::InputMediaVenue),
64 Video(crate::file::InputMediaVideo),
66}
67
68#[derive(Debug, Clone, Serialize, Deserialize)]
70#[serde(tag = "type", rename_all = "snake_case")]
71pub enum InputPollOptionMedia {
72 Animation(crate::file::InputMediaAnimation),
74 LivePhoto(crate::file::InputMediaLivePhoto),
76 Link(crate::chat::InputMediaLink),
78 Location(crate::file::InputMediaLocation),
80 Photo(crate::file::InputMediaPhoto),
82 Sticker(crate::file::InputMediaSticker),
84 Venue(crate::file::InputMediaVenue),
86 Video(crate::file::InputMediaVideo),
88}
89
90#[derive(Debug, Clone, Serialize, Deserialize)]
96pub struct Poll {
97 pub id: String,
99 pub question: String,
101 #[serde(skip_serializing_if = "Option::is_none")]
103 pub question_entities: Option<Vec<MessageEntity>>,
104 pub options: Vec<PollOption>,
106 pub total_voter_count: u32,
108 pub is_closed: bool,
110 pub is_anonymous: bool,
112 #[serde(rename = "type")]
114 pub kind: PollType,
115 pub allows_multiple_answers: bool,
117 pub allows_revoting: bool,
119 #[serde(skip_serializing_if = "Option::is_none")]
124 pub correct_option_ids: Option<Vec<u8>>,
125 #[serde(skip_serializing_if = "Option::is_none")]
127 pub explanation: Option<String>,
128 #[serde(skip_serializing_if = "Option::is_none")]
130 pub explanation_entities: Option<Vec<MessageEntity>>,
131 #[serde(skip_serializing_if = "Option::is_none")]
133 pub open_period: Option<u32>,
134 #[serde(skip_serializing_if = "Option::is_none")]
136 pub close_date: Option<i64>,
137 #[serde(skip_serializing_if = "Option::is_none")]
139 pub description: Option<String>,
140 #[serde(skip_serializing_if = "Option::is_none")]
142 pub description_entities: Option<Vec<MessageEntity>>,
143 #[serde(skip_serializing_if = "Option::is_none")]
145 pub media: Option<PollMedia>,
146 #[serde(skip_serializing_if = "Option::is_none")]
148 pub explanation_media: Option<PollMedia>,
149 #[serde(skip_serializing_if = "Option::is_none")]
151 pub members_only: Option<bool>,
152 #[serde(skip_serializing_if = "Option::is_none")]
155 pub country_codes: Option<Vec<String>>,
156}
157
158#[derive(Debug, Clone, Serialize, Deserialize)]
160pub struct PollOption {
161 pub persistent_id: String,
163 pub text: String,
165 #[serde(skip_serializing_if = "Option::is_none")]
167 pub text_entities: Option<Vec<MessageEntity>>,
168 pub voter_count: u32,
170 #[serde(skip_serializing_if = "Option::is_none")]
172 pub added_by_user: Option<User>,
173 #[serde(skip_serializing_if = "Option::is_none")]
175 pub added_by_chat: Option<Chat>,
176 #[serde(skip_serializing_if = "Option::is_none")]
178 pub addition_date: Option<i64>,
179 #[serde(skip_serializing_if = "Option::is_none")]
181 pub media: Option<PollMedia>,
182}
183
184#[derive(Debug, Clone, Serialize, Deserialize)]
186pub struct InputPollOption {
187 pub text: String,
189 #[serde(skip_serializing_if = "Option::is_none")]
191 pub text_parse_mode: Option<crate::message::ParseMode>,
192 #[serde(skip_serializing_if = "Option::is_none")]
194 pub text_entities: Option<Vec<MessageEntity>>,
195 #[serde(skip_serializing_if = "Option::is_none")]
197 pub media: Option<InputPollOptionMedia>,
198}
199
200impl InputPollOption {
201 pub fn new(text: impl Into<String>) -> Self {
203 Self {
204 text: text.into(),
205 text_parse_mode: None,
206 text_entities: None,
207 media: None,
208 }
209 }
210}
211
212#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
214#[serde(rename_all = "snake_case")]
215pub enum PollType {
216 Regular,
218 Quiz,
220}
221
222#[derive(Debug, Clone, Serialize, Deserialize)]
224pub struct PollAnswer {
225 pub poll_id: String,
227 #[serde(skip_serializing_if = "Option::is_none")]
229 pub voter_chat: Option<Chat>,
230 #[serde(skip_serializing_if = "Option::is_none")]
232 pub user: Option<User>,
233 pub option_ids: Vec<u8>,
235 pub option_persistent_ids: Vec<String>,
237}
238
239#[derive(Debug, Clone, Serialize, Deserialize)]
241pub struct PollOptionAdded {
242 #[serde(skip_serializing_if = "Option::is_none")]
247 pub poll_message: Option<serde_json::Value>,
248 pub option_persistent_id: String,
250 pub option_text: String,
252 #[serde(skip_serializing_if = "Option::is_none")]
254 pub option_text_entities: Option<Vec<MessageEntity>>,
255}
256
257#[derive(Debug, Clone, Serialize, Deserialize)]
259pub struct PollOptionDeleted {
260 #[serde(skip_serializing_if = "Option::is_none")]
265 pub poll_message: Option<serde_json::Value>,
266 pub option_persistent_id: String,
268 pub option_text: String,
270 #[serde(skip_serializing_if = "Option::is_none")]
272 pub option_text_entities: Option<Vec<MessageEntity>>,
273}