1use serde::{Deserialize, Serialize};
2
3use crate::chat::ChatJoinRequest;
4use crate::inline::{ChosenInlineResult, InlineQuery};
5use crate::message::Message;
6use crate::payments::{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(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}
75
76impl Update {
77 #[must_use]
79 pub fn chat_id(&self) -> Option<i64> {
80 match &self.kind {
81 UpdateKind::Message(m)
82 | UpdateKind::EditedMessage(m)
83 | UpdateKind::ChannelPost(m)
84 | UpdateKind::EditedChannelPost(m)
85 | UpdateKind::BusinessMessage(m)
86 | UpdateKind::EditedBusinessMessage(m) => Some(m.chat.id),
87 UpdateKind::CallbackQuery(q) => q.message.as_ref().map(|m| m.chat.id),
88 _ => None,
89 }
90 }
91
92 #[must_use]
94 pub fn from(&self) -> Option<&User> {
95 match &self.kind {
96 UpdateKind::Message(m)
97 | UpdateKind::EditedMessage(m)
98 | UpdateKind::ChannelPost(m)
99 | UpdateKind::EditedChannelPost(m)
100 | UpdateKind::BusinessMessage(m)
101 | UpdateKind::EditedBusinessMessage(m) => m.from.as_ref(),
102 UpdateKind::CallbackQuery(q) => Some(&q.from),
103 UpdateKind::InlineQuery(q) => Some(&q.from),
104 UpdateKind::ShippingQuery(q) => Some(&q.from),
105 UpdateKind::PreCheckoutQuery(q) => Some(&q.from),
106 UpdateKind::PollAnswer(a) => a.user.as_ref(),
107 _ => None,
108 }
109 }
110}
111
112#[derive(Debug, Clone, Serialize, Deserialize)]
114pub struct CallbackQuery {
115 pub id: String,
117 pub from: User,
119 #[serde(skip_serializing_if = "Option::is_none")]
121 pub message: Option<Message>,
122 #[serde(skip_serializing_if = "Option::is_none")]
124 pub inline_message_id: Option<String>,
125 pub chat_instance: String,
127 #[serde(skip_serializing_if = "Option::is_none")]
129 pub data: Option<String>,
130 #[serde(skip_serializing_if = "Option::is_none")]
132 pub game_short_name: Option<String>,
133}
134
135#[derive(Debug, Clone, Serialize, Deserialize)]
137pub struct ChatMemberUpdated {
138 pub chat: crate::chat::Chat,
140 pub from: User,
142 pub date: i64,
144 pub old_chat_member: crate::chat_member::ChatMember,
146 pub new_chat_member: crate::chat_member::ChatMember,
148 #[serde(skip_serializing_if = "Option::is_none")]
150 pub invite_link: Option<crate::chat::ChatInviteLink>,
151 #[serde(skip_serializing_if = "Option::is_none")]
153 pub via_join_request: Option<bool>,
154 #[serde(skip_serializing_if = "Option::is_none")]
156 pub via_chat_folder_invite_link: Option<bool>,
157}
158
159#[derive(Debug, Clone, Serialize, Deserialize)]
161pub struct MessageReactionUpdated {
162 pub chat: crate::chat::Chat,
164 pub message_id: i64,
166 #[serde(skip_serializing_if = "Option::is_none")]
168 pub user: Option<User>,
169 #[serde(skip_serializing_if = "Option::is_none")]
171 pub actor_chat: Option<crate::chat::Chat>,
172 pub date: i64,
174 pub old_reaction: Vec<crate::message::ReactionType>,
176 pub new_reaction: Vec<crate::message::ReactionType>,
178}
179
180#[derive(Debug, Clone, Serialize, Deserialize)]
182pub struct MessageReactionCountUpdated {
183 pub chat: crate::chat::Chat,
185 pub message_id: i64,
187 pub date: i64,
189 pub reactions: Vec<ReactionCount>,
191}
192
193#[derive(Debug, Clone, Serialize, Deserialize)]
195pub struct ReactionCount {
196 #[serde(rename = "type")]
198 pub kind: crate::message::ReactionType,
199 pub total_count: u32,
201}
202
203#[derive(Debug, Clone, Serialize, Deserialize)]
205pub struct ChatBoostUpdated {
206 pub chat: crate::chat::Chat,
208 pub boost: ChatBoost,
210}
211
212#[derive(Debug, Clone, Serialize, Deserialize)]
214pub struct ChatBoost {
215 pub boost_id: String,
217 pub add_date: i64,
219 pub expiration_date: i64,
221 pub source: serde_json::Value,
223}
224
225#[derive(Debug, Clone, Serialize, Deserialize)]
227pub struct ChatBoostRemoved {
228 pub chat: crate::chat::Chat,
230 pub boost_id: String,
232 pub remove_date: i64,
234 pub source: serde_json::Value,
236}
237
238#[derive(Debug, Clone, Serialize, Deserialize)]
240pub struct ManagedBotUpdated {
241 pub user: User,
243 pub bot: User,
245}
246
247#[derive(Debug, Clone, Default, Serialize, Deserialize)]
251pub struct BusinessBotRights {
252 #[serde(skip_serializing_if = "Option::is_none")]
255 pub can_reply: Option<bool>,
256 #[serde(skip_serializing_if = "Option::is_none")]
258 pub can_read_messages: Option<bool>,
259 #[serde(skip_serializing_if = "Option::is_none")]
261 pub can_delete_sent_messages: Option<bool>,
262 #[serde(skip_serializing_if = "Option::is_none")]
264 pub can_delete_all_messages: Option<bool>,
265 #[serde(skip_serializing_if = "Option::is_none")]
267 pub can_edit_name: Option<bool>,
268 #[serde(skip_serializing_if = "Option::is_none")]
270 pub can_edit_bio: Option<bool>,
271 #[serde(skip_serializing_if = "Option::is_none")]
273 pub can_edit_profile_photo: Option<bool>,
274 #[serde(skip_serializing_if = "Option::is_none")]
276 pub can_edit_username: Option<bool>,
277 #[serde(skip_serializing_if = "Option::is_none")]
279 pub can_change_gift_settings: Option<bool>,
280 #[serde(skip_serializing_if = "Option::is_none")]
282 pub can_view_gifts_and_stars: Option<bool>,
283 #[serde(skip_serializing_if = "Option::is_none")]
285 pub can_convert_gifts_to_stars: Option<bool>,
286 #[serde(skip_serializing_if = "Option::is_none")]
288 pub can_transfer_and_upgrade_gifts: Option<bool>,
289 #[serde(skip_serializing_if = "Option::is_none")]
291 pub can_transfer_stars: Option<bool>,
292 #[serde(skip_serializing_if = "Option::is_none")]
294 pub can_manage_stories: Option<bool>,
295}
296
297#[derive(Debug, Clone, Serialize, Deserialize)]
299pub struct BusinessConnection {
300 pub id: String,
302 pub user: User,
304 pub user_chat_id: i64,
306 pub date: i64,
308 pub is_enabled: bool,
310 #[serde(skip_serializing_if = "Option::is_none")]
312 pub rights: Option<BusinessBotRights>,
313}
314
315#[derive(Debug, Clone, Serialize, Deserialize)]
319pub struct UserChatBoosts {
320 pub boosts: Vec<ChatBoost>,
322}
323
324#[derive(Debug, Clone, Serialize, Deserialize)]
326pub struct BusinessMessagesDeleted {
327 pub business_connection_id: String,
329 pub chat: crate::chat::Chat,
331 pub message_ids: Vec<i64>,
333}
334
335#[derive(Debug, Clone, Serialize, Deserialize)]
337pub struct PaidMediaPurchased {
338 pub from: User,
340 pub paid_media_payload: String,
342}
343
344#[derive(Debug, Clone, Serialize, Deserialize)]
346pub struct Updates {
347 pub ok: bool,
349 pub result: Vec<Update>,
351}