1use serde::{Deserialize, Serialize};
2
3use crate::message::MaybeInaccessibleMessage;
4
5use crate::chat::{Chat, Location, Venue};
6use crate::file::{Animation, Audio, Document, LivePhoto, PhotoSize, Video};
7use crate::message::MessageEntity;
8use crate::sticker::Sticker;
9use crate::user::User;
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
15pub struct PollMedia {
16 #[serde(skip_serializing_if = "Option::is_none")]
18 pub animation: Option<Animation>,
19 #[serde(skip_serializing_if = "Option::is_none")]
21 pub audio: Option<Audio>,
22 #[serde(skip_serializing_if = "Option::is_none")]
24 pub document: Option<Document>,
25 #[serde(skip_serializing_if = "Option::is_none")]
27 pub live_photo: Option<LivePhoto>,
28 #[serde(skip_serializing_if = "Option::is_none")]
30 pub location: Option<Location>,
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub photo: Option<Vec<PhotoSize>>,
34 #[serde(skip_serializing_if = "Option::is_none")]
36 pub sticker: Option<Sticker>,
37 #[serde(skip_serializing_if = "Option::is_none")]
39 pub venue: Option<Venue>,
40 #[serde(skip_serializing_if = "Option::is_none")]
42 pub video: Option<Video>,
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub link: Option<crate::chat::Link>,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize)]
50#[serde(tag = "type", rename_all = "snake_case")]
51pub enum InputPollMedia {
52 Animation(crate::file::InputMediaAnimation),
54 Audio(crate::file::InputMediaAudio),
56 Document(crate::file::InputMediaDocument),
58 LivePhoto(crate::file::InputMediaLivePhoto),
60 Location(crate::file::InputMediaLocation),
62 Photo(crate::file::InputMediaPhoto),
64 Venue(crate::file::InputMediaVenue),
66 Video(crate::file::InputMediaVideo),
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize)]
72#[serde(tag = "type", rename_all = "snake_case")]
73pub enum InputPollOptionMedia {
74 Animation(crate::file::InputMediaAnimation),
76 LivePhoto(crate::file::InputMediaLivePhoto),
78 Link(crate::chat::InputMediaLink),
80 Location(crate::file::InputMediaLocation),
82 Photo(crate::file::InputMediaPhoto),
84 Sticker(crate::file::InputMediaSticker),
86 Venue(crate::file::InputMediaVenue),
88 Video(crate::file::InputMediaVideo),
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize)]
98pub struct Poll {
99 pub id: String,
101 pub question: String,
103 #[serde(skip_serializing_if = "Option::is_none")]
105 pub question_entities: Option<Vec<MessageEntity>>,
106 pub options: Vec<PollOption>,
108 pub total_voter_count: u32,
110 pub is_closed: bool,
112 pub is_anonymous: bool,
114 #[serde(rename = "type")]
116 pub kind: PollType,
117 pub allows_multiple_answers: bool,
119 pub allows_revoting: bool,
121 #[serde(skip_serializing_if = "Option::is_none")]
126 pub correct_option_ids: Option<Vec<u8>>,
127 #[serde(skip_serializing_if = "Option::is_none")]
129 pub explanation: Option<String>,
130 #[serde(skip_serializing_if = "Option::is_none")]
132 pub explanation_entities: Option<Vec<MessageEntity>>,
133 #[serde(skip_serializing_if = "Option::is_none")]
135 pub open_period: Option<u32>,
136 #[serde(skip_serializing_if = "Option::is_none")]
138 pub close_date: Option<i64>,
139 #[serde(skip_serializing_if = "Option::is_none")]
141 pub description: Option<String>,
142 #[serde(skip_serializing_if = "Option::is_none")]
144 pub description_entities: Option<Vec<MessageEntity>>,
145 #[serde(skip_serializing_if = "Option::is_none")]
147 pub media: Option<PollMedia>,
148 #[serde(skip_serializing_if = "Option::is_none")]
150 pub explanation_media: Option<PollMedia>,
151 #[serde(skip_serializing_if = "Option::is_none")]
153 pub members_only: Option<bool>,
154 #[serde(skip_serializing_if = "Option::is_none")]
157 pub country_codes: Option<Vec<String>>,
158}
159
160#[derive(Debug, Clone, Serialize, Deserialize)]
162pub struct PollOption {
163 pub persistent_id: String,
165 pub text: String,
167 #[serde(skip_serializing_if = "Option::is_none")]
169 pub text_entities: Option<Vec<MessageEntity>>,
170 pub voter_count: u32,
172 #[serde(skip_serializing_if = "Option::is_none")]
174 pub added_by_user: Option<User>,
175 #[serde(skip_serializing_if = "Option::is_none")]
177 pub added_by_chat: Option<Chat>,
178 #[serde(skip_serializing_if = "Option::is_none")]
180 pub addition_date: Option<i64>,
181 #[serde(skip_serializing_if = "Option::is_none")]
183 pub media: Option<PollMedia>,
184}
185
186#[derive(Debug, Clone, Serialize, Deserialize)]
188pub struct InputPollOption {
189 pub text: String,
191 #[serde(skip_serializing_if = "Option::is_none")]
193 pub text_parse_mode: Option<crate::message::ParseMode>,
194 #[serde(skip_serializing_if = "Option::is_none")]
196 pub text_entities: Option<Vec<MessageEntity>>,
197 #[serde(skip_serializing_if = "Option::is_none")]
199 pub media: Option<InputPollOptionMedia>,
200}
201
202impl InputPollOption {
203 pub fn new(text: impl Into<String>) -> Self {
205 Self {
206 text: text.into(),
207 text_parse_mode: None,
208 text_entities: None,
209 media: None,
210 }
211 }
212}
213
214#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
216#[serde(rename_all = "snake_case")]
217pub enum PollType {
218 Regular,
220 Quiz,
222}
223
224#[derive(Debug, Clone, Serialize, Deserialize)]
226pub struct PollAnswer {
227 pub poll_id: String,
229 #[serde(skip_serializing_if = "Option::is_none")]
231 pub voter_chat: Option<Chat>,
232 #[serde(skip_serializing_if = "Option::is_none")]
234 pub user: Option<User>,
235 pub option_ids: Vec<u8>,
237 pub option_persistent_ids: Vec<String>,
239}
240
241#[derive(Debug, Clone, Serialize, Deserialize)]
243pub struct PollOptionAdded {
244 #[serde(skip_serializing_if = "Option::is_none")]
248 pub poll_message: Option<MaybeInaccessibleMessage>,
249 pub option_persistent_id: String,
251 pub option_text: String,
253 #[serde(skip_serializing_if = "Option::is_none")]
255 pub option_text_entities: Option<Vec<MessageEntity>>,
256}
257
258#[derive(Debug, Clone, Serialize, Deserialize)]
260pub struct PollOptionDeleted {
261 #[serde(skip_serializing_if = "Option::is_none")]
265 pub poll_message: Option<MaybeInaccessibleMessage>,
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}