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(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}
77
78impl Update {
79 #[must_use]
81 pub fn chat_id(&self) -> Option<i64> {
82 match &self.kind {
83 UpdateKind::Message(m)
84 | UpdateKind::EditedMessage(m)
85 | UpdateKind::ChannelPost(m)
86 | UpdateKind::EditedChannelPost(m)
87 | UpdateKind::BusinessMessage(m)
88 | UpdateKind::EditedBusinessMessage(m)
89 | UpdateKind::GuestMessage(m) => Some(m.chat.id),
90 UpdateKind::CallbackQuery(q) => q.message.as_ref().map(|m| m.chat.id),
91 _ => None,
92 }
93 }
94
95 #[must_use]
97 pub fn from(&self) -> Option<&User> {
98 match &self.kind {
99 UpdateKind::Message(m)
100 | UpdateKind::EditedMessage(m)
101 | UpdateKind::ChannelPost(m)
102 | UpdateKind::EditedChannelPost(m)
103 | UpdateKind::BusinessMessage(m)
104 | UpdateKind::EditedBusinessMessage(m)
105 | UpdateKind::GuestMessage(m) => m.from.as_ref(),
106 UpdateKind::CallbackQuery(q) => Some(&q.from),
107 UpdateKind::InlineQuery(q) => Some(&q.from),
108 UpdateKind::ShippingQuery(q) => Some(&q.from),
109 UpdateKind::PreCheckoutQuery(q) => Some(&q.from),
110 UpdateKind::PollAnswer(a) => a.user.as_ref(),
111 _ => None,
112 }
113 }
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize)]
118pub struct CallbackQuery {
119 pub id: String,
121 pub from: User,
123 #[serde(skip_serializing_if = "Option::is_none")]
125 pub message: Option<Message>,
126 #[serde(skip_serializing_if = "Option::is_none")]
128 pub inline_message_id: Option<String>,
129 pub chat_instance: String,
131 #[serde(skip_serializing_if = "Option::is_none")]
133 pub data: Option<String>,
134 #[serde(skip_serializing_if = "Option::is_none")]
136 pub game_short_name: Option<String>,
137}
138
139#[derive(Debug, Clone, Serialize, Deserialize)]
141pub struct ChatMemberUpdated {
142 pub chat: crate::chat::Chat,
144 pub from: User,
146 pub date: i64,
148 pub old_chat_member: crate::chat_member::ChatMember,
150 pub new_chat_member: crate::chat_member::ChatMember,
152 #[serde(skip_serializing_if = "Option::is_none")]
154 pub invite_link: Option<crate::chat::ChatInviteLink>,
155 #[serde(skip_serializing_if = "Option::is_none")]
157 pub via_join_request: Option<bool>,
158 #[serde(skip_serializing_if = "Option::is_none")]
160 pub via_chat_folder_invite_link: Option<bool>,
161}
162
163#[derive(Debug, Clone, Serialize, Deserialize)]
165pub struct MessageReactionUpdated {
166 pub chat: crate::chat::Chat,
168 pub message_id: i64,
170 #[serde(skip_serializing_if = "Option::is_none")]
172 pub user: Option<User>,
173 #[serde(skip_serializing_if = "Option::is_none")]
175 pub actor_chat: Option<crate::chat::Chat>,
176 pub date: i64,
178 pub old_reaction: Vec<crate::message::ReactionType>,
180 pub new_reaction: Vec<crate::message::ReactionType>,
182}
183
184#[derive(Debug, Clone, Serialize, Deserialize)]
186pub struct MessageReactionCountUpdated {
187 pub chat: crate::chat::Chat,
189 pub message_id: i64,
191 pub date: i64,
193 pub reactions: Vec<ReactionCount>,
195}
196
197#[derive(Debug, Clone, Serialize, Deserialize)]
199pub struct ReactionCount {
200 #[serde(rename = "type")]
202 pub kind: crate::message::ReactionType,
203 pub total_count: u32,
205}
206
207#[derive(Debug, Clone, Serialize, Deserialize)]
209pub struct ChatBoostUpdated {
210 pub chat: crate::chat::Chat,
212 pub boost: ChatBoost,
214}
215
216#[derive(Debug, Clone, Serialize, Deserialize)]
218pub struct ChatBoost {
219 pub boost_id: String,
221 pub add_date: i64,
223 pub expiration_date: i64,
225 pub source: serde_json::Value,
227}
228
229#[derive(Debug, Clone, Serialize, Deserialize)]
231pub struct ChatBoostRemoved {
232 pub chat: crate::chat::Chat,
234 pub boost_id: String,
236 pub remove_date: i64,
238 pub source: serde_json::Value,
240}
241
242#[derive(Debug, Clone, Serialize, Deserialize)]
244pub struct ManagedBotUpdated {
245 pub user: User,
247 pub bot: User,
249}
250
251#[derive(Debug, Clone, Default, Serialize, Deserialize)]
255pub struct BusinessBotRights {
256 #[serde(skip_serializing_if = "Option::is_none")]
259 pub can_reply: Option<bool>,
260 #[serde(skip_serializing_if = "Option::is_none")]
262 pub can_read_messages: Option<bool>,
263 #[serde(skip_serializing_if = "Option::is_none")]
265 pub can_delete_sent_messages: Option<bool>,
266 #[serde(skip_serializing_if = "Option::is_none")]
268 pub can_delete_all_messages: Option<bool>,
269 #[serde(skip_serializing_if = "Option::is_none")]
271 pub can_edit_name: Option<bool>,
272 #[serde(skip_serializing_if = "Option::is_none")]
274 pub can_edit_bio: Option<bool>,
275 #[serde(skip_serializing_if = "Option::is_none")]
277 pub can_edit_profile_photo: Option<bool>,
278 #[serde(skip_serializing_if = "Option::is_none")]
280 pub can_edit_username: Option<bool>,
281 #[serde(skip_serializing_if = "Option::is_none")]
283 pub can_change_gift_settings: Option<bool>,
284 #[serde(skip_serializing_if = "Option::is_none")]
286 pub can_view_gifts_and_stars: Option<bool>,
287 #[serde(skip_serializing_if = "Option::is_none")]
289 pub can_convert_gifts_to_stars: Option<bool>,
290 #[serde(skip_serializing_if = "Option::is_none")]
292 pub can_transfer_and_upgrade_gifts: Option<bool>,
293 #[serde(skip_serializing_if = "Option::is_none")]
295 pub can_transfer_stars: Option<bool>,
296 #[serde(skip_serializing_if = "Option::is_none")]
298 pub can_manage_stories: Option<bool>,
299}
300
301#[derive(Debug, Clone, Serialize, Deserialize)]
303pub struct BusinessConnection {
304 pub id: String,
306 pub user: User,
308 pub user_chat_id: i64,
310 pub date: i64,
312 pub is_enabled: bool,
314 #[serde(skip_serializing_if = "Option::is_none")]
316 pub rights: Option<BusinessBotRights>,
317}
318
319#[derive(Debug, Clone, Serialize, Deserialize)]
323pub struct UserChatBoosts {
324 pub boosts: Vec<ChatBoost>,
326}
327
328#[derive(Debug, Clone, Serialize, Deserialize)]
330pub struct BusinessMessagesDeleted {
331 pub business_connection_id: String,
333 pub chat: crate::chat::Chat,
335 pub message_ids: Vec<i64>,
337}
338
339#[derive(Debug, Clone, Serialize, Deserialize)]
341pub struct PaidMediaPurchased {
342 pub from: User,
344 pub paid_media_payload: String,
346}
347
348#[derive(Debug, Clone, Serialize, Deserialize)]
350pub struct Updates {
351 pub ok: bool,
353 pub result: Vec<Update>,
355}