1use serde::{Deserialize, Serialize};
2
3use crate::chat::ChatJoinRequest;
4use crate::inline::{ChosenInlineResult, InlineQuery};
5use crate::message::Message;
6use crate::payments::{BotSubscriptionUpdated, PreCheckoutQuery, ShippingQuery};
7use crate::poll::{Poll, PollAnswer};
8use crate::user::User;
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct Update {
15 pub update_id: i64,
17 #[serde(flatten)]
19 pub kind: UpdateKind,
20}
21
22#[derive(Debug, Clone, Serialize, Deserialize)]
24#[serde(rename_all = "snake_case")]
25pub enum UpdateKind {
26 Message(Message),
28 EditedMessage(Message),
30 ChannelPost(Message),
32 EditedChannelPost(Message),
34 BusinessMessage(Message),
36 EditedBusinessMessage(Message),
38 InlineQuery(InlineQuery),
40 ChosenInlineResult(ChosenInlineResult),
42 CallbackQuery(Box<CallbackQuery>),
44 ShippingQuery(ShippingQuery),
46 PreCheckoutQuery(PreCheckoutQuery),
48 Poll(Poll),
50 PollAnswer(PollAnswer),
52 MyChatMember(ChatMemberUpdated),
54 ChatMember(ChatMemberUpdated),
56 ChatJoinRequest(ChatJoinRequest),
58 MessageReaction(MessageReactionUpdated),
60 MessageReactionCount(MessageReactionCountUpdated),
62 ChatBoost(ChatBoostUpdated),
64 RemovedChatBoost(ChatBoostRemoved),
66 ManagedBot(ManagedBotUpdated),
68 BusinessConnection(BusinessConnection),
70 DeletedBusinessMessages(BusinessMessagesDeleted),
72 PurchasedPaidMedia(PaidMediaPurchased),
74 GuestMessage(Message),
76 Subscription(BotSubscriptionUpdated),
78}
79
80impl Update {
81 #[must_use]
83 pub fn chat_id(&self) -> Option<i64> {
84 match &self.kind {
85 UpdateKind::Message(m)
86 | UpdateKind::EditedMessage(m)
87 | UpdateKind::ChannelPost(m)
88 | UpdateKind::EditedChannelPost(m)
89 | UpdateKind::BusinessMessage(m)
90 | UpdateKind::EditedBusinessMessage(m)
91 | UpdateKind::GuestMessage(m) => Some(m.chat.id),
92 UpdateKind::CallbackQuery(q) => q.message.as_ref().map(|m| m.chat.id),
93 _ => None,
94 }
95 }
96
97 #[must_use]
99 pub fn from(&self) -> Option<&User> {
100 match &self.kind {
101 UpdateKind::Message(m)
102 | UpdateKind::EditedMessage(m)
103 | UpdateKind::ChannelPost(m)
104 | UpdateKind::EditedChannelPost(m)
105 | UpdateKind::BusinessMessage(m)
106 | UpdateKind::EditedBusinessMessage(m)
107 | UpdateKind::GuestMessage(m) => m.from.as_ref(),
108 UpdateKind::CallbackQuery(q) => Some(&q.from),
109 UpdateKind::InlineQuery(q) => Some(&q.from),
110 UpdateKind::ShippingQuery(q) => Some(&q.from),
111 UpdateKind::PreCheckoutQuery(q) => Some(&q.from),
112 UpdateKind::PollAnswer(a) => a.user.as_ref(),
113 UpdateKind::Subscription(s) => Some(&s.user),
114 _ => None,
115 }
116 }
117}
118
119#[derive(Debug, Clone, Serialize, Deserialize)]
121pub struct CallbackQuery {
122 pub id: String,
124 pub from: User,
126 #[serde(skip_serializing_if = "Option::is_none")]
128 pub message: Option<Message>,
129 #[serde(skip_serializing_if = "Option::is_none")]
131 pub inline_message_id: Option<String>,
132 pub chat_instance: String,
134 #[serde(skip_serializing_if = "Option::is_none")]
136 pub data: Option<String>,
137 #[serde(skip_serializing_if = "Option::is_none")]
139 pub game_short_name: Option<String>,
140}
141
142#[derive(Debug, Clone, Serialize, Deserialize)]
144pub struct ChatMemberUpdated {
145 pub chat: crate::chat::Chat,
147 pub from: User,
149 pub date: i64,
151 pub old_chat_member: crate::chat_member::ChatMember,
153 pub new_chat_member: crate::chat_member::ChatMember,
155 #[serde(skip_serializing_if = "Option::is_none")]
157 pub invite_link: Option<crate::chat::ChatInviteLink>,
158 #[serde(skip_serializing_if = "Option::is_none")]
160 pub via_join_request: Option<bool>,
161 #[serde(skip_serializing_if = "Option::is_none")]
163 pub via_chat_folder_invite_link: Option<bool>,
164}
165
166#[derive(Debug, Clone, Serialize, Deserialize)]
168pub struct MessageReactionUpdated {
169 pub chat: crate::chat::Chat,
171 pub message_id: i64,
173 #[serde(skip_serializing_if = "Option::is_none")]
175 pub user: Option<User>,
176 #[serde(skip_serializing_if = "Option::is_none")]
178 pub actor_chat: Option<crate::chat::Chat>,
179 pub date: i64,
181 pub old_reaction: Vec<crate::message::ReactionType>,
183 pub new_reaction: Vec<crate::message::ReactionType>,
185}
186
187#[derive(Debug, Clone, Serialize, Deserialize)]
189pub struct MessageReactionCountUpdated {
190 pub chat: crate::chat::Chat,
192 pub message_id: i64,
194 pub date: i64,
196 pub reactions: Vec<ReactionCount>,
198}
199
200#[derive(Debug, Clone, Serialize, Deserialize)]
202pub struct ReactionCount {
203 #[serde(rename = "type")]
205 pub kind: crate::message::ReactionType,
206 pub total_count: u32,
208}
209
210#[derive(Debug, Clone, Serialize, Deserialize)]
212pub struct ChatBoostUpdated {
213 pub chat: crate::chat::Chat,
215 pub boost: ChatBoost,
217}
218
219#[derive(Debug, Clone, Serialize, Deserialize)]
221pub struct ChatBoost {
222 pub boost_id: String,
224 pub add_date: i64,
226 pub expiration_date: i64,
228 pub source: serde_json::Value,
230}
231
232#[derive(Debug, Clone, Serialize, Deserialize)]
234pub struct ChatBoostRemoved {
235 pub chat: crate::chat::Chat,
237 pub boost_id: String,
239 pub remove_date: i64,
241 pub source: serde_json::Value,
243}
244
245#[derive(Debug, Clone, Serialize, Deserialize)]
247pub struct ManagedBotUpdated {
248 pub user: User,
250 pub bot: User,
252}
253
254#[derive(Debug, Clone, Default, Serialize, Deserialize)]
258pub struct BusinessBotRights {
259 #[serde(skip_serializing_if = "Option::is_none")]
262 pub can_reply: Option<bool>,
263 #[serde(skip_serializing_if = "Option::is_none")]
265 pub can_read_messages: Option<bool>,
266 #[serde(skip_serializing_if = "Option::is_none")]
268 pub can_delete_sent_messages: Option<bool>,
269 #[serde(skip_serializing_if = "Option::is_none")]
271 pub can_delete_all_messages: Option<bool>,
272 #[serde(skip_serializing_if = "Option::is_none")]
274 pub can_edit_name: Option<bool>,
275 #[serde(skip_serializing_if = "Option::is_none")]
277 pub can_edit_bio: Option<bool>,
278 #[serde(skip_serializing_if = "Option::is_none")]
280 pub can_edit_profile_photo: Option<bool>,
281 #[serde(skip_serializing_if = "Option::is_none")]
283 pub can_edit_username: Option<bool>,
284 #[serde(skip_serializing_if = "Option::is_none")]
286 pub can_change_gift_settings: Option<bool>,
287 #[serde(skip_serializing_if = "Option::is_none")]
289 pub can_view_gifts_and_stars: Option<bool>,
290 #[serde(skip_serializing_if = "Option::is_none")]
292 pub can_convert_gifts_to_stars: Option<bool>,
293 #[serde(skip_serializing_if = "Option::is_none")]
295 pub can_transfer_and_upgrade_gifts: Option<bool>,
296 #[serde(skip_serializing_if = "Option::is_none")]
298 pub can_transfer_stars: Option<bool>,
299 #[serde(skip_serializing_if = "Option::is_none")]
301 pub can_manage_stories: Option<bool>,
302}
303
304#[derive(Debug, Clone, Serialize, Deserialize)]
306pub struct BusinessConnection {
307 pub id: String,
309 pub user: User,
311 pub user_chat_id: i64,
313 pub date: i64,
315 pub is_enabled: bool,
317 #[serde(skip_serializing_if = "Option::is_none")]
319 pub rights: Option<BusinessBotRights>,
320}
321
322#[derive(Debug, Clone, Serialize, Deserialize)]
326pub struct UserChatBoosts {
327 pub boosts: Vec<ChatBoost>,
329}
330
331#[derive(Debug, Clone, Serialize, Deserialize)]
333pub struct BusinessMessagesDeleted {
334 pub business_connection_id: String,
336 pub chat: crate::chat::Chat,
338 pub message_ids: Vec<i64>,
340}
341
342#[derive(Debug, Clone, Serialize, Deserialize)]
344pub struct PaidMediaPurchased {
345 pub from: User,
347 pub paid_media_payload: String,
349}
350
351#[derive(Debug, Clone, Serialize, Deserialize)]
353pub struct Updates {
354 pub ok: bool,
356 pub result: Vec<Update>,
358}