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: ChatBoostSource,
230}
231
232#[derive(Debug, Clone, Serialize, Deserialize)]
234#[serde(tag = "source", rename_all = "snake_case")]
235pub enum ChatBoostSource {
236 Premium(ChatBoostSourcePremium),
238 GiftCode(ChatBoostSourceGiftCode),
240 Giveaway(ChatBoostSourceGiveaway),
242}
243
244#[derive(Debug, Clone, Serialize, Deserialize)]
246#[non_exhaustive]
247pub struct ChatBoostSourcePremium {
248 pub user: User,
250}
251
252#[derive(Debug, Clone, Serialize, Deserialize)]
254#[non_exhaustive]
255pub struct ChatBoostSourceGiftCode {
256 pub user: User,
258}
259
260#[derive(Debug, Clone, Serialize, Deserialize)]
262#[non_exhaustive]
263pub struct ChatBoostSourceGiveaway {
264 pub giveaway_message_id: i64,
266 #[serde(skip_serializing_if = "Option::is_none")]
268 pub user: Option<User>,
269 #[serde(skip_serializing_if = "Option::is_none")]
271 pub prize_star_count: Option<i64>,
272 #[serde(skip_serializing_if = "Option::is_none")]
274 pub is_unclaimed: Option<bool>,
275}
276
277#[derive(Debug, Clone, Default, Serialize, Deserialize)]
279#[non_exhaustive]
280pub struct ChatBoostAdded {
281 pub boost_count: u32,
283}
284
285#[derive(Debug, Clone, Serialize, Deserialize)]
287pub struct ChatBoostRemoved {
288 pub chat: crate::chat::Chat,
290 pub boost_id: String,
292 pub remove_date: i64,
294 pub source: ChatBoostSource,
296}
297
298#[derive(Debug, Clone, Serialize, Deserialize)]
300pub struct ManagedBotUpdated {
301 pub user: User,
303 pub bot: User,
305}
306
307#[derive(Debug, Clone, Default, Serialize, Deserialize)]
311pub struct BusinessBotRights {
312 #[serde(skip_serializing_if = "Option::is_none")]
315 pub can_reply: Option<bool>,
316 #[serde(skip_serializing_if = "Option::is_none")]
318 pub can_read_messages: Option<bool>,
319 #[serde(skip_serializing_if = "Option::is_none")]
321 pub can_delete_sent_messages: Option<bool>,
322 #[serde(skip_serializing_if = "Option::is_none")]
324 pub can_delete_all_messages: Option<bool>,
325 #[serde(skip_serializing_if = "Option::is_none")]
327 pub can_edit_name: Option<bool>,
328 #[serde(skip_serializing_if = "Option::is_none")]
330 pub can_edit_bio: Option<bool>,
331 #[serde(skip_serializing_if = "Option::is_none")]
333 pub can_edit_profile_photo: Option<bool>,
334 #[serde(skip_serializing_if = "Option::is_none")]
336 pub can_edit_username: Option<bool>,
337 #[serde(skip_serializing_if = "Option::is_none")]
339 pub can_change_gift_settings: Option<bool>,
340 #[serde(skip_serializing_if = "Option::is_none")]
342 pub can_view_gifts_and_stars: Option<bool>,
343 #[serde(skip_serializing_if = "Option::is_none")]
345 pub can_convert_gifts_to_stars: Option<bool>,
346 #[serde(skip_serializing_if = "Option::is_none")]
348 pub can_transfer_and_upgrade_gifts: Option<bool>,
349 #[serde(skip_serializing_if = "Option::is_none")]
351 pub can_transfer_stars: Option<bool>,
352 #[serde(skip_serializing_if = "Option::is_none")]
354 pub can_manage_stories: Option<bool>,
355}
356
357#[derive(Debug, Clone, Serialize, Deserialize)]
359pub struct BusinessConnection {
360 pub id: String,
362 pub user: User,
364 pub user_chat_id: i64,
366 pub date: i64,
368 pub is_enabled: bool,
370 #[serde(skip_serializing_if = "Option::is_none")]
372 pub rights: Option<BusinessBotRights>,
373}
374
375#[derive(Debug, Clone, Serialize, Deserialize)]
379pub struct UserChatBoosts {
380 pub boosts: Vec<ChatBoost>,
382}
383
384#[derive(Debug, Clone, Serialize, Deserialize)]
386pub struct BusinessMessagesDeleted {
387 pub business_connection_id: String,
389 pub chat: crate::chat::Chat,
391 pub message_ids: Vec<i64>,
393}
394
395#[derive(Debug, Clone, Serialize, Deserialize)]
397pub struct PaidMediaPurchased {
398 pub from: User,
400 pub paid_media_payload: String,
402}