1use serde::{Deserialize, Serialize};
5use serde_json::Value;
6use std::collections::HashMap;
7
8#[derive(Deserialize, Serialize, Debug, Clone)]
10pub struct Update {
11 pub update_id: i64,
13 #[serde(skip_serializing_if = "Option::is_none")]
15 pub message: Option<Message>,
16 #[serde(skip_serializing_if = "Option::is_none")]
18 pub edited_message: Option<Message>,
19 #[serde(skip_serializing_if = "Option::is_none")]
21 pub channel_post: Option<Message>,
22 #[serde(skip_serializing_if = "Option::is_none")]
24 pub edited_channel_post: Option<Message>,
25 #[serde(skip_serializing_if = "Option::is_none")]
27 pub inline_query: Option<InlineQuery>,
28 #[serde(skip_serializing_if = "Option::is_none")]
30 pub chosen_inline_result: Option<ChosenInlineResult>,
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub callback_query: Option<CallbackQuery>,
34 #[serde(skip_serializing_if = "Option::is_none")]
36 pub shipping_query: Option<ShippingQuery>,
37 #[serde(skip_serializing_if = "Option::is_none")]
39 pub pre_checkout_query: Option<PreCheckoutQuery>,
40 #[serde(skip_serializing_if = "Option::is_none")]
42 pub poll: Option<Poll>,
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub poll_answer: Option<PollAnswer>,
46 #[serde(skip_serializing_if = "Option::is_none")]
48 pub my_chat_member: Option<ChatMemberUpdated>,
49 #[serde(skip_serializing_if = "Option::is_none")]
51 pub chat_member: Option<ChatMemberUpdated>,
52 #[serde(skip_serializing_if = "Option::is_none")]
54 pub chat_join_request: Option<ChatJoinRequest>,
55}
56impl Update {
57 pub fn new(update_id: i64) -> Self {
58 Self {
59 update_id,
60 message: None,
61 edited_message: None,
62 channel_post: None,
63 edited_channel_post: None,
64 inline_query: None,
65 chosen_inline_result: None,
66 callback_query: None,
67 shipping_query: None,
68 pre_checkout_query: None,
69 poll: None,
70 poll_answer: None,
71 my_chat_member: None,
72 chat_member: None,
73 chat_join_request: None,
74 }
75 }
76}
77
78#[derive(Deserialize, Serialize, Debug, Clone)]
80pub struct WebhookInfo {
81 pub url: String,
83 pub has_custom_certificate: bool,
85 pub pending_update_count: i64,
87 #[serde(skip_serializing_if = "Option::is_none")]
89 pub ip_address: Option<String>,
90 #[serde(skip_serializing_if = "Option::is_none")]
92 pub last_error_date: Option<i64>,
93 #[serde(skip_serializing_if = "Option::is_none")]
95 pub last_error_message: Option<String>,
96 #[serde(skip_serializing_if = "Option::is_none")]
98 pub last_synchronization_error_date: Option<i64>,
99 #[serde(skip_serializing_if = "Option::is_none")]
101 pub max_connections: Option<i64>,
102 #[serde(skip_serializing_if = "Option::is_none")]
104 pub allowed_updates: Option<Vec<String>>,
105}
106impl WebhookInfo {
107 pub fn new(url: String, has_custom_certificate: bool, pending_update_count: i64) -> Self {
108 Self {
109 url,
110 has_custom_certificate,
111 pending_update_count,
112 ip_address: None,
113 last_error_date: None,
114 last_error_message: None,
115 last_synchronization_error_date: None,
116 max_connections: None,
117 allowed_updates: None,
118 }
119 }
120}
121
122#[derive(Deserialize, Serialize, Debug, Clone)]
124pub struct User {
125 pub id: i64,
127 pub is_bot: bool,
129 pub first_name: String,
131 #[serde(skip_serializing_if = "Option::is_none")]
133 pub last_name: Option<String>,
134 #[serde(skip_serializing_if = "Option::is_none")]
136 pub username: Option<String>,
137 #[serde(skip_serializing_if = "Option::is_none")]
139 pub language_code: Option<String>,
140 #[serde(skip_serializing_if = "Option::is_none")]
142 pub is_premium: Option<bool>,
143 #[serde(skip_serializing_if = "Option::is_none")]
145 pub added_to_attachment_menu: Option<bool>,
146 #[serde(skip_serializing_if = "Option::is_none")]
148 pub can_join_groups: Option<bool>,
149 #[serde(skip_serializing_if = "Option::is_none")]
151 pub can_read_all_group_messages: Option<bool>,
152 #[serde(skip_serializing_if = "Option::is_none")]
154 pub supports_inline_queries: Option<bool>,
155}
156impl User {
157 pub fn new(id: i64, is_bot: bool, first_name: String) -> Self {
158 Self {
159 id,
160 is_bot,
161 first_name,
162 last_name: None,
163 username: None,
164 language_code: None,
165 is_premium: None,
166 added_to_attachment_menu: None,
167 can_join_groups: None,
168 can_read_all_group_messages: None,
169 supports_inline_queries: None,
170 }
171 }
172}
173
174#[derive(Deserialize, Serialize, Debug, Clone)]
176pub enum ChatType {
177 #[serde(rename = "private")]
178 Private,
179 #[serde(rename = "group")]
180 Group,
181 #[serde(rename = "supergroup")]
182 Supergroup,
183 #[serde(rename = "channel")]
184 Channel,
185}
186
187#[derive(Deserialize, Serialize, Debug, Clone)]
189pub struct Chat {
190 pub id: i64,
192 #[serde(rename = "type")]
194 type_name: ChatType,
195 #[serde(skip_serializing_if = "Option::is_none")]
197 pub title: Option<String>,
198 #[serde(skip_serializing_if = "Option::is_none")]
200 pub username: Option<String>,
201 #[serde(skip_serializing_if = "Option::is_none")]
203 pub first_name: Option<String>,
204 #[serde(skip_serializing_if = "Option::is_none")]
206 pub last_name: Option<String>,
207 #[serde(skip_serializing_if = "Option::is_none")]
209 pub photo: Option<ChatPhoto>,
210 #[serde(skip_serializing_if = "Option::is_none")]
212 pub bio: Option<String>,
213 #[serde(skip_serializing_if = "Option::is_none")]
215 pub has_private_forwards: Option<bool>,
216 #[serde(skip_serializing_if = "Option::is_none")]
218 pub has_restricted_voice_and_video_messages: Option<bool>,
219 #[serde(skip_serializing_if = "Option::is_none")]
221 pub join_to_send_messages: Option<bool>,
222 #[serde(skip_serializing_if = "Option::is_none")]
224 pub join_by_request: Option<bool>,
225 #[serde(skip_serializing_if = "Option::is_none")]
227 pub description: Option<String>,
228 #[serde(skip_serializing_if = "Option::is_none")]
230 pub invite_link: Option<String>,
231 #[serde(skip_serializing_if = "Option::is_none")]
233 pub pinned_message: Option<Message>,
234 #[serde(skip_serializing_if = "Option::is_none")]
236 pub permissions: Option<ChatPermissions>,
237 #[serde(skip_serializing_if = "Option::is_none")]
239 pub slow_mode_delay: Option<i64>,
240 #[serde(skip_serializing_if = "Option::is_none")]
242 pub message_auto_delete_time: Option<i64>,
243 #[serde(skip_serializing_if = "Option::is_none")]
245 pub has_protected_content: Option<bool>,
246 #[serde(skip_serializing_if = "Option::is_none")]
248 pub sticker_set_name: Option<String>,
249 #[serde(skip_serializing_if = "Option::is_none")]
251 pub can_set_sticker_set: Option<bool>,
252 #[serde(skip_serializing_if = "Option::is_none")]
254 pub linked_chat_id: Option<i64>,
255 #[serde(skip_serializing_if = "Option::is_none")]
257 pub location: Option<ChatLocation>,
258}
259impl Chat {
260 pub fn new(id: i64, type_name: ChatType) -> Self {
261 Self {
262 id,
263 type_name,
264 title: None,
265 username: None,
266 first_name: None,
267 last_name: None,
268 photo: None,
269 bio: None,
270 has_private_forwards: None,
271 has_restricted_voice_and_video_messages: None,
272 join_to_send_messages: None,
273 join_by_request: None,
274 description: None,
275 invite_link: None,
276 pinned_message: None,
277 permissions: None,
278 slow_mode_delay: None,
279 message_auto_delete_time: None,
280 has_protected_content: None,
281 sticker_set_name: None,
282 can_set_sticker_set: None,
283 linked_chat_id: None,
284 location: None,
285 }
286 }
287}
288
289#[derive(Deserialize, Serialize, Debug, Clone)]
291pub struct Message {
292 pub message_id: i64,
294 #[serde(skip_serializing_if = "Option::is_none")]
296 pub from: Option<User>,
297 #[serde(skip_serializing_if = "Option::is_none")]
299 pub sender_chat: Option<Box<Chat>>,
300 pub date: i64,
302 pub chat: Box<Chat>,
304 #[serde(skip_serializing_if = "Option::is_none")]
306 pub forward_from: Option<User>,
307 #[serde(skip_serializing_if = "Option::is_none")]
309 pub forward_from_chat: Option<Box<Chat>>,
310 #[serde(skip_serializing_if = "Option::is_none")]
312 pub forward_from_message_id: Option<i64>,
313 #[serde(skip_serializing_if = "Option::is_none")]
315 pub forward_signature: Option<String>,
316 #[serde(skip_serializing_if = "Option::is_none")]
318 pub forward_sender_name: Option<String>,
319 #[serde(skip_serializing_if = "Option::is_none")]
321 pub forward_date: Option<i64>,
322 #[serde(skip_serializing_if = "Option::is_none")]
324 pub is_automatic_forward: Option<bool>,
325 #[serde(skip_serializing_if = "Option::is_none")]
327 pub reply_to_message: Option<Box<Message>>,
328 #[serde(skip_serializing_if = "Option::is_none")]
330 pub via_bot: Option<User>,
331 #[serde(skip_serializing_if = "Option::is_none")]
333 pub edit_date: Option<i64>,
334 #[serde(skip_serializing_if = "Option::is_none")]
336 pub has_protected_content: Option<bool>,
337 #[serde(skip_serializing_if = "Option::is_none")]
339 pub media_group_id: Option<String>,
340 #[serde(skip_serializing_if = "Option::is_none")]
342 pub author_signature: Option<String>,
343 #[serde(skip_serializing_if = "Option::is_none")]
345 pub text: Option<String>,
346 #[serde(skip_serializing_if = "Option::is_none")]
348 pub entities: Option<Vec<MessageEntity>>,
349 #[serde(skip_serializing_if = "Option::is_none")]
351 pub animation: Option<Animation>,
352 #[serde(skip_serializing_if = "Option::is_none")]
354 pub audio: Option<Audio>,
355 #[serde(skip_serializing_if = "Option::is_none")]
357 pub document: Option<Document>,
358 #[serde(skip_serializing_if = "Option::is_none")]
360 pub photo: Option<Vec<PhotoSize>>,
361 #[serde(skip_serializing_if = "Option::is_none")]
363 pub sticker: Option<Sticker>,
364 #[serde(skip_serializing_if = "Option::is_none")]
366 pub video: Option<Video>,
367 #[serde(skip_serializing_if = "Option::is_none")]
369 pub video_note: Option<VideoNote>,
370 #[serde(skip_serializing_if = "Option::is_none")]
372 pub voice: Option<Voice>,
373 #[serde(skip_serializing_if = "Option::is_none")]
375 pub caption: Option<String>,
376 #[serde(skip_serializing_if = "Option::is_none")]
378 pub caption_entities: Option<Vec<MessageEntity>>,
379 #[serde(skip_serializing_if = "Option::is_none")]
381 pub contact: Option<Contact>,
382 #[serde(skip_serializing_if = "Option::is_none")]
384 pub dice: Option<Dice>,
385 #[serde(skip_serializing_if = "Option::is_none")]
387 pub game: Option<Game>,
388 #[serde(skip_serializing_if = "Option::is_none")]
390 pub poll: Option<Poll>,
391 #[serde(skip_serializing_if = "Option::is_none")]
393 pub venue: Option<Venue>,
394 #[serde(skip_serializing_if = "Option::is_none")]
396 pub location: Option<Location>,
397 #[serde(skip_serializing_if = "Option::is_none")]
399 pub new_chat_members: Option<Vec<User>>,
400 #[serde(skip_serializing_if = "Option::is_none")]
402 pub left_chat_member: Option<User>,
403 #[serde(skip_serializing_if = "Option::is_none")]
405 pub new_chat_title: Option<String>,
406 #[serde(skip_serializing_if = "Option::is_none")]
408 pub new_chat_photo: Option<Vec<PhotoSize>>,
409 #[serde(skip_serializing_if = "Option::is_none")]
411 pub delete_chat_photo: Option<bool>,
412 #[serde(skip_serializing_if = "Option::is_none")]
414 pub group_chat_created: Option<bool>,
415 #[serde(skip_serializing_if = "Option::is_none")]
417 pub supergroup_chat_created: Option<bool>,
418 #[serde(skip_serializing_if = "Option::is_none")]
420 pub channel_chat_created: Option<bool>,
421 #[serde(skip_serializing_if = "Option::is_none")]
423 pub message_auto_delete_timer_changed: Option<MessageAutoDeleteTimerChanged>,
424 #[serde(skip_serializing_if = "Option::is_none")]
426 pub migrate_to_chat_id: Option<i64>,
427 #[serde(skip_serializing_if = "Option::is_none")]
429 pub migrate_from_chat_id: Option<i64>,
430 #[serde(skip_serializing_if = "Option::is_none")]
432 pub pinned_message: Option<Box<Message>>,
433 #[serde(skip_serializing_if = "Option::is_none")]
435 pub invoice: Option<Invoice>,
436 #[serde(skip_serializing_if = "Option::is_none")]
438 pub successful_payment: Option<SuccessfulPayment>,
439 #[serde(skip_serializing_if = "Option::is_none")]
441 pub connected_website: Option<String>,
442 #[serde(skip_serializing_if = "Option::is_none")]
444 pub passport_data: Option<PassportData>,
445 #[serde(skip_serializing_if = "Option::is_none")]
447 pub proximity_alert_triggered: Option<ProximityAlertTriggered>,
448 #[serde(skip_serializing_if = "Option::is_none")]
450 pub video_chat_scheduled: Option<VideoChatScheduled>,
451 #[serde(skip_serializing_if = "Option::is_none")]
453 pub video_chat_started: Option<VideoChatStarted>,
454 #[serde(skip_serializing_if = "Option::is_none")]
456 pub video_chat_ended: Option<VideoChatEnded>,
457 #[serde(skip_serializing_if = "Option::is_none")]
459 pub video_chat_participants_invited: Option<VideoChatParticipantsInvited>,
460 #[serde(skip_serializing_if = "Option::is_none")]
462 pub web_app_data: Option<WebAppData>,
463 #[serde(skip_serializing_if = "Option::is_none")]
465 pub reply_markup: Option<InlineKeyboardMarkup>,
466}
467impl Message {
468 pub fn new(message_id: i64, date: i64, chat: Box<Chat>) -> Self {
469 Self {
470 message_id,
471 from: None,
472 sender_chat: None,
473 date,
474 chat,
475 forward_from: None,
476 forward_from_chat: None,
477 forward_from_message_id: None,
478 forward_signature: None,
479 forward_sender_name: None,
480 forward_date: None,
481 is_automatic_forward: None,
482 reply_to_message: None,
483 via_bot: None,
484 edit_date: None,
485 has_protected_content: None,
486 media_group_id: None,
487 author_signature: None,
488 text: None,
489 entities: None,
490 animation: None,
491 audio: None,
492 document: None,
493 photo: None,
494 sticker: None,
495 video: None,
496 video_note: None,
497 voice: None,
498 caption: None,
499 caption_entities: None,
500 contact: None,
501 dice: None,
502 game: None,
503 poll: None,
504 venue: None,
505 location: None,
506 new_chat_members: None,
507 left_chat_member: None,
508 new_chat_title: None,
509 new_chat_photo: None,
510 delete_chat_photo: None,
511 group_chat_created: None,
512 supergroup_chat_created: None,
513 channel_chat_created: None,
514 message_auto_delete_timer_changed: None,
515 migrate_to_chat_id: None,
516 migrate_from_chat_id: None,
517 pinned_message: None,
518 invoice: None,
519 successful_payment: None,
520 connected_website: None,
521 passport_data: None,
522 proximity_alert_triggered: None,
523 video_chat_scheduled: None,
524 video_chat_started: None,
525 video_chat_ended: None,
526 video_chat_participants_invited: None,
527 web_app_data: None,
528 reply_markup: None,
529 }
530 }
531}
532
533#[derive(Deserialize, Serialize, Debug, Clone)]
535pub struct MessageId {
536 pub message_id: i64,
538}
539impl MessageId {
540 pub fn new(message_id: i64) -> Self {
541 Self { message_id }
542 }
543}
544
545#[derive(Deserialize, Serialize, Debug, Clone)]
547pub struct MessageEntity {
548 #[serde(rename = "type")]
550 pub type_name: String,
551 pub offset: i64,
553 pub length: i64,
555 #[serde(skip_serializing_if = "Option::is_none")]
557 pub url: Option<String>,
558 #[serde(skip_serializing_if = "Option::is_none")]
560 pub user: Option<User>,
561 #[serde(skip_serializing_if = "Option::is_none")]
563 pub language: Option<String>,
564 #[serde(skip_serializing_if = "Option::is_none")]
566 pub custom_emoji_id: Option<String>,
567}
568impl MessageEntity {
569 pub fn new(type_name: String, offset: i64, length: i64) -> Self {
570 Self {
571 type_name,
572 offset,
573 length,
574 url: None,
575 user: None,
576 language: None,
577 custom_emoji_id: None,
578 }
579 }
580}
581
582#[derive(Deserialize, Serialize, Debug, Clone)]
584pub struct PhotoSize {
585 pub file_id: String,
587 pub file_unique_id: String,
589 pub width: i64,
591 pub height: i64,
593 #[serde(skip_serializing_if = "Option::is_none")]
595 pub file_size: Option<i64>,
596}
597impl PhotoSize {
598 pub fn new(file_id: String, file_unique_id: String, width: i64, height: i64) -> Self {
599 Self {
600 file_id,
601 file_unique_id,
602 width,
603 height,
604 file_size: None,
605 }
606 }
607}
608
609#[derive(Deserialize, Serialize, Debug, Clone)]
611pub struct Animation {
612 pub file_id: String,
614 pub file_unique_id: String,
616 pub width: i64,
618 pub height: i64,
620 pub duration: i64,
622 #[serde(skip_serializing_if = "Option::is_none")]
624 pub thumb: Option<PhotoSize>,
625 #[serde(skip_serializing_if = "Option::is_none")]
627 pub file_name: Option<String>,
628 #[serde(skip_serializing_if = "Option::is_none")]
630 pub mime_type: Option<String>,
631 #[serde(skip_serializing_if = "Option::is_none")]
633 pub file_size: Option<i64>,
634}
635impl Animation {
636 pub fn new(
637 file_id: String,
638 file_unique_id: String,
639 width: i64,
640 height: i64,
641 duration: i64,
642 ) -> Self {
643 Self {
644 file_id,
645 file_unique_id,
646 width,
647 height,
648 duration,
649 thumb: None,
650 file_name: None,
651 mime_type: None,
652 file_size: None,
653 }
654 }
655}
656
657#[derive(Deserialize, Serialize, Debug, Clone)]
659pub struct Audio {
660 pub file_id: String,
662 pub file_unique_id: String,
664 pub duration: i64,
666 #[serde(skip_serializing_if = "Option::is_none")]
668 pub performer: Option<String>,
669 #[serde(skip_serializing_if = "Option::is_none")]
671 pub title: Option<String>,
672 #[serde(skip_serializing_if = "Option::is_none")]
674 pub file_name: Option<String>,
675 #[serde(skip_serializing_if = "Option::is_none")]
677 pub mime_type: Option<String>,
678 #[serde(skip_serializing_if = "Option::is_none")]
680 pub file_size: Option<i64>,
681 #[serde(skip_serializing_if = "Option::is_none")]
683 pub thumb: Option<PhotoSize>,
684}
685impl Audio {
686 pub fn new(file_id: String, file_unique_id: String, duration: i64) -> Self {
687 Self {
688 file_id,
689 file_unique_id,
690 duration,
691 performer: None,
692 title: None,
693 file_name: None,
694 mime_type: None,
695 file_size: None,
696 thumb: None,
697 }
698 }
699}
700
701#[derive(Deserialize, Serialize, Debug, Clone)]
703pub struct Document {
704 pub file_id: String,
706 pub file_unique_id: String,
708 #[serde(skip_serializing_if = "Option::is_none")]
710 pub thumb: Option<PhotoSize>,
711 #[serde(skip_serializing_if = "Option::is_none")]
713 pub file_name: Option<String>,
714 #[serde(skip_serializing_if = "Option::is_none")]
716 pub mime_type: Option<String>,
717 #[serde(skip_serializing_if = "Option::is_none")]
719 pub file_size: Option<i64>,
720}
721impl Document {
722 pub fn new(file_id: String, file_unique_id: String) -> Self {
723 Self {
724 file_id,
725 file_unique_id,
726 thumb: None,
727 file_name: None,
728 mime_type: None,
729 file_size: None,
730 }
731 }
732}
733
734#[derive(Deserialize, Serialize, Debug, Clone)]
736pub struct Video {
737 pub file_id: String,
739 pub file_unique_id: String,
741 pub width: i64,
743 pub height: i64,
745 pub duration: i64,
747 #[serde(skip_serializing_if = "Option::is_none")]
749 pub thumb: Option<PhotoSize>,
750 #[serde(skip_serializing_if = "Option::is_none")]
752 pub file_name: Option<String>,
753 #[serde(skip_serializing_if = "Option::is_none")]
755 pub mime_type: Option<String>,
756 #[serde(skip_serializing_if = "Option::is_none")]
758 pub file_size: Option<i64>,
759}
760impl Video {
761 pub fn new(
762 file_id: String,
763 file_unique_id: String,
764 width: i64,
765 height: i64,
766 duration: i64,
767 ) -> Self {
768 Self {
769 file_id,
770 file_unique_id,
771 width,
772 height,
773 duration,
774 thumb: None,
775 file_name: None,
776 mime_type: None,
777 file_size: None,
778 }
779 }
780}
781
782#[derive(Deserialize, Serialize, Debug, Clone)]
784pub struct VideoNote {
785 pub file_id: String,
787 pub file_unique_id: String,
789 pub length: i64,
791 pub duration: i64,
793 #[serde(skip_serializing_if = "Option::is_none")]
795 pub thumb: Option<PhotoSize>,
796 #[serde(skip_serializing_if = "Option::is_none")]
798 pub file_size: Option<i64>,
799}
800impl VideoNote {
801 pub fn new(file_id: String, file_unique_id: String, length: i64, duration: i64) -> Self {
802 Self {
803 file_id,
804 file_unique_id,
805 length,
806 duration,
807 thumb: None,
808 file_size: None,
809 }
810 }
811}
812
813#[derive(Deserialize, Serialize, Debug, Clone)]
815pub struct Voice {
816 pub file_id: String,
818 pub file_unique_id: String,
820 pub duration: i64,
822 #[serde(skip_serializing_if = "Option::is_none")]
824 pub mime_type: Option<String>,
825 #[serde(skip_serializing_if = "Option::is_none")]
827 pub file_size: Option<i64>,
828}
829impl Voice {
830 pub fn new(file_id: String, file_unique_id: String, duration: i64) -> Self {
831 Self {
832 file_id,
833 file_unique_id,
834 duration,
835 mime_type: None,
836 file_size: None,
837 }
838 }
839}
840
841#[derive(Deserialize, Serialize, Debug, Clone)]
843pub struct Contact {
844 pub phone_number: String,
846 pub first_name: String,
848 #[serde(skip_serializing_if = "Option::is_none")]
850 pub last_name: Option<String>,
851 #[serde(skip_serializing_if = "Option::is_none")]
853 pub user_id: Option<i64>,
854 #[serde(skip_serializing_if = "Option::is_none")]
856 pub vcard: Option<String>,
857}
858impl Contact {
859 pub fn new(phone_number: String, first_name: String) -> Self {
860 Self {
861 phone_number,
862 first_name,
863 last_name: None,
864 user_id: None,
865 vcard: None,
866 }
867 }
868}
869
870#[derive(Deserialize, Serialize, Debug, Clone)]
872pub struct Dice {
873 pub emoji: String,
875 pub value: i64,
877}
878impl Dice {
879 pub fn new(emoji: String, value: i64) -> Self {
880 Self { emoji, value }
881 }
882}
883
884#[derive(Deserialize, Serialize, Debug, Clone)]
886pub struct PollOption {
887 pub text: String,
889 pub voter_count: i64,
891}
892impl PollOption {
893 pub fn new(text: String, voter_count: i64) -> Self {
894 Self { text, voter_count }
895 }
896}
897
898#[derive(Deserialize, Serialize, Debug, Clone)]
900pub struct PollAnswer {
901 pub poll_id: String,
903 pub user: User,
905 pub option_ids: Vec<i64>,
907}
908impl PollAnswer {
909 pub fn new(poll_id: String, user: User, option_ids: Vec<i64>) -> Self {
910 Self {
911 poll_id,
912 user,
913 option_ids,
914 }
915 }
916}
917
918#[derive(Deserialize, Serialize, Debug, Clone)]
920pub struct Poll {
921 pub id: String,
923 pub question: String,
925 pub options: Vec<PollOption>,
927 pub total_voter_count: i64,
929 pub is_closed: bool,
931 pub is_anonymous: bool,
933 #[serde(rename = "type")]
935 pub type_name: String,
936 pub allows_multiple_answers: bool,
938 #[serde(skip_serializing_if = "Option::is_none")]
940 pub correct_option_id: Option<i64>,
941 #[serde(skip_serializing_if = "Option::is_none")]
943 pub explanation: Option<String>,
944 #[serde(skip_serializing_if = "Option::is_none")]
946 pub explanation_entities: Option<Vec<MessageEntity>>,
947 #[serde(skip_serializing_if = "Option::is_none")]
949 pub open_period: Option<i64>,
950 #[serde(skip_serializing_if = "Option::is_none")]
952 pub close_date: Option<i64>,
953}
954impl Poll {
955 pub fn new(
956 id: String,
957 question: String,
958 options: Vec<PollOption>,
959 total_voter_count: i64,
960 is_closed: bool,
961 is_anonymous: bool,
962 type_name: String,
963 allows_multiple_answers: bool,
964 ) -> Self {
965 Self {
966 id,
967 question,
968 options,
969 total_voter_count,
970 is_closed,
971 is_anonymous,
972 type_name,
973 allows_multiple_answers,
974 correct_option_id: None,
975 explanation: None,
976 explanation_entities: None,
977 open_period: None,
978 close_date: None,
979 }
980 }
981}
982
983#[derive(Deserialize, Serialize, Debug, Clone)]
985pub struct Location {
986 pub longitude: f64,
988 pub latitude: f64,
990 #[serde(skip_serializing_if = "Option::is_none")]
992 pub horizontal_accuracy: Option<f64>,
993 #[serde(skip_serializing_if = "Option::is_none")]
995 pub live_period: Option<i64>,
996 #[serde(skip_serializing_if = "Option::is_none")]
998 pub heading: Option<i64>,
999 #[serde(skip_serializing_if = "Option::is_none")]
1001 pub proximity_alert_radius: Option<i64>,
1002}
1003impl Location {
1004 pub fn new(longitude: f64, latitude: f64) -> Self {
1005 Self {
1006 longitude,
1007 latitude,
1008 horizontal_accuracy: None,
1009 live_period: None,
1010 heading: None,
1011 proximity_alert_radius: None,
1012 }
1013 }
1014}
1015
1016#[derive(Deserialize, Serialize, Debug, Clone)]
1018pub struct Venue {
1019 pub location: Location,
1021 pub title: String,
1023 pub address: String,
1025 #[serde(skip_serializing_if = "Option::is_none")]
1027 pub foursquare_id: Option<String>,
1028 #[serde(skip_serializing_if = "Option::is_none")]
1030 pub foursquare_type: Option<String>,
1031 #[serde(skip_serializing_if = "Option::is_none")]
1033 pub google_place_id: Option<String>,
1034 #[serde(skip_serializing_if = "Option::is_none")]
1036 pub google_place_type: Option<String>,
1037}
1038impl Venue {
1039 pub fn new(location: Location, title: String, address: String) -> Self {
1040 Self {
1041 location,
1042 title,
1043 address,
1044 foursquare_id: None,
1045 foursquare_type: None,
1046 google_place_id: None,
1047 google_place_type: None,
1048 }
1049 }
1050}
1051
1052#[derive(Deserialize, Serialize, Debug, Clone)]
1054pub struct WebAppData {
1055 pub data: String,
1057 pub button_text: String,
1059}
1060impl WebAppData {
1061 pub fn new(data: String, button_text: String) -> Self {
1062 Self { data, button_text }
1063 }
1064}
1065
1066#[derive(Deserialize, Serialize, Debug, Clone)]
1068pub struct ProximityAlertTriggered {
1069 pub traveler: User,
1071 pub watcher: User,
1073 pub distance: i64,
1075}
1076impl ProximityAlertTriggered {
1077 pub fn new(traveler: User, watcher: User, distance: i64) -> Self {
1078 Self {
1079 traveler,
1080 watcher,
1081 distance,
1082 }
1083 }
1084}
1085
1086#[derive(Deserialize, Serialize, Debug, Clone)]
1088pub struct MessageAutoDeleteTimerChanged {
1089 pub message_auto_delete_time: i64,
1091}
1092impl MessageAutoDeleteTimerChanged {
1093 pub fn new(message_auto_delete_time: i64) -> Self {
1094 Self {
1095 message_auto_delete_time,
1096 }
1097 }
1098}
1099
1100#[derive(Deserialize, Serialize, Debug, Clone)]
1102pub struct VideoChatScheduled {
1103 pub start_date: i64,
1105}
1106impl VideoChatScheduled {
1107 pub fn new(start_date: i64) -> Self {
1108 Self { start_date }
1109 }
1110}
1111
1112#[derive(Deserialize, Serialize, Debug, Clone)]
1114pub struct VideoChatStarted {}
1115impl VideoChatStarted {
1116 pub fn new() -> Self {
1117 Self {}
1118 }
1119}
1120
1121#[derive(Deserialize, Serialize, Debug, Clone)]
1123pub struct VideoChatEnded {
1124 pub duration: i64,
1126}
1127impl VideoChatEnded {
1128 pub fn new(duration: i64) -> Self {
1129 Self { duration }
1130 }
1131}
1132
1133#[derive(Deserialize, Serialize, Debug, Clone)]
1135pub struct VideoChatParticipantsInvited {
1136 pub users: Vec<User>,
1138}
1139impl VideoChatParticipantsInvited {
1140 pub fn new(users: Vec<User>) -> Self {
1141 Self { users }
1142 }
1143}
1144
1145#[derive(Deserialize, Serialize, Debug, Clone)]
1147pub struct UserProfilePhotos {
1148 pub total_count: i64,
1150 pub photos: Vec<Vec<PhotoSize>>,
1152}
1153impl UserProfilePhotos {
1154 pub fn new(total_count: i64, photos: Vec<Vec<PhotoSize>>) -> Self {
1155 Self {
1156 total_count,
1157 photos,
1158 }
1159 }
1160}
1161
1162#[derive(Deserialize, Serialize, Debug, Clone)]
1164pub struct File {
1165 pub file_id: String,
1167 pub file_unique_id: String,
1169 #[serde(skip_serializing_if = "Option::is_none")]
1171 pub file_size: Option<i64>,
1172 #[serde(skip_serializing_if = "Option::is_none")]
1174 pub file_path: Option<String>,
1175}
1176impl File {
1177 pub fn new(file_id: String, file_unique_id: String) -> Self {
1178 Self {
1179 file_id,
1180 file_unique_id,
1181 file_size: None,
1182 file_path: None,
1183 }
1184 }
1185}
1186
1187#[derive(Deserialize, Serialize, Debug, Clone)]
1189pub struct WebAppInfo {
1190 pub url: String,
1192}
1193impl WebAppInfo {
1194 pub fn new(url: String) -> Self {
1195 Self { url }
1196 }
1197}
1198
1199#[derive(Deserialize, Serialize, Debug, Clone)]
1201pub struct ReplyKeyboardMarkup {
1202 pub keyboard: Vec<Vec<KeyboardButton>>,
1204 #[serde(skip_serializing_if = "Option::is_none")]
1206 pub resize_keyboard: Option<bool>,
1207 #[serde(skip_serializing_if = "Option::is_none")]
1209 pub one_time_keyboard: Option<bool>,
1210 #[serde(skip_serializing_if = "Option::is_none")]
1212 pub input_field_placeholder: Option<String>,
1213 #[serde(skip_serializing_if = "Option::is_none")]
1215 pub selective: Option<bool>,
1216}
1217impl ReplyKeyboardMarkup {
1218 pub fn new(keyboard: Vec<Vec<KeyboardButton>>) -> Self {
1219 Self {
1220 keyboard,
1221 resize_keyboard: None,
1222 one_time_keyboard: None,
1223 input_field_placeholder: None,
1224 selective: None,
1225 }
1226 }
1227}
1228
1229#[derive(Deserialize, Serialize, Debug, Clone)]
1231pub struct KeyboardButton {
1232 pub text: String,
1234 #[serde(skip_serializing_if = "Option::is_none")]
1236 pub request_contact: Option<bool>,
1237 #[serde(skip_serializing_if = "Option::is_none")]
1239 pub request_location: Option<bool>,
1240 #[serde(skip_serializing_if = "Option::is_none")]
1242 pub request_poll: Option<KeyboardButtonPollType>,
1243 #[serde(skip_serializing_if = "Option::is_none")]
1245 pub web_app: Option<WebAppInfo>,
1246}
1247impl KeyboardButton {
1248 pub fn new(text: String) -> Self {
1249 Self {
1250 text,
1251 request_contact: None,
1252 request_location: None,
1253 request_poll: None,
1254 web_app: None,
1255 }
1256 }
1257}
1258
1259#[derive(Deserialize, Serialize, Debug, Clone)]
1261pub struct KeyboardButtonPollType {
1262 #[serde(skip_serializing_if = "Option::is_none", rename = "type")]
1264 pub type_name: Option<String>,
1265}
1266impl KeyboardButtonPollType {
1267 pub fn new() -> Self {
1268 Self { type_name: None }
1269 }
1270}
1271
1272#[derive(Deserialize, Serialize, Debug, Clone)]
1274pub struct ReplyKeyboardRemove {
1275 pub remove_keyboard: bool,
1277 #[serde(skip_serializing_if = "Option::is_none")]
1279 pub selective: Option<bool>,
1280}
1281impl ReplyKeyboardRemove {
1282 pub fn new(remove_keyboard: bool) -> Self {
1283 Self {
1284 remove_keyboard,
1285 selective: None,
1286 }
1287 }
1288}
1289
1290#[derive(Deserialize, Serialize, Debug, Clone)]
1292pub struct InlineKeyboardMarkup {
1293 pub inline_keyboard: Vec<Vec<InlineKeyboardButton>>,
1295}
1296impl InlineKeyboardMarkup {
1297 pub fn new(inline_keyboard: Vec<Vec<InlineKeyboardButton>>) -> Self {
1298 Self { inline_keyboard }
1299 }
1300}
1301
1302#[derive(Deserialize, Serialize, Debug, Clone)]
1304pub struct InlineKeyboardButton {
1305 pub text: String,
1307 #[serde(skip_serializing_if = "Option::is_none")]
1309 pub url: Option<String>,
1310 #[serde(skip_serializing_if = "Option::is_none")]
1312 pub callback_data: Option<String>,
1313 #[serde(skip_serializing_if = "Option::is_none")]
1315 pub web_app: Option<WebAppInfo>,
1316 #[serde(skip_serializing_if = "Option::is_none")]
1318 pub login_url: Option<LoginUrl>,
1319 #[serde(skip_serializing_if = "Option::is_none")]
1321 pub switch_inline_query: Option<String>,
1322 #[serde(skip_serializing_if = "Option::is_none")]
1324 pub switch_inline_query_current_chat: Option<String>,
1325 #[serde(skip_serializing_if = "Option::is_none")]
1327 pub callback_game: Option<CallbackGame>,
1328 #[serde(skip_serializing_if = "Option::is_none")]
1330 pub pay: Option<bool>,
1331}
1332impl InlineKeyboardButton {
1333 pub fn new(text: String) -> Self {
1334 Self {
1335 text,
1336 url: None,
1337 callback_data: None,
1338 web_app: None,
1339 login_url: None,
1340 switch_inline_query: None,
1341 switch_inline_query_current_chat: None,
1342 callback_game: None,
1343 pay: None,
1344 }
1345 }
1346}
1347
1348#[derive(Deserialize, Serialize, Debug, Clone)]
1350pub struct LoginUrl {
1351 pub url: String,
1353 #[serde(skip_serializing_if = "Option::is_none")]
1355 pub forward_text: Option<String>,
1356 #[serde(skip_serializing_if = "Option::is_none")]
1358 pub bot_username: Option<String>,
1359 #[serde(skip_serializing_if = "Option::is_none")]
1361 pub request_write_access: Option<bool>,
1362}
1363impl LoginUrl {
1364 pub fn new(url: String) -> Self {
1365 Self {
1366 url,
1367 forward_text: None,
1368 bot_username: None,
1369 request_write_access: None,
1370 }
1371 }
1372}
1373
1374#[derive(Deserialize, Serialize, Debug, Clone)]
1376pub struct CallbackQuery {
1377 pub id: String,
1379 pub from: User,
1381 #[serde(skip_serializing_if = "Option::is_none")]
1383 pub message: Option<Message>,
1384 #[serde(skip_serializing_if = "Option::is_none")]
1386 pub inline_message_id: Option<String>,
1387 pub chat_instance: String,
1389 #[serde(skip_serializing_if = "Option::is_none")]
1391 pub data: Option<String>,
1392 #[serde(skip_serializing_if = "Option::is_none")]
1394 pub game_short_name: Option<String>,
1395}
1396impl CallbackQuery {
1397 pub fn new(id: String, from: User, chat_instance: String) -> Self {
1398 Self {
1399 id,
1400 from,
1401 message: None,
1402 inline_message_id: None,
1403 chat_instance,
1404 data: None,
1405 game_short_name: None,
1406 }
1407 }
1408}
1409
1410#[derive(Deserialize, Serialize, Debug, Clone)]
1412pub struct ForceReply {
1413 pub force_reply: bool,
1415 #[serde(skip_serializing_if = "Option::is_none")]
1417 pub input_field_placeholder: Option<String>,
1418 #[serde(skip_serializing_if = "Option::is_none")]
1420 pub selective: Option<bool>,
1421}
1422impl ForceReply {
1423 pub fn new(force_reply: bool) -> Self {
1424 Self {
1425 force_reply,
1426 input_field_placeholder: None,
1427 selective: None,
1428 }
1429 }
1430}
1431
1432#[derive(Deserialize, Serialize, Debug, Clone)]
1434pub struct ChatPhoto {
1435 pub small_file_id: String,
1437 pub small_file_unique_id: String,
1439 pub big_file_id: String,
1441 pub big_file_unique_id: String,
1443}
1444impl ChatPhoto {
1445 pub fn new(
1446 small_file_id: String,
1447 small_file_unique_id: String,
1448 big_file_id: String,
1449 big_file_unique_id: String,
1450 ) -> Self {
1451 Self {
1452 small_file_id,
1453 small_file_unique_id,
1454 big_file_id,
1455 big_file_unique_id,
1456 }
1457 }
1458}
1459
1460#[derive(Deserialize, Serialize, Debug, Clone)]
1462pub struct ChatInviteLink {
1463 pub invite_link: String,
1465 pub creator: User,
1467 pub creates_join_request: bool,
1469 pub is_primary: bool,
1471 pub is_revoked: bool,
1473 #[serde(skip_serializing_if = "Option::is_none")]
1475 pub name: Option<String>,
1476 #[serde(skip_serializing_if = "Option::is_none")]
1478 pub expire_date: Option<i64>,
1479 #[serde(skip_serializing_if = "Option::is_none")]
1481 pub member_limit: Option<i64>,
1482 #[serde(skip_serializing_if = "Option::is_none")]
1484 pub pending_join_request_count: Option<i64>,
1485}
1486impl ChatInviteLink {
1487 pub fn new(
1488 invite_link: String,
1489 creator: User,
1490 creates_join_request: bool,
1491 is_primary: bool,
1492 is_revoked: bool,
1493 ) -> Self {
1494 Self {
1495 invite_link,
1496 creator,
1497 creates_join_request,
1498 is_primary,
1499 is_revoked,
1500 name: None,
1501 expire_date: None,
1502 member_limit: None,
1503 pending_join_request_count: None,
1504 }
1505 }
1506}
1507
1508#[derive(Deserialize, Serialize, Debug, Clone)]
1510pub struct ChatAdministratorRights {
1511 pub is_anonymous: bool,
1513 pub can_manage_chat: bool,
1515 pub can_delete_messages: bool,
1517 pub can_manage_video_chats: bool,
1519 pub can_restrict_members: bool,
1521 pub can_promote_members: bool,
1523 pub can_change_info: bool,
1525 pub can_invite_users: bool,
1527 #[serde(skip_serializing_if = "Option::is_none")]
1529 pub can_post_messages: Option<bool>,
1530 #[serde(skip_serializing_if = "Option::is_none")]
1532 pub can_edit_messages: Option<bool>,
1533 #[serde(skip_serializing_if = "Option::is_none")]
1535 pub can_pin_messages: Option<bool>,
1536}
1537impl ChatAdministratorRights {
1538 pub fn new(
1539 is_anonymous: bool,
1540 can_manage_chat: bool,
1541 can_delete_messages: bool,
1542 can_manage_video_chats: bool,
1543 can_restrict_members: bool,
1544 can_promote_members: bool,
1545 can_change_info: bool,
1546 can_invite_users: bool,
1547 ) -> Self {
1548 Self {
1549 is_anonymous,
1550 can_manage_chat,
1551 can_delete_messages,
1552 can_manage_video_chats,
1553 can_restrict_members,
1554 can_promote_members,
1555 can_change_info,
1556 can_invite_users,
1557 can_post_messages: None,
1558 can_edit_messages: None,
1559 can_pin_messages: None,
1560 }
1561 }
1562}
1563
1564#[derive(Deserialize, Serialize, Debug, Clone)]
1566pub struct ChatMemberOwner {
1567 pub user: User,
1569 pub is_anonymous: bool,
1571 #[serde(skip_serializing_if = "Option::is_none")]
1573 pub custom_title: Option<String>,
1574}
1575impl ChatMemberOwner {
1576 pub fn new(user: User, is_anonymous: bool) -> Self {
1577 Self {
1578 user,
1579 is_anonymous,
1580 custom_title: None,
1581 }
1582 }
1583}
1584
1585#[derive(Deserialize, Serialize, Debug, Clone)]
1587pub struct ChatMemberAdministrator {
1588 pub user: User,
1590 pub can_be_edited: bool,
1592 pub is_anonymous: bool,
1594 pub can_manage_chat: bool,
1596 pub can_delete_messages: bool,
1598 pub can_manage_video_chats: bool,
1600 pub can_restrict_members: bool,
1602 pub can_promote_members: bool,
1604 pub can_change_info: bool,
1606 pub can_invite_users: bool,
1608 #[serde(skip_serializing_if = "Option::is_none")]
1610 pub can_post_messages: Option<bool>,
1611 #[serde(skip_serializing_if = "Option::is_none")]
1613 pub can_edit_messages: Option<bool>,
1614 #[serde(skip_serializing_if = "Option::is_none")]
1616 pub can_pin_messages: Option<bool>,
1617 #[serde(skip_serializing_if = "Option::is_none")]
1619 pub custom_title: Option<String>,
1620}
1621impl ChatMemberAdministrator {
1622 pub fn new(
1623 user: User,
1624 can_be_edited: bool,
1625 is_anonymous: bool,
1626 can_manage_chat: bool,
1627 can_delete_messages: bool,
1628 can_manage_video_chats: bool,
1629 can_restrict_members: bool,
1630 can_promote_members: bool,
1631 can_change_info: bool,
1632 can_invite_users: bool,
1633 ) -> Self {
1634 Self {
1635 user,
1636 can_be_edited,
1637 is_anonymous,
1638 can_manage_chat,
1639 can_delete_messages,
1640 can_manage_video_chats,
1641 can_restrict_members,
1642 can_promote_members,
1643 can_change_info,
1644 can_invite_users,
1645 can_post_messages: None,
1646 can_edit_messages: None,
1647 can_pin_messages: None,
1648 custom_title: None,
1649 }
1650 }
1651}
1652
1653#[derive(Deserialize, Serialize, Debug, Clone)]
1655pub struct ChatMemberMember {
1656 pub user: User,
1658}
1659impl ChatMemberMember {
1660 pub fn new(user: User) -> Self {
1661 Self { user }
1662 }
1663}
1664
1665#[derive(Deserialize, Serialize, Debug, Clone)]
1667pub struct ChatMemberRestricted {
1668 pub user: User,
1670 pub is_member: bool,
1672 pub can_change_info: bool,
1674 pub can_invite_users: bool,
1676 pub can_pin_messages: bool,
1678 pub can_send_messages: bool,
1680 pub can_send_media_messages: bool,
1682 pub can_send_polls: bool,
1684 pub can_send_other_messages: bool,
1686 pub can_add_web_page_previews: bool,
1688 pub until_date: i64,
1690}
1691impl ChatMemberRestricted {
1692 pub fn new(
1693 user: User,
1694 is_member: bool,
1695 can_change_info: bool,
1696 can_invite_users: bool,
1697 can_pin_messages: bool,
1698 can_send_messages: bool,
1699 can_send_media_messages: bool,
1700 can_send_polls: bool,
1701 can_send_other_messages: bool,
1702 can_add_web_page_previews: bool,
1703 until_date: i64,
1704 ) -> Self {
1705 Self {
1706 user,
1707 is_member,
1708 can_change_info,
1709 can_invite_users,
1710 can_pin_messages,
1711 can_send_messages,
1712 can_send_media_messages,
1713 can_send_polls,
1714 can_send_other_messages,
1715 can_add_web_page_previews,
1716 until_date,
1717 }
1718 }
1719}
1720
1721#[derive(Deserialize, Serialize, Debug, Clone)]
1723pub struct ChatMemberLeft {
1724 pub user: User,
1726}
1727impl ChatMemberLeft {
1728 pub fn new(user: User) -> Self {
1729 Self { user }
1730 }
1731}
1732
1733#[derive(Deserialize, Serialize, Debug, Clone)]
1735pub struct ChatMemberBanned {
1736 pub user: User,
1738 pub until_date: i64,
1740}
1741impl ChatMemberBanned {
1742 pub fn new(user: User, until_date: i64) -> Self {
1743 Self { user, until_date }
1744 }
1745}
1746
1747#[derive(Deserialize, Serialize, Debug, Clone)]
1749pub struct ChatMemberUpdated {
1750 pub chat: Chat,
1752 pub from: User,
1754 pub date: i64,
1756 pub old_chat_member: ChatMember,
1758 pub new_chat_member: ChatMember,
1760 #[serde(skip_serializing_if = "Option::is_none")]
1762 pub invite_link: Option<ChatInviteLink>,
1763}
1764impl ChatMemberUpdated {
1765 pub fn new(
1766 chat: Chat,
1767 from: User,
1768 date: i64,
1769 old_chat_member: ChatMember,
1770 new_chat_member: ChatMember,
1771 ) -> Self {
1772 Self {
1773 chat,
1774 from,
1775 date,
1776 old_chat_member,
1777 new_chat_member,
1778 invite_link: None,
1779 }
1780 }
1781}
1782
1783#[derive(Deserialize, Serialize, Debug, Clone)]
1785pub struct ChatJoinRequest {
1786 pub chat: Chat,
1788 pub from: User,
1790 pub date: i64,
1792 #[serde(skip_serializing_if = "Option::is_none")]
1794 pub bio: Option<String>,
1795 #[serde(skip_serializing_if = "Option::is_none")]
1797 pub invite_link: Option<ChatInviteLink>,
1798}
1799impl ChatJoinRequest {
1800 pub fn new(chat: Chat, from: User, date: i64) -> Self {
1801 Self {
1802 chat,
1803 from,
1804 date,
1805 bio: None,
1806 invite_link: None,
1807 }
1808 }
1809}
1810
1811#[derive(Deserialize, Serialize, Debug, Clone)]
1813pub struct ChatPermissions {
1814 #[serde(skip_serializing_if = "Option::is_none")]
1816 pub can_send_messages: Option<bool>,
1817 #[serde(skip_serializing_if = "Option::is_none")]
1819 pub can_send_media_messages: Option<bool>,
1820 #[serde(skip_serializing_if = "Option::is_none")]
1822 pub can_send_polls: Option<bool>,
1823 #[serde(skip_serializing_if = "Option::is_none")]
1825 pub can_send_other_messages: Option<bool>,
1826 #[serde(skip_serializing_if = "Option::is_none")]
1828 pub can_add_web_page_previews: Option<bool>,
1829 #[serde(skip_serializing_if = "Option::is_none")]
1831 pub can_change_info: Option<bool>,
1832 #[serde(skip_serializing_if = "Option::is_none")]
1834 pub can_invite_users: Option<bool>,
1835 #[serde(skip_serializing_if = "Option::is_none")]
1837 pub can_pin_messages: Option<bool>,
1838}
1839impl ChatPermissions {
1840 pub fn new() -> Self {
1841 Self {
1842 can_send_messages: None,
1843 can_send_media_messages: None,
1844 can_send_polls: None,
1845 can_send_other_messages: None,
1846 can_add_web_page_previews: None,
1847 can_change_info: None,
1848 can_invite_users: None,
1849 can_pin_messages: None,
1850 }
1851 }
1852}
1853
1854#[derive(Deserialize, Serialize, Debug, Clone)]
1856pub struct ChatLocation {
1857 pub location: Location,
1859 pub address: String,
1861}
1862impl ChatLocation {
1863 pub fn new(location: Location, address: String) -> Self {
1864 Self { location, address }
1865 }
1866}
1867
1868#[derive(Deserialize, Serialize, Debug, Clone)]
1870pub struct BotCommand {
1871 pub command: String,
1873 pub description: String,
1875}
1876impl BotCommand {
1877 pub fn new(command: String, description: String) -> Self {
1878 Self {
1879 command,
1880 description,
1881 }
1882 }
1883}
1884
1885#[derive(Deserialize, Serialize, Debug, Clone)]
1887pub struct BotCommandScopeDefault {}
1888impl BotCommandScopeDefault {
1889 pub fn new() -> Self {
1890 Self {}
1891 }
1892}
1893
1894#[derive(Deserialize, Serialize, Debug, Clone)]
1896pub struct BotCommandScopeAllPrivateChats {}
1897impl BotCommandScopeAllPrivateChats {
1898 pub fn new() -> Self {
1899 Self {}
1900 }
1901}
1902
1903#[derive(Deserialize, Serialize, Debug, Clone)]
1905pub struct BotCommandScopeAllGroupChats {}
1906impl BotCommandScopeAllGroupChats {
1907 pub fn new() -> Self {
1908 Self {}
1909 }
1910}
1911
1912#[derive(Deserialize, Serialize, Debug, Clone)]
1914pub struct BotCommandScopeAllChatAdministrators {}
1915impl BotCommandScopeAllChatAdministrators {
1916 pub fn new() -> Self {
1917 Self {}
1918 }
1919}
1920
1921#[derive(Deserialize, Serialize, Debug, Clone)]
1923pub struct BotCommandScopeChat {
1924 pub chat_id: ChatId,
1926}
1927impl BotCommandScopeChat {
1928 pub fn new(chat_id: ChatId) -> Self {
1929 Self { chat_id }
1930 }
1931}
1932
1933#[derive(Deserialize, Serialize, Debug, Clone)]
1935pub struct BotCommandScopeChatAdministrators {
1936 pub chat_id: ChatId,
1938}
1939impl BotCommandScopeChatAdministrators {
1940 pub fn new(chat_id: ChatId) -> Self {
1941 Self { chat_id }
1942 }
1943}
1944
1945#[derive(Deserialize, Serialize, Debug, Clone)]
1947pub struct BotCommandScopeChatMember {
1948 pub chat_id: ChatId,
1950 pub user_id: i64,
1952}
1953impl BotCommandScopeChatMember {
1954 pub fn new(chat_id: ChatId, user_id: i64) -> Self {
1955 Self { chat_id, user_id }
1956 }
1957}
1958
1959#[derive(Deserialize, Serialize, Debug, Clone)]
1961pub struct MenuButtonCommands {}
1962impl MenuButtonCommands {
1963 pub fn new() -> Self {
1964 Self {}
1965 }
1966}
1967
1968#[derive(Deserialize, Serialize, Debug, Clone)]
1970pub struct MenuButtonWebApp {
1971 pub text: String,
1973 pub web_app: WebAppInfo,
1975}
1976impl MenuButtonWebApp {
1977 pub fn new(text: String, web_app: WebAppInfo) -> Self {
1978 Self { text, web_app }
1979 }
1980}
1981
1982#[derive(Deserialize, Serialize, Debug, Clone)]
1984pub struct MenuButtonDefault {}
1985impl MenuButtonDefault {
1986 pub fn new() -> Self {
1987 Self {}
1988 }
1989}
1990
1991#[derive(Deserialize, Serialize, Debug, Clone)]
1993pub struct ResponseParameters {
1994 #[serde(skip_serializing_if = "Option::is_none")]
1996 pub migrate_to_chat_id: Option<i64>,
1997 #[serde(skip_serializing_if = "Option::is_none")]
1999 pub retry_after: Option<i64>,
2000}
2001impl ResponseParameters {
2002 pub fn new() -> Self {
2003 Self {
2004 migrate_to_chat_id: None,
2005 retry_after: None,
2006 }
2007 }
2008}
2009
2010#[derive(Deserialize, Serialize, Debug, Clone)]
2012pub struct InputMediaPhoto {
2013 pub media: InputFile,
2015 #[serde(skip_serializing_if = "Option::is_none")]
2017 pub caption: Option<String>,
2018 #[serde(skip_serializing_if = "Option::is_none")]
2020 pub parse_mode: Option<String>,
2021 #[serde(skip_serializing_if = "Option::is_none")]
2023 pub caption_entities: Option<Vec<MessageEntity>>,
2024}
2025impl InputMediaPhoto {
2026 pub fn new(media: InputFile) -> Self {
2027 Self {
2028 media,
2029 caption: None,
2030 parse_mode: None,
2031 caption_entities: None,
2032 }
2033 }
2034}
2035
2036#[derive(Deserialize, Serialize, Debug, Clone)]
2038pub struct InputMediaVideo {
2039 pub media: InputFile,
2041 #[serde(skip_serializing_if = "Option::is_none")]
2043 pub thumb: Option<InputFile>,
2044 #[serde(skip_serializing_if = "Option::is_none")]
2046 pub caption: Option<String>,
2047 #[serde(skip_serializing_if = "Option::is_none")]
2049 pub parse_mode: Option<String>,
2050 #[serde(skip_serializing_if = "Option::is_none")]
2052 pub caption_entities: Option<Vec<MessageEntity>>,
2053 #[serde(skip_serializing_if = "Option::is_none")]
2055 pub width: Option<i64>,
2056 #[serde(skip_serializing_if = "Option::is_none")]
2058 pub height: Option<i64>,
2059 #[serde(skip_serializing_if = "Option::is_none")]
2061 pub duration: Option<i64>,
2062 #[serde(skip_serializing_if = "Option::is_none")]
2064 pub supports_streaming: Option<bool>,
2065}
2066impl InputMediaVideo {
2067 pub fn new(media: InputFile) -> Self {
2068 Self {
2069 media,
2070 thumb: None,
2071 caption: None,
2072 parse_mode: None,
2073 caption_entities: None,
2074 width: None,
2075 height: None,
2076 duration: None,
2077 supports_streaming: None,
2078 }
2079 }
2080}
2081
2082#[derive(Deserialize, Serialize, Debug, Clone)]
2084pub struct InputMediaAnimation {
2085 pub media: InputFile,
2087 #[serde(skip_serializing_if = "Option::is_none")]
2089 pub thumb: Option<InputFile>,
2090 #[serde(skip_serializing_if = "Option::is_none")]
2092 pub caption: Option<String>,
2093 #[serde(skip_serializing_if = "Option::is_none")]
2095 pub parse_mode: Option<String>,
2096 #[serde(skip_serializing_if = "Option::is_none")]
2098 pub caption_entities: Option<Vec<MessageEntity>>,
2099 #[serde(skip_serializing_if = "Option::is_none")]
2101 pub width: Option<i64>,
2102 #[serde(skip_serializing_if = "Option::is_none")]
2104 pub height: Option<i64>,
2105 #[serde(skip_serializing_if = "Option::is_none")]
2107 pub duration: Option<i64>,
2108}
2109impl InputMediaAnimation {
2110 pub fn new(media: InputFile) -> Self {
2111 Self {
2112 media,
2113 thumb: None,
2114 caption: None,
2115 parse_mode: None,
2116 caption_entities: None,
2117 width: None,
2118 height: None,
2119 duration: None,
2120 }
2121 }
2122}
2123
2124#[derive(Deserialize, Serialize, Debug, Clone)]
2126pub struct InputMediaAudio {
2127 pub media: InputFile,
2129 #[serde(skip_serializing_if = "Option::is_none")]
2131 pub thumb: Option<InputFile>,
2132 #[serde(skip_serializing_if = "Option::is_none")]
2134 pub caption: Option<String>,
2135 #[serde(skip_serializing_if = "Option::is_none")]
2137 pub parse_mode: Option<String>,
2138 #[serde(skip_serializing_if = "Option::is_none")]
2140 pub caption_entities: Option<Vec<MessageEntity>>,
2141 #[serde(skip_serializing_if = "Option::is_none")]
2143 pub duration: Option<i64>,
2144 #[serde(skip_serializing_if = "Option::is_none")]
2146 pub performer: Option<String>,
2147 #[serde(skip_serializing_if = "Option::is_none")]
2149 pub title: Option<String>,
2150}
2151impl InputMediaAudio {
2152 pub fn new(media: InputFile) -> Self {
2153 Self {
2154 media,
2155 thumb: None,
2156 caption: None,
2157 parse_mode: None,
2158 caption_entities: None,
2159 duration: None,
2160 performer: None,
2161 title: None,
2162 }
2163 }
2164}
2165
2166#[derive(Deserialize, Serialize, Debug, Clone)]
2168pub struct InputMediaDocument {
2169 pub media: InputFile,
2171 #[serde(skip_serializing_if = "Option::is_none")]
2173 pub thumb: Option<InputFile>,
2174 #[serde(skip_serializing_if = "Option::is_none")]
2176 pub caption: Option<String>,
2177 #[serde(skip_serializing_if = "Option::is_none")]
2179 pub parse_mode: Option<String>,
2180 #[serde(skip_serializing_if = "Option::is_none")]
2182 pub caption_entities: Option<Vec<MessageEntity>>,
2183 #[serde(skip_serializing_if = "Option::is_none")]
2185 pub disable_content_type_detection: Option<bool>,
2186}
2187impl InputMediaDocument {
2188 pub fn new(media: InputFile) -> Self {
2189 Self {
2190 media,
2191 thumb: None,
2192 caption: None,
2193 parse_mode: None,
2194 caption_entities: None,
2195 disable_content_type_detection: None,
2196 }
2197 }
2198}
2199
2200#[derive(Deserialize, Serialize, Debug, Clone)]
2202pub struct Sticker {
2203 pub file_id: String,
2205 pub file_unique_id: String,
2207 #[serde(rename = "type")]
2209 pub type_name: String,
2210 pub width: i64,
2212 pub height: i64,
2214 pub is_animated: bool,
2216 pub is_video: bool,
2218 #[serde(skip_serializing_if = "Option::is_none")]
2220 pub thumb: Option<PhotoSize>,
2221 #[serde(skip_serializing_if = "Option::is_none")]
2223 pub emoji: Option<String>,
2224 #[serde(skip_serializing_if = "Option::is_none")]
2226 pub set_name: Option<String>,
2227 #[serde(skip_serializing_if = "Option::is_none")]
2229 pub premium_animation: Option<File>,
2230 #[serde(skip_serializing_if = "Option::is_none")]
2232 pub mask_position: Option<MaskPosition>,
2233 #[serde(skip_serializing_if = "Option::is_none")]
2235 pub custom_emoji_id: Option<String>,
2236 #[serde(skip_serializing_if = "Option::is_none")]
2238 pub file_size: Option<i64>,
2239}
2240impl Sticker {
2241 pub fn new(
2242 file_id: String,
2243 file_unique_id: String,
2244 type_name: String,
2245 width: i64,
2246 height: i64,
2247 is_animated: bool,
2248 is_video: bool,
2249 ) -> Self {
2250 Self {
2251 file_id,
2252 file_unique_id,
2253 type_name,
2254 width,
2255 height,
2256 is_animated,
2257 is_video,
2258 thumb: None,
2259 emoji: None,
2260 set_name: None,
2261 premium_animation: None,
2262 mask_position: None,
2263 custom_emoji_id: None,
2264 file_size: None,
2265 }
2266 }
2267}
2268
2269#[derive(Deserialize, Serialize, Debug, Clone)]
2271pub struct StickerSet {
2272 pub name: String,
2274 pub title: String,
2276 pub sticker_type: String,
2278 pub is_animated: bool,
2280 pub is_video: bool,
2282 pub stickers: Vec<Sticker>,
2284 #[serde(skip_serializing_if = "Option::is_none")]
2286 pub thumb: Option<PhotoSize>,
2287}
2288impl StickerSet {
2289 pub fn new(
2290 name: String,
2291 title: String,
2292 sticker_type: String,
2293 is_animated: bool,
2294 is_video: bool,
2295 stickers: Vec<Sticker>,
2296 ) -> Self {
2297 Self {
2298 name,
2299 title,
2300 sticker_type,
2301 is_animated,
2302 is_video,
2303 stickers,
2304 thumb: None,
2305 }
2306 }
2307}
2308
2309#[derive(Deserialize, Serialize, Debug, Clone)]
2311pub struct MaskPosition {
2312 pub point: String,
2314 pub x_shift: f64,
2316 pub y_shift: f64,
2318 pub scale: f64,
2320}
2321impl MaskPosition {
2322 pub fn new(point: String, x_shift: f64, y_shift: f64, scale: f64) -> Self {
2323 Self {
2324 point,
2325 x_shift,
2326 y_shift,
2327 scale,
2328 }
2329 }
2330}
2331
2332#[derive(Deserialize, Serialize, Debug, Clone)]
2334pub struct InlineQuery {
2335 pub id: String,
2337 pub from: User,
2339 pub query: String,
2341 pub offset: String,
2343 #[serde(skip_serializing_if = "Option::is_none")]
2345 pub chat_type: Option<String>,
2346 #[serde(skip_serializing_if = "Option::is_none")]
2348 pub location: Option<Location>,
2349}
2350impl InlineQuery {
2351 pub fn new(id: String, from: User, query: String, offset: String) -> Self {
2352 Self {
2353 id,
2354 from,
2355 query,
2356 offset,
2357 chat_type: None,
2358 location: None,
2359 }
2360 }
2361}
2362
2363#[derive(Deserialize, Serialize, Debug, Clone)]
2365pub struct InlineQueryResultArticle {
2366 pub id: String,
2368 pub title: String,
2370 pub input_message_content: InputMessageContent,
2372 #[serde(skip_serializing_if = "Option::is_none")]
2374 pub reply_markup: Option<InlineKeyboardMarkup>,
2375 #[serde(skip_serializing_if = "Option::is_none")]
2377 pub url: Option<String>,
2378 #[serde(skip_serializing_if = "Option::is_none")]
2380 pub hide_url: Option<bool>,
2381 #[serde(skip_serializing_if = "Option::is_none")]
2383 pub description: Option<String>,
2384 #[serde(skip_serializing_if = "Option::is_none")]
2386 pub thumb_url: Option<String>,
2387 #[serde(skip_serializing_if = "Option::is_none")]
2389 pub thumb_width: Option<i64>,
2390 #[serde(skip_serializing_if = "Option::is_none")]
2392 pub thumb_height: Option<i64>,
2393}
2394impl InlineQueryResultArticle {
2395 pub fn new(id: String, title: String, input_message_content: InputMessageContent) -> Self {
2396 Self {
2397 id,
2398 title,
2399 input_message_content,
2400 reply_markup: None,
2401 url: None,
2402 hide_url: None,
2403 description: None,
2404 thumb_url: None,
2405 thumb_width: None,
2406 thumb_height: None,
2407 }
2408 }
2409}
2410
2411#[derive(Deserialize, Serialize, Debug, Clone)]
2413pub struct InlineQueryResultPhoto {
2414 pub id: String,
2416 pub photo_url: String,
2418 pub thumb_url: String,
2420 #[serde(skip_serializing_if = "Option::is_none")]
2422 pub photo_width: Option<i64>,
2423 #[serde(skip_serializing_if = "Option::is_none")]
2425 pub photo_height: Option<i64>,
2426 #[serde(skip_serializing_if = "Option::is_none")]
2428 pub title: Option<String>,
2429 #[serde(skip_serializing_if = "Option::is_none")]
2431 pub description: Option<String>,
2432 #[serde(skip_serializing_if = "Option::is_none")]
2434 pub caption: Option<String>,
2435 #[serde(skip_serializing_if = "Option::is_none")]
2437 pub parse_mode: Option<String>,
2438 #[serde(skip_serializing_if = "Option::is_none")]
2440 pub caption_entities: Option<Vec<MessageEntity>>,
2441 #[serde(skip_serializing_if = "Option::is_none")]
2443 pub reply_markup: Option<InlineKeyboardMarkup>,
2444 #[serde(skip_serializing_if = "Option::is_none")]
2446 pub input_message_content: Option<InputMessageContent>,
2447}
2448impl InlineQueryResultPhoto {
2449 pub fn new(id: String, photo_url: String, thumb_url: String) -> Self {
2450 Self {
2451 id,
2452 photo_url,
2453 thumb_url,
2454 photo_width: None,
2455 photo_height: None,
2456 title: None,
2457 description: None,
2458 caption: None,
2459 parse_mode: None,
2460 caption_entities: None,
2461 reply_markup: None,
2462 input_message_content: None,
2463 }
2464 }
2465}
2466
2467#[derive(Deserialize, Serialize, Debug, Clone)]
2469pub struct InlineQueryResultGif {
2470 pub id: String,
2472 pub gif_url: String,
2474 #[serde(skip_serializing_if = "Option::is_none")]
2476 pub gif_width: Option<i64>,
2477 #[serde(skip_serializing_if = "Option::is_none")]
2479 pub gif_height: Option<i64>,
2480 #[serde(skip_serializing_if = "Option::is_none")]
2482 pub gif_duration: Option<i64>,
2483 pub thumb_url: String,
2485 #[serde(skip_serializing_if = "Option::is_none")]
2487 pub thumb_mime_type: Option<String>,
2488 #[serde(skip_serializing_if = "Option::is_none")]
2490 pub title: Option<String>,
2491 #[serde(skip_serializing_if = "Option::is_none")]
2493 pub caption: Option<String>,
2494 #[serde(skip_serializing_if = "Option::is_none")]
2496 pub parse_mode: Option<String>,
2497 #[serde(skip_serializing_if = "Option::is_none")]
2499 pub caption_entities: Option<Vec<MessageEntity>>,
2500 #[serde(skip_serializing_if = "Option::is_none")]
2502 pub reply_markup: Option<InlineKeyboardMarkup>,
2503 #[serde(skip_serializing_if = "Option::is_none")]
2505 pub input_message_content: Option<InputMessageContent>,
2506}
2507impl InlineQueryResultGif {
2508 pub fn new(id: String, gif_url: String, thumb_url: String) -> Self {
2509 Self {
2510 id,
2511 gif_url,
2512 gif_width: None,
2513 gif_height: None,
2514 gif_duration: None,
2515 thumb_url,
2516 thumb_mime_type: None,
2517 title: None,
2518 caption: None,
2519 parse_mode: None,
2520 caption_entities: None,
2521 reply_markup: None,
2522 input_message_content: None,
2523 }
2524 }
2525}
2526
2527#[derive(Deserialize, Serialize, Debug, Clone)]
2529pub struct InlineQueryResultMpeg4Gif {
2530 pub id: String,
2532 pub mpeg4_url: String,
2534 #[serde(skip_serializing_if = "Option::is_none")]
2536 pub mpeg4_width: Option<i64>,
2537 #[serde(skip_serializing_if = "Option::is_none")]
2539 pub mpeg4_height: Option<i64>,
2540 #[serde(skip_serializing_if = "Option::is_none")]
2542 pub mpeg4_duration: Option<i64>,
2543 pub thumb_url: String,
2545 #[serde(skip_serializing_if = "Option::is_none")]
2547 pub thumb_mime_type: Option<String>,
2548 #[serde(skip_serializing_if = "Option::is_none")]
2550 pub title: Option<String>,
2551 #[serde(skip_serializing_if = "Option::is_none")]
2553 pub caption: Option<String>,
2554 #[serde(skip_serializing_if = "Option::is_none")]
2556 pub parse_mode: Option<String>,
2557 #[serde(skip_serializing_if = "Option::is_none")]
2559 pub caption_entities: Option<Vec<MessageEntity>>,
2560 #[serde(skip_serializing_if = "Option::is_none")]
2562 pub reply_markup: Option<InlineKeyboardMarkup>,
2563 #[serde(skip_serializing_if = "Option::is_none")]
2565 pub input_message_content: Option<InputMessageContent>,
2566}
2567impl InlineQueryResultMpeg4Gif {
2568 pub fn new(id: String, mpeg4_url: String, thumb_url: String) -> Self {
2569 Self {
2570 id,
2571 mpeg4_url,
2572 mpeg4_width: None,
2573 mpeg4_height: None,
2574 mpeg4_duration: None,
2575 thumb_url,
2576 thumb_mime_type: None,
2577 title: None,
2578 caption: None,
2579 parse_mode: None,
2580 caption_entities: None,
2581 reply_markup: None,
2582 input_message_content: None,
2583 }
2584 }
2585}
2586
2587#[derive(Deserialize, Serialize, Debug, Clone)]
2589pub struct InlineQueryResultVideo {
2590 pub id: String,
2592 pub video_url: String,
2594 pub mime_type: String,
2596 pub thumb_url: String,
2598 pub title: String,
2600 #[serde(skip_serializing_if = "Option::is_none")]
2602 pub caption: Option<String>,
2603 #[serde(skip_serializing_if = "Option::is_none")]
2605 pub parse_mode: Option<String>,
2606 #[serde(skip_serializing_if = "Option::is_none")]
2608 pub caption_entities: Option<Vec<MessageEntity>>,
2609 #[serde(skip_serializing_if = "Option::is_none")]
2611 pub video_width: Option<i64>,
2612 #[serde(skip_serializing_if = "Option::is_none")]
2614 pub video_height: Option<i64>,
2615 #[serde(skip_serializing_if = "Option::is_none")]
2617 pub video_duration: Option<i64>,
2618 #[serde(skip_serializing_if = "Option::is_none")]
2620 pub description: Option<String>,
2621 #[serde(skip_serializing_if = "Option::is_none")]
2623 pub reply_markup: Option<InlineKeyboardMarkup>,
2624 #[serde(skip_serializing_if = "Option::is_none")]
2626 pub input_message_content: Option<InputMessageContent>,
2627}
2628impl InlineQueryResultVideo {
2629 pub fn new(
2630 id: String,
2631 video_url: String,
2632 mime_type: String,
2633 thumb_url: String,
2634 title: String,
2635 ) -> Self {
2636 Self {
2637 id,
2638 video_url,
2639 mime_type,
2640 thumb_url,
2641 title,
2642 caption: None,
2643 parse_mode: None,
2644 caption_entities: None,
2645 video_width: None,
2646 video_height: None,
2647 video_duration: None,
2648 description: None,
2649 reply_markup: None,
2650 input_message_content: None,
2651 }
2652 }
2653}
2654
2655#[derive(Deserialize, Serialize, Debug, Clone)]
2657pub struct InlineQueryResultAudio {
2658 pub id: String,
2660 pub audio_url: String,
2662 pub title: String,
2664 #[serde(skip_serializing_if = "Option::is_none")]
2666 pub caption: Option<String>,
2667 #[serde(skip_serializing_if = "Option::is_none")]
2669 pub parse_mode: Option<String>,
2670 #[serde(skip_serializing_if = "Option::is_none")]
2672 pub caption_entities: Option<Vec<MessageEntity>>,
2673 #[serde(skip_serializing_if = "Option::is_none")]
2675 pub performer: Option<String>,
2676 #[serde(skip_serializing_if = "Option::is_none")]
2678 pub audio_duration: Option<i64>,
2679 #[serde(skip_serializing_if = "Option::is_none")]
2681 pub reply_markup: Option<InlineKeyboardMarkup>,
2682 #[serde(skip_serializing_if = "Option::is_none")]
2684 pub input_message_content: Option<InputMessageContent>,
2685}
2686impl InlineQueryResultAudio {
2687 pub fn new(id: String, audio_url: String, title: String) -> Self {
2688 Self {
2689 id,
2690 audio_url,
2691 title,
2692 caption: None,
2693 parse_mode: None,
2694 caption_entities: None,
2695 performer: None,
2696 audio_duration: None,
2697 reply_markup: None,
2698 input_message_content: None,
2699 }
2700 }
2701}
2702
2703#[derive(Deserialize, Serialize, Debug, Clone)]
2705pub struct InlineQueryResultVoice {
2706 pub id: String,
2708 pub voice_url: String,
2710 pub title: String,
2712 #[serde(skip_serializing_if = "Option::is_none")]
2714 pub caption: Option<String>,
2715 #[serde(skip_serializing_if = "Option::is_none")]
2717 pub parse_mode: Option<String>,
2718 #[serde(skip_serializing_if = "Option::is_none")]
2720 pub caption_entities: Option<Vec<MessageEntity>>,
2721 #[serde(skip_serializing_if = "Option::is_none")]
2723 pub voice_duration: Option<i64>,
2724 #[serde(skip_serializing_if = "Option::is_none")]
2726 pub reply_markup: Option<InlineKeyboardMarkup>,
2727 #[serde(skip_serializing_if = "Option::is_none")]
2729 pub input_message_content: Option<InputMessageContent>,
2730}
2731impl InlineQueryResultVoice {
2732 pub fn new(id: String, voice_url: String, title: String) -> Self {
2733 Self {
2734 id,
2735 voice_url,
2736 title,
2737 caption: None,
2738 parse_mode: None,
2739 caption_entities: None,
2740 voice_duration: None,
2741 reply_markup: None,
2742 input_message_content: None,
2743 }
2744 }
2745}
2746
2747#[derive(Deserialize, Serialize, Debug, Clone)]
2749pub struct InlineQueryResultDocument {
2750 pub id: String,
2752 pub title: String,
2754 #[serde(skip_serializing_if = "Option::is_none")]
2756 pub caption: Option<String>,
2757 #[serde(skip_serializing_if = "Option::is_none")]
2759 pub parse_mode: Option<String>,
2760 #[serde(skip_serializing_if = "Option::is_none")]
2762 pub caption_entities: Option<Vec<MessageEntity>>,
2763 pub document_url: String,
2765 pub mime_type: String,
2767 #[serde(skip_serializing_if = "Option::is_none")]
2769 pub description: Option<String>,
2770 #[serde(skip_serializing_if = "Option::is_none")]
2772 pub reply_markup: Option<InlineKeyboardMarkup>,
2773 #[serde(skip_serializing_if = "Option::is_none")]
2775 pub input_message_content: Option<InputMessageContent>,
2776 #[serde(skip_serializing_if = "Option::is_none")]
2778 pub thumb_url: Option<String>,
2779 #[serde(skip_serializing_if = "Option::is_none")]
2781 pub thumb_width: Option<i64>,
2782 #[serde(skip_serializing_if = "Option::is_none")]
2784 pub thumb_height: Option<i64>,
2785}
2786impl InlineQueryResultDocument {
2787 pub fn new(id: String, title: String, document_url: String, mime_type: String) -> Self {
2788 Self {
2789 id,
2790 title,
2791 caption: None,
2792 parse_mode: None,
2793 caption_entities: None,
2794 document_url,
2795 mime_type,
2796 description: None,
2797 reply_markup: None,
2798 input_message_content: None,
2799 thumb_url: None,
2800 thumb_width: None,
2801 thumb_height: None,
2802 }
2803 }
2804}
2805
2806#[derive(Deserialize, Serialize, Debug, Clone)]
2808pub struct InlineQueryResultLocation {
2809 pub id: String,
2811 pub latitude: f64,
2813 pub longitude: f64,
2815 pub title: String,
2817 #[serde(skip_serializing_if = "Option::is_none")]
2819 pub horizontal_accuracy: Option<f64>,
2820 #[serde(skip_serializing_if = "Option::is_none")]
2822 pub live_period: Option<i64>,
2823 #[serde(skip_serializing_if = "Option::is_none")]
2825 pub heading: Option<i64>,
2826 #[serde(skip_serializing_if = "Option::is_none")]
2828 pub proximity_alert_radius: Option<i64>,
2829 #[serde(skip_serializing_if = "Option::is_none")]
2831 pub reply_markup: Option<InlineKeyboardMarkup>,
2832 #[serde(skip_serializing_if = "Option::is_none")]
2834 pub input_message_content: Option<InputMessageContent>,
2835 #[serde(skip_serializing_if = "Option::is_none")]
2837 pub thumb_url: Option<String>,
2838 #[serde(skip_serializing_if = "Option::is_none")]
2840 pub thumb_width: Option<i64>,
2841 #[serde(skip_serializing_if = "Option::is_none")]
2843 pub thumb_height: Option<i64>,
2844}
2845impl InlineQueryResultLocation {
2846 pub fn new(id: String, latitude: f64, longitude: f64, title: String) -> Self {
2847 Self {
2848 id,
2849 latitude,
2850 longitude,
2851 title,
2852 horizontal_accuracy: None,
2853 live_period: None,
2854 heading: None,
2855 proximity_alert_radius: None,
2856 reply_markup: None,
2857 input_message_content: None,
2858 thumb_url: None,
2859 thumb_width: None,
2860 thumb_height: None,
2861 }
2862 }
2863}
2864
2865#[derive(Deserialize, Serialize, Debug, Clone)]
2867pub struct InlineQueryResultVenue {
2868 pub id: String,
2870 pub latitude: f64,
2872 pub longitude: f64,
2874 pub title: String,
2876 pub address: String,
2878 #[serde(skip_serializing_if = "Option::is_none")]
2880 pub foursquare_id: Option<String>,
2881 #[serde(skip_serializing_if = "Option::is_none")]
2883 pub foursquare_type: Option<String>,
2884 #[serde(skip_serializing_if = "Option::is_none")]
2886 pub google_place_id: Option<String>,
2887 #[serde(skip_serializing_if = "Option::is_none")]
2889 pub google_place_type: Option<String>,
2890 #[serde(skip_serializing_if = "Option::is_none")]
2892 pub reply_markup: Option<InlineKeyboardMarkup>,
2893 #[serde(skip_serializing_if = "Option::is_none")]
2895 pub input_message_content: Option<InputMessageContent>,
2896 #[serde(skip_serializing_if = "Option::is_none")]
2898 pub thumb_url: Option<String>,
2899 #[serde(skip_serializing_if = "Option::is_none")]
2901 pub thumb_width: Option<i64>,
2902 #[serde(skip_serializing_if = "Option::is_none")]
2904 pub thumb_height: Option<i64>,
2905}
2906impl InlineQueryResultVenue {
2907 pub fn new(id: String, latitude: f64, longitude: f64, title: String, address: String) -> Self {
2908 Self {
2909 id,
2910 latitude,
2911 longitude,
2912 title,
2913 address,
2914 foursquare_id: None,
2915 foursquare_type: None,
2916 google_place_id: None,
2917 google_place_type: None,
2918 reply_markup: None,
2919 input_message_content: None,
2920 thumb_url: None,
2921 thumb_width: None,
2922 thumb_height: None,
2923 }
2924 }
2925}
2926
2927#[derive(Deserialize, Serialize, Debug, Clone)]
2929pub struct InlineQueryResultContact {
2930 pub id: String,
2932 pub phone_number: String,
2934 pub first_name: String,
2936 #[serde(skip_serializing_if = "Option::is_none")]
2938 pub last_name: Option<String>,
2939 #[serde(skip_serializing_if = "Option::is_none")]
2941 pub vcard: Option<String>,
2942 #[serde(skip_serializing_if = "Option::is_none")]
2944 pub reply_markup: Option<InlineKeyboardMarkup>,
2945 #[serde(skip_serializing_if = "Option::is_none")]
2947 pub input_message_content: Option<InputMessageContent>,
2948 #[serde(skip_serializing_if = "Option::is_none")]
2950 pub thumb_url: Option<String>,
2951 #[serde(skip_serializing_if = "Option::is_none")]
2953 pub thumb_width: Option<i64>,
2954 #[serde(skip_serializing_if = "Option::is_none")]
2956 pub thumb_height: Option<i64>,
2957}
2958impl InlineQueryResultContact {
2959 pub fn new(id: String, phone_number: String, first_name: String) -> Self {
2960 Self {
2961 id,
2962 phone_number,
2963 first_name,
2964 last_name: None,
2965 vcard: None,
2966 reply_markup: None,
2967 input_message_content: None,
2968 thumb_url: None,
2969 thumb_width: None,
2970 thumb_height: None,
2971 }
2972 }
2973}
2974
2975#[derive(Deserialize, Serialize, Debug, Clone)]
2977pub struct InlineQueryResultGame {
2978 pub id: String,
2980 pub game_short_name: String,
2982 #[serde(skip_serializing_if = "Option::is_none")]
2984 pub reply_markup: Option<InlineKeyboardMarkup>,
2985}
2986impl InlineQueryResultGame {
2987 pub fn new(id: String, game_short_name: String) -> Self {
2988 Self {
2989 id,
2990 game_short_name,
2991 reply_markup: None,
2992 }
2993 }
2994}
2995
2996#[derive(Deserialize, Serialize, Debug, Clone)]
2998pub struct InlineQueryResultCachedPhoto {
2999 pub id: String,
3001 pub photo_file_id: String,
3003 #[serde(skip_serializing_if = "Option::is_none")]
3005 pub title: Option<String>,
3006 #[serde(skip_serializing_if = "Option::is_none")]
3008 pub description: Option<String>,
3009 #[serde(skip_serializing_if = "Option::is_none")]
3011 pub caption: Option<String>,
3012 #[serde(skip_serializing_if = "Option::is_none")]
3014 pub parse_mode: Option<String>,
3015 #[serde(skip_serializing_if = "Option::is_none")]
3017 pub caption_entities: Option<Vec<MessageEntity>>,
3018 #[serde(skip_serializing_if = "Option::is_none")]
3020 pub reply_markup: Option<InlineKeyboardMarkup>,
3021 #[serde(skip_serializing_if = "Option::is_none")]
3023 pub input_message_content: Option<InputMessageContent>,
3024}
3025impl InlineQueryResultCachedPhoto {
3026 pub fn new(id: String, photo_file_id: String) -> Self {
3027 Self {
3028 id,
3029 photo_file_id,
3030 title: None,
3031 description: None,
3032 caption: None,
3033 parse_mode: None,
3034 caption_entities: None,
3035 reply_markup: None,
3036 input_message_content: None,
3037 }
3038 }
3039}
3040
3041#[derive(Deserialize, Serialize, Debug, Clone)]
3043pub struct InlineQueryResultCachedGif {
3044 pub id: String,
3046 pub gif_file_id: String,
3048 #[serde(skip_serializing_if = "Option::is_none")]
3050 pub title: Option<String>,
3051 #[serde(skip_serializing_if = "Option::is_none")]
3053 pub caption: Option<String>,
3054 #[serde(skip_serializing_if = "Option::is_none")]
3056 pub parse_mode: Option<String>,
3057 #[serde(skip_serializing_if = "Option::is_none")]
3059 pub caption_entities: Option<Vec<MessageEntity>>,
3060 #[serde(skip_serializing_if = "Option::is_none")]
3062 pub reply_markup: Option<InlineKeyboardMarkup>,
3063 #[serde(skip_serializing_if = "Option::is_none")]
3065 pub input_message_content: Option<InputMessageContent>,
3066}
3067impl InlineQueryResultCachedGif {
3068 pub fn new(id: String, gif_file_id: String) -> Self {
3069 Self {
3070 id,
3071 gif_file_id,
3072 title: None,
3073 caption: None,
3074 parse_mode: None,
3075 caption_entities: None,
3076 reply_markup: None,
3077 input_message_content: None,
3078 }
3079 }
3080}
3081
3082#[derive(Deserialize, Serialize, Debug, Clone)]
3084pub struct InlineQueryResultCachedMpeg4Gif {
3085 pub id: String,
3087 pub mpeg4_file_id: String,
3089 #[serde(skip_serializing_if = "Option::is_none")]
3091 pub title: Option<String>,
3092 #[serde(skip_serializing_if = "Option::is_none")]
3094 pub caption: Option<String>,
3095 #[serde(skip_serializing_if = "Option::is_none")]
3097 pub parse_mode: Option<String>,
3098 #[serde(skip_serializing_if = "Option::is_none")]
3100 pub caption_entities: Option<Vec<MessageEntity>>,
3101 #[serde(skip_serializing_if = "Option::is_none")]
3103 pub reply_markup: Option<InlineKeyboardMarkup>,
3104 #[serde(skip_serializing_if = "Option::is_none")]
3106 pub input_message_content: Option<InputMessageContent>,
3107}
3108impl InlineQueryResultCachedMpeg4Gif {
3109 pub fn new(id: String, mpeg4_file_id: String) -> Self {
3110 Self {
3111 id,
3112 mpeg4_file_id,
3113 title: None,
3114 caption: None,
3115 parse_mode: None,
3116 caption_entities: None,
3117 reply_markup: None,
3118 input_message_content: None,
3119 }
3120 }
3121}
3122
3123#[derive(Deserialize, Serialize, Debug, Clone)]
3125pub struct InlineQueryResultCachedSticker {
3126 pub id: String,
3128 pub sticker_file_id: String,
3130 #[serde(skip_serializing_if = "Option::is_none")]
3132 pub reply_markup: Option<InlineKeyboardMarkup>,
3133 pub input_message_content: Option<InputMessageContent>,
3135}
3136impl InlineQueryResultCachedSticker {
3137 pub fn new(id: String, sticker_file_id: String) -> Self {
3138 Self {
3139 id,
3140 sticker_file_id,
3141 reply_markup: None,
3142 input_message_content: None,
3143 }
3144 }
3145}
3146
3147#[derive(Deserialize, Serialize, Debug, Clone)]
3149pub struct InlineQueryResultCachedDocument {
3150 pub id: String,
3152 pub title: String,
3154 pub document_file_id: String,
3156 #[serde(skip_serializing_if = "Option::is_none")]
3158 pub description: Option<String>,
3159 #[serde(skip_serializing_if = "Option::is_none")]
3161 pub caption: Option<String>,
3162 #[serde(skip_serializing_if = "Option::is_none")]
3164 pub parse_mode: Option<String>,
3165 #[serde(skip_serializing_if = "Option::is_none")]
3167 pub caption_entities: Option<Vec<MessageEntity>>,
3168 #[serde(skip_serializing_if = "Option::is_none")]
3170 pub reply_markup: Option<InlineKeyboardMarkup>,
3171 #[serde(skip_serializing_if = "Option::is_none")]
3173 pub input_message_content: Option<InputMessageContent>,
3174}
3175impl InlineQueryResultCachedDocument {
3176 pub fn new(id: String, title: String, document_file_id: String) -> Self {
3177 Self {
3178 id,
3179 title,
3180 document_file_id,
3181 description: None,
3182 caption: None,
3183 parse_mode: None,
3184 caption_entities: None,
3185 reply_markup: None,
3186 input_message_content: None,
3187 }
3188 }
3189}
3190
3191#[derive(Deserialize, Serialize, Debug, Clone)]
3193pub struct InlineQueryResultCachedVideo {
3194 pub id: String,
3196 pub video_file_id: String,
3198 pub title: String,
3200 #[serde(skip_serializing_if = "Option::is_none")]
3202 pub description: Option<String>,
3203 #[serde(skip_serializing_if = "Option::is_none")]
3205 pub caption: Option<String>,
3206 #[serde(skip_serializing_if = "Option::is_none")]
3208 pub parse_mode: Option<String>,
3209 #[serde(skip_serializing_if = "Option::is_none")]
3211 pub caption_entities: Option<Vec<MessageEntity>>,
3212 #[serde(skip_serializing_if = "Option::is_none")]
3214 pub reply_markup: Option<InlineKeyboardMarkup>,
3215 #[serde(skip_serializing_if = "Option::is_none")]
3217 pub input_message_content: Option<InputMessageContent>,
3218}
3219impl InlineQueryResultCachedVideo {
3220 pub fn new(id: String, video_file_id: String, title: String) -> Self {
3221 Self {
3222 id,
3223 video_file_id,
3224 title,
3225 description: None,
3226 caption: None,
3227 parse_mode: None,
3228 caption_entities: None,
3229 reply_markup: None,
3230 input_message_content: None,
3231 }
3232 }
3233}
3234
3235#[derive(Deserialize, Serialize, Debug, Clone)]
3237pub struct InlineQueryResultCachedVoice {
3238 pub id: String,
3240 pub voice_file_id: String,
3242 pub title: String,
3244 #[serde(skip_serializing_if = "Option::is_none")]
3246 pub caption: Option<String>,
3247 #[serde(skip_serializing_if = "Option::is_none")]
3249 pub parse_mode: Option<String>,
3250 #[serde(skip_serializing_if = "Option::is_none")]
3252 pub caption_entities: Option<Vec<MessageEntity>>,
3253 #[serde(skip_serializing_if = "Option::is_none")]
3255 pub reply_markup: Option<InlineKeyboardMarkup>,
3256 #[serde(skip_serializing_if = "Option::is_none")]
3258 pub input_message_content: Option<InputMessageContent>,
3259}
3260impl InlineQueryResultCachedVoice {
3261 pub fn new(id: String, voice_file_id: String, title: String) -> Self {
3262 Self {
3263 id,
3264 voice_file_id,
3265 title,
3266 caption: None,
3267 parse_mode: None,
3268 caption_entities: None,
3269 reply_markup: None,
3270 input_message_content: None,
3271 }
3272 }
3273}
3274
3275#[derive(Deserialize, Serialize, Debug, Clone)]
3277pub struct InlineQueryResultCachedAudio {
3278 pub id: String,
3280 pub audio_file_id: String,
3282 #[serde(skip_serializing_if = "Option::is_none")]
3284 pub caption: Option<String>,
3285 #[serde(skip_serializing_if = "Option::is_none")]
3287 pub parse_mode: Option<String>,
3288 #[serde(skip_serializing_if = "Option::is_none")]
3290 pub caption_entities: Option<Vec<MessageEntity>>,
3291 #[serde(skip_serializing_if = "Option::is_none")]
3293 pub reply_markup: Option<InlineKeyboardMarkup>,
3294 #[serde(skip_serializing_if = "Option::is_none")]
3296 pub input_message_content: Option<InputMessageContent>,
3297}
3298impl InlineQueryResultCachedAudio {
3299 pub fn new(id: String, audio_file_id: String) -> Self {
3300 Self {
3301 id,
3302 audio_file_id,
3303 caption: None,
3304 parse_mode: None,
3305 caption_entities: None,
3306 reply_markup: None,
3307 input_message_content: None,
3308 }
3309 }
3310}
3311
3312#[derive(Deserialize, Serialize, Debug, Clone)]
3314pub struct InputTextMessageContent {
3315 pub message_text: String,
3317 #[serde(skip_serializing_if = "Option::is_none")]
3319 pub parse_mode: Option<String>,
3320 #[serde(skip_serializing_if = "Option::is_none")]
3322 pub entities: Option<Vec<MessageEntity>>,
3323 #[serde(skip_serializing_if = "Option::is_none")]
3325 pub disable_web_page_preview: Option<bool>,
3326}
3327impl InputTextMessageContent {
3328 pub fn new(message_text: String) -> Self {
3329 Self {
3330 message_text,
3331 parse_mode: None,
3332 entities: None,
3333 disable_web_page_preview: None,
3334 }
3335 }
3336}
3337
3338#[derive(Deserialize, Serialize, Debug, Clone)]
3340pub struct InputLocationMessageContent {
3341 pub latitude: f64,
3343 pub longitude: f64,
3345 #[serde(skip_serializing_if = "Option::is_none")]
3347 pub horizontal_accuracy: Option<f64>,
3348 #[serde(skip_serializing_if = "Option::is_none")]
3350 pub live_period: Option<i64>,
3351 #[serde(skip_serializing_if = "Option::is_none")]
3353 pub heading: Option<i64>,
3354 #[serde(skip_serializing_if = "Option::is_none")]
3356 pub proximity_alert_radius: Option<i64>,
3357}
3358impl InputLocationMessageContent {
3359 pub fn new(latitude: f64, longitude: f64) -> Self {
3360 Self {
3361 latitude,
3362 longitude,
3363 horizontal_accuracy: None,
3364 live_period: None,
3365 heading: None,
3366 proximity_alert_radius: None,
3367 }
3368 }
3369}
3370
3371#[derive(Deserialize, Serialize, Debug, Clone)]
3373pub struct InputVenueMessageContent {
3374 pub latitude: f64,
3376 pub longitude: f64,
3378 pub title: String,
3380 pub address: String,
3382 #[serde(skip_serializing_if = "Option::is_none")]
3384 pub foursquare_id: Option<String>,
3385 #[serde(skip_serializing_if = "Option::is_none")]
3387 pub foursquare_type: Option<String>,
3388 #[serde(skip_serializing_if = "Option::is_none")]
3390 pub google_place_id: Option<String>,
3391 #[serde(skip_serializing_if = "Option::is_none")]
3393 pub google_place_type: Option<String>,
3394}
3395impl InputVenueMessageContent {
3396 pub fn new(latitude: f64, longitude: f64, title: String, address: String) -> Self {
3397 Self {
3398 latitude,
3399 longitude,
3400 title,
3401 address,
3402 foursquare_id: None,
3403 foursquare_type: None,
3404 google_place_id: None,
3405 google_place_type: None,
3406 }
3407 }
3408}
3409
3410#[derive(Deserialize, Serialize, Debug, Clone)]
3412pub struct InputContactMessageContent {
3413 pub phone_number: String,
3415 pub first_name: String,
3417 #[serde(skip_serializing_if = "Option::is_none")]
3419 pub last_name: Option<String>,
3420 #[serde(skip_serializing_if = "Option::is_none")]
3422 pub vcard: Option<String>,
3423}
3424impl InputContactMessageContent {
3425 pub fn new(phone_number: String, first_name: String) -> Self {
3426 Self {
3427 phone_number,
3428 first_name,
3429 last_name: None,
3430 vcard: None,
3431 }
3432 }
3433}
3434
3435#[derive(Deserialize, Serialize, Debug, Clone)]
3437pub struct InputInvoiceMessageContent {
3438 pub title: String,
3440 pub description: String,
3442 pub payload: String,
3444 pub provider_token: String,
3446 pub currency: String,
3448 pub prices: Vec<LabeledPrice>,
3450 #[serde(skip_serializing_if = "Option::is_none")]
3452 pub max_tip_amount: Option<i64>,
3453 #[serde(skip_serializing_if = "Option::is_none")]
3455 pub suggested_tip_amounts: Option<Vec<i64>>,
3456 #[serde(skip_serializing_if = "Option::is_none")]
3458 pub provider_data: Option<String>,
3459 #[serde(skip_serializing_if = "Option::is_none")]
3461 pub photo_url: Option<String>,
3462 #[serde(skip_serializing_if = "Option::is_none")]
3464 pub photo_size: Option<i64>,
3465 #[serde(skip_serializing_if = "Option::is_none")]
3467 pub photo_width: Option<i64>,
3468 #[serde(skip_serializing_if = "Option::is_none")]
3470 pub photo_height: Option<i64>,
3471 #[serde(skip_serializing_if = "Option::is_none")]
3473 pub need_name: Option<bool>,
3474 #[serde(skip_serializing_if = "Option::is_none")]
3476 pub need_phone_number: Option<bool>,
3477 #[serde(skip_serializing_if = "Option::is_none")]
3479 pub need_email: Option<bool>,
3480 #[serde(skip_serializing_if = "Option::is_none")]
3482 pub need_shipping_address: Option<bool>,
3483 #[serde(skip_serializing_if = "Option::is_none")]
3485 pub send_phone_number_to_provider: Option<bool>,
3486 #[serde(skip_serializing_if = "Option::is_none")]
3488 pub send_email_to_provider: Option<bool>,
3489 #[serde(skip_serializing_if = "Option::is_none")]
3491 pub is_flexible: Option<bool>,
3492}
3493impl InputInvoiceMessageContent {
3494 pub fn new(
3495 title: String,
3496 description: String,
3497 payload: String,
3498 provider_token: String,
3499 currency: String,
3500 prices: Vec<LabeledPrice>,
3501 ) -> Self {
3502 Self {
3503 title,
3504 description,
3505 payload,
3506 provider_token,
3507 currency,
3508 prices,
3509 max_tip_amount: None,
3510 suggested_tip_amounts: None,
3511 provider_data: None,
3512 photo_url: None,
3513 photo_size: None,
3514 photo_width: None,
3515 photo_height: None,
3516 need_name: None,
3517 need_phone_number: None,
3518 need_email: None,
3519 need_shipping_address: None,
3520 send_phone_number_to_provider: None,
3521 send_email_to_provider: None,
3522 is_flexible: None,
3523 }
3524 }
3525}
3526
3527#[derive(Deserialize, Serialize, Debug, Clone)]
3529pub struct ChosenInlineResult {
3530 pub result_id: String,
3532 pub from: User,
3534 #[serde(skip_serializing_if = "Option::is_none")]
3536 pub location: Option<Location>,
3537 #[serde(skip_serializing_if = "Option::is_none")]
3539 pub inline_message_id: Option<String>,
3540 pub query: String,
3542}
3543impl ChosenInlineResult {
3544 pub fn new(result_id: String, from: User, query: String) -> Self {
3545 Self {
3546 result_id,
3547 from,
3548 location: None,
3549 inline_message_id: None,
3550 query,
3551 }
3552 }
3553}
3554
3555#[derive(Deserialize, Serialize, Debug, Clone)]
3557pub struct SentWebAppMessage {
3558 #[serde(skip_serializing_if = "Option::is_none")]
3560 pub inline_message_id: Option<String>,
3561}
3562impl SentWebAppMessage {
3563 pub fn new() -> Self {
3564 Self {
3565 inline_message_id: None,
3566 }
3567 }
3568}
3569
3570#[derive(Deserialize, Serialize, Debug, Clone)]
3572pub struct LabeledPrice {
3573 pub label: String,
3575 pub amount: i64,
3577}
3578impl LabeledPrice {
3579 pub fn new(label: String, amount: i64) -> Self {
3580 Self { label, amount }
3581 }
3582}
3583
3584#[derive(Deserialize, Serialize, Debug, Clone)]
3586pub struct Invoice {
3587 pub title: String,
3589 pub description: String,
3591 pub start_parameter: String,
3593 pub currency: String,
3595 pub total_amount: i64,
3597}
3598impl Invoice {
3599 pub fn new(
3600 title: String,
3601 description: String,
3602 start_parameter: String,
3603 currency: String,
3604 total_amount: i64,
3605 ) -> Self {
3606 Self {
3607 title,
3608 description,
3609 start_parameter,
3610 currency,
3611 total_amount,
3612 }
3613 }
3614}
3615
3616#[derive(Deserialize, Serialize, Debug, Clone)]
3618pub struct ShippingAddress {
3619 pub country_code: String,
3621 pub state: String,
3623 pub city: String,
3625 pub street_line1: String,
3627 pub street_line2: String,
3629 pub post_code: String,
3631}
3632impl ShippingAddress {
3633 pub fn new(
3634 country_code: String,
3635 state: String,
3636 city: String,
3637 street_line1: String,
3638 street_line2: String,
3639 post_code: String,
3640 ) -> Self {
3641 Self {
3642 country_code,
3643 state,
3644 city,
3645 street_line1,
3646 street_line2,
3647 post_code,
3648 }
3649 }
3650}
3651
3652#[derive(Deserialize, Serialize, Debug, Clone)]
3654pub struct OrderInfo {
3655 #[serde(skip_serializing_if = "Option::is_none")]
3657 pub name: Option<String>,
3658 #[serde(skip_serializing_if = "Option::is_none")]
3660 pub phone_number: Option<String>,
3661 #[serde(skip_serializing_if = "Option::is_none")]
3663 pub email: Option<String>,
3664 #[serde(skip_serializing_if = "Option::is_none")]
3666 pub shipping_address: Option<ShippingAddress>,
3667}
3668impl OrderInfo {
3669 pub fn new() -> Self {
3670 Self {
3671 name: None,
3672 phone_number: None,
3673 email: None,
3674 shipping_address: None,
3675 }
3676 }
3677}
3678
3679#[derive(Deserialize, Serialize, Debug, Clone)]
3681pub struct ShippingOption {
3682 pub id: String,
3684 pub title: String,
3686 pub prices: Vec<LabeledPrice>,
3688}
3689impl ShippingOption {
3690 pub fn new(id: String, title: String, prices: Vec<LabeledPrice>) -> Self {
3691 Self { id, title, prices }
3692 }
3693}
3694
3695#[derive(Deserialize, Serialize, Debug, Clone)]
3697pub struct SuccessfulPayment {
3698 pub currency: String,
3700 pub total_amount: i64,
3702 pub invoice_payload: String,
3704 #[serde(skip_serializing_if = "Option::is_none")]
3706 pub shipping_option_id: Option<String>,
3707 #[serde(skip_serializing_if = "Option::is_none")]
3709 pub order_info: Option<OrderInfo>,
3710 pub telegram_payment_charge_id: String,
3712 pub provider_payment_charge_id: String,
3714}
3715impl SuccessfulPayment {
3716 pub fn new(
3717 currency: String,
3718 total_amount: i64,
3719 invoice_payload: String,
3720 telegram_payment_charge_id: String,
3721 provider_payment_charge_id: String,
3722 ) -> Self {
3723 Self {
3724 currency,
3725 total_amount,
3726 invoice_payload,
3727 shipping_option_id: None,
3728 order_info: None,
3729 telegram_payment_charge_id,
3730 provider_payment_charge_id,
3731 }
3732 }
3733}
3734
3735#[derive(Deserialize, Serialize, Debug, Clone)]
3737pub struct ShippingQuery {
3738 pub id: String,
3740 pub from: User,
3742 pub invoice_payload: String,
3744 pub shipping_address: ShippingAddress,
3746}
3747impl ShippingQuery {
3748 pub fn new(
3749 id: String,
3750 from: User,
3751 invoice_payload: String,
3752 shipping_address: ShippingAddress,
3753 ) -> Self {
3754 Self {
3755 id,
3756 from,
3757 invoice_payload,
3758 shipping_address,
3759 }
3760 }
3761}
3762
3763#[derive(Deserialize, Serialize, Debug, Clone)]
3765pub struct PreCheckoutQuery {
3766 pub id: String,
3768 pub from: User,
3770 pub currency: String,
3772 pub total_amount: i64,
3774 pub invoice_payload: String,
3776 #[serde(skip_serializing_if = "Option::is_none")]
3778 pub shipping_option_id: Option<String>,
3779 #[serde(skip_serializing_if = "Option::is_none")]
3781 pub order_info: Option<OrderInfo>,
3782}
3783impl PreCheckoutQuery {
3784 pub fn new(
3785 id: String,
3786 from: User,
3787 currency: String,
3788 total_amount: i64,
3789 invoice_payload: String,
3790 ) -> Self {
3791 Self {
3792 id,
3793 from,
3794 currency,
3795 total_amount,
3796 invoice_payload,
3797 shipping_option_id: None,
3798 order_info: None,
3799 }
3800 }
3801}
3802
3803#[derive(Deserialize, Serialize, Debug, Clone)]
3805pub struct PassportData {
3806 pub data: Vec<EncryptedPassportElement>,
3808 pub credentials: EncryptedCredentials,
3810}
3811impl PassportData {
3812 pub fn new(data: Vec<EncryptedPassportElement>, credentials: EncryptedCredentials) -> Self {
3813 Self { data, credentials }
3814 }
3815}
3816
3817#[derive(Deserialize, Serialize, Debug, Clone)]
3819pub struct PassportFile {
3820 pub file_id: String,
3822 pub file_unique_id: String,
3824 pub file_size: i64,
3826 pub file_date: i64,
3828}
3829impl PassportFile {
3830 pub fn new(file_id: String, file_unique_id: String, file_size: i64, file_date: i64) -> Self {
3831 Self {
3832 file_id,
3833 file_unique_id,
3834 file_size,
3835 file_date,
3836 }
3837 }
3838}
3839
3840#[derive(Deserialize, Serialize, Debug, Clone)]
3842pub struct EncryptedPassportElement {
3843 #[serde(rename = "type")]
3845 pub type_name: String,
3846 #[serde(skip_serializing_if = "Option::is_none")]
3848 pub data: Option<String>,
3849 #[serde(skip_serializing_if = "Option::is_none")]
3851 pub phone_number: Option<String>,
3852 #[serde(skip_serializing_if = "Option::is_none")]
3854 pub email: Option<String>,
3855 #[serde(skip_serializing_if = "Option::is_none")]
3857 pub files: Option<Vec<PassportFile>>,
3858 #[serde(skip_serializing_if = "Option::is_none")]
3860 pub front_side: Option<PassportFile>,
3861 #[serde(skip_serializing_if = "Option::is_none")]
3863 pub reverse_side: Option<PassportFile>,
3864 #[serde(skip_serializing_if = "Option::is_none")]
3866 pub selfie: Option<PassportFile>,
3867 #[serde(skip_serializing_if = "Option::is_none")]
3869 pub translation: Option<Vec<PassportFile>>,
3870 pub hash: String,
3872}
3873impl EncryptedPassportElement {
3874 pub fn new(type_name: String, hash: String) -> Self {
3875 Self {
3876 type_name,
3877 data: None,
3878 phone_number: None,
3879 email: None,
3880 files: None,
3881 front_side: None,
3882 reverse_side: None,
3883 selfie: None,
3884 translation: None,
3885 hash,
3886 }
3887 }
3888}
3889
3890#[derive(Deserialize, Serialize, Debug, Clone)]
3892pub struct EncryptedCredentials {
3893 pub data: String,
3895 pub hash: String,
3897 pub secret: String,
3899}
3900impl EncryptedCredentials {
3901 pub fn new(data: String, hash: String, secret: String) -> Self {
3902 Self { data, hash, secret }
3903 }
3904}
3905
3906#[derive(Deserialize, Serialize, Debug, Clone)]
3908pub struct PassportElementErrorDataField {
3909 pub source: String,
3911 #[serde(rename = "type")]
3913 pub type_name: String,
3914 pub field_name: String,
3916 pub data_hash: String,
3918 pub message: String,
3920}
3921impl PassportElementErrorDataField {
3922 pub fn new(
3923 source: String,
3924 type_name: String,
3925 field_name: String,
3926 data_hash: String,
3927 message: String,
3928 ) -> Self {
3929 Self {
3930 source,
3931 type_name,
3932 field_name,
3933 data_hash,
3934 message,
3935 }
3936 }
3937}
3938
3939#[derive(Deserialize, Serialize, Debug, Clone)]
3941pub struct PassportElementErrorFrontSide {
3942 pub source: String,
3944 #[serde(rename = "type")]
3946 pub type_name: String,
3947 pub file_hash: String,
3949 pub message: String,
3951}
3952impl PassportElementErrorFrontSide {
3953 pub fn new(source: String, type_name: String, file_hash: String, message: String) -> Self {
3954 Self {
3955 source,
3956 type_name,
3957 file_hash,
3958 message,
3959 }
3960 }
3961}
3962
3963#[derive(Deserialize, Serialize, Debug, Clone)]
3965pub struct PassportElementErrorReverseSide {
3966 pub source: String,
3968 #[serde(rename = "type")]
3970 pub type_name: String,
3971 pub file_hash: String,
3973 pub message: String,
3975}
3976impl PassportElementErrorReverseSide {
3977 pub fn new(source: String, type_name: String, file_hash: String, message: String) -> Self {
3978 Self {
3979 source,
3980 type_name,
3981 file_hash,
3982 message,
3983 }
3984 }
3985}
3986
3987#[derive(Deserialize, Serialize, Debug, Clone)]
3989pub struct PassportElementErrorSelfie {
3990 pub source: String,
3992 #[serde(rename = "type")]
3994 pub type_name: String,
3995 pub file_hash: String,
3997 pub message: String,
3999}
4000impl PassportElementErrorSelfie {
4001 pub fn new(source: String, type_name: String, file_hash: String, message: String) -> Self {
4002 Self {
4003 source,
4004 type_name,
4005 file_hash,
4006 message,
4007 }
4008 }
4009}
4010
4011#[derive(Deserialize, Serialize, Debug, Clone)]
4013pub struct PassportElementErrorFile {
4014 pub source: String,
4016 #[serde(rename = "type")]
4018 pub type_name: String,
4019 pub file_hash: String,
4021 pub message: String,
4023}
4024impl PassportElementErrorFile {
4025 pub fn new(source: String, type_name: String, file_hash: String, message: String) -> Self {
4026 Self {
4027 source,
4028 type_name,
4029 file_hash,
4030 message,
4031 }
4032 }
4033}
4034
4035#[derive(Deserialize, Serialize, Debug, Clone)]
4037pub struct PassportElementErrorFiles {
4038 pub source: String,
4040 #[serde(rename = "type")]
4042 pub type_name: String,
4043 pub file_hashes: Vec<String>,
4045 pub message: String,
4047}
4048impl PassportElementErrorFiles {
4049 pub fn new(
4050 source: String,
4051 type_name: String,
4052 file_hashes: Vec<String>,
4053 message: String,
4054 ) -> Self {
4055 Self {
4056 source,
4057 type_name,
4058 file_hashes,
4059 message,
4060 }
4061 }
4062}
4063
4064#[derive(Deserialize, Serialize, Debug, Clone)]
4066pub struct PassportElementErrorTranslationFile {
4067 pub source: String,
4069 #[serde(rename = "type")]
4071 pub type_name: String,
4072 pub file_hash: String,
4074 pub message: String,
4076}
4077impl PassportElementErrorTranslationFile {
4078 pub fn new(source: String, type_name: String, file_hash: String, message: String) -> Self {
4079 Self {
4080 source,
4081 type_name,
4082 file_hash,
4083 message,
4084 }
4085 }
4086}
4087
4088#[derive(Deserialize, Serialize, Debug, Clone)]
4090pub struct PassportElementErrorTranslationFiles {
4091 pub source: String,
4093 #[serde(rename = "type")]
4095 pub type_name: String,
4096 pub file_hashes: Vec<String>,
4098 pub message: String,
4100}
4101impl PassportElementErrorTranslationFiles {
4102 pub fn new(
4103 source: String,
4104 type_name: String,
4105 file_hashes: Vec<String>,
4106 message: String,
4107 ) -> Self {
4108 Self {
4109 source,
4110 type_name,
4111 file_hashes,
4112 message,
4113 }
4114 }
4115}
4116
4117#[derive(Deserialize, Serialize, Debug, Clone)]
4119pub struct PassportElementErrorUnspecified {
4120 pub source: String,
4122 #[serde(rename = "type")]
4124 pub type_name: String,
4125 pub element_hash: String,
4127 pub message: String,
4129}
4130impl PassportElementErrorUnspecified {
4131 pub fn new(source: String, type_name: String, element_hash: String, message: String) -> Self {
4132 Self {
4133 source,
4134 type_name,
4135 element_hash,
4136 message,
4137 }
4138 }
4139}
4140
4141#[derive(Deserialize, Serialize, Debug, Clone)]
4143pub struct Game {
4144 pub title: String,
4146 pub description: String,
4148 pub photo: Vec<PhotoSize>,
4150 #[serde(skip_serializing_if = "Option::is_none")]
4152 pub text: Option<String>,
4153 #[serde(skip_serializing_if = "Option::is_none")]
4155 pub text_entities: Option<Vec<MessageEntity>>,
4156 #[serde(skip_serializing_if = "Option::is_none")]
4158 pub animation: Option<Animation>,
4159}
4160impl Game {
4161 pub fn new(title: String, description: String, photo: Vec<PhotoSize>) -> Self {
4162 Self {
4163 title,
4164 description,
4165 photo,
4166 text: None,
4167 text_entities: None,
4168 animation: None,
4169 }
4170 }
4171}
4172
4173#[derive(Deserialize, Serialize, Debug, Clone)]
4175pub struct CallbackGame {}
4176impl CallbackGame {
4177 pub fn new() -> Self {
4178 Self {}
4179 }
4180}
4181
4182#[derive(Deserialize, Serialize, Debug, Clone)]
4184pub struct GameHighScore {
4185 pub position: i64,
4187 pub user: User,
4189 pub score: i64,
4191}
4192impl GameHighScore {
4193 pub fn new(position: i64, user: User, score: i64) -> Self {
4194 Self {
4195 position,
4196 user,
4197 score,
4198 }
4199 }
4200}
4201
4202pub type Params = HashMap<String, Value>;
4204
4205#[derive(Deserialize, Serialize, Debug, Clone)]
4207#[serde(untagged)]
4208pub enum ChatId {
4209 IntType(i64),
4211 StringType(String),
4213}
4214
4215#[derive(Deserialize, Serialize, Debug, Clone)]
4217#[serde(untagged)]
4218pub enum InputFile {
4219 FileID(String),
4221 FileURL(String),
4223 FileAttach(String),
4225 FileBytes(String, Vec<u8>),
4227 FilePath(String),
4229}
4230
4231pub enum InputFileResult {
4233 Text(String),
4235 Part(reqwest::multipart::Part),
4237}
4238
4239impl InputFile {
4240 pub fn need_upload(&self) -> bool {
4241 matches!(self, InputFile::FileBytes(_, _) | InputFile::FilePath(_))
4242 }
4243
4244 pub async fn data(&self) -> Result<InputFileResult, Box<dyn std::error::Error>> {
4245 match self {
4246 InputFile::FileID(id) => Ok(InputFileResult::Text(id.clone())),
4247 InputFile::FileURL(url) => Ok(InputFileResult::Text(url.clone())),
4248 InputFile::FileAttach(attach) => Ok(InputFileResult::Text(attach.clone())),
4249 InputFile::FileBytes(file_name, bytes) => Ok(InputFileResult::Part(
4250 reqwest::multipart::Part::bytes(bytes.clone()).file_name(file_name.to_string()),
4251 )),
4252 InputFile::FilePath(path) => Ok(InputFileResult::Part(
4253 reqwest::multipart::Part::stream(reqwest::Body::wrap_stream(
4254 tokio_util::codec::FramedRead::new(
4255 tokio::fs::File::open(path).await?,
4256 tokio_util::codec::BytesCodec::new(),
4257 ),
4258 ))
4259 .file_name(path.to_string()),
4260 )),
4261 }
4262 }
4263}
4264
4265#[derive(Deserialize, Serialize, Debug, Clone)]
4267#[serde(untagged)]
4268pub enum ReplyMarkup {
4269 InlineKeyboardMarkup(InlineKeyboardMarkup),
4270 ReplyKeyboardMarkup(ReplyKeyboardMarkup),
4271 ReplyKeyboardRemove(ReplyKeyboardRemove),
4272 ForceReply(ForceReply),
4273}
4274#[derive(Deserialize, Serialize, Debug, Clone)]
4284#[serde(tag = "status")]
4285pub enum ChatMember {
4286 #[serde(rename = "creator")]
4287 ChatMemberOwner(ChatMemberOwner),
4288 #[serde(rename = "administrator")]
4289 ChatMemberAdministrator(ChatMemberAdministrator),
4290 #[serde(rename = "member")]
4291 ChatMemberMember(ChatMemberMember),
4292 #[serde(rename = "restricted")]
4293 ChatMemberRestricted(ChatMemberRestricted),
4294 #[serde(rename = "left")]
4295 ChatMemberLeft(ChatMemberLeft),
4296 #[serde(rename = "kicked")]
4297 ChatMemberBanned(ChatMemberBanned),
4298}
4299
4300#[derive(Deserialize, Serialize, Debug, Clone)]
4311#[serde(tag = "type")]
4312pub enum BotCommandScope {
4313 #[serde(rename = "default")]
4314 BotCommandScopeDefault(BotCommandScopeDefault),
4315 #[serde(rename = "all_private_chats")]
4316 BotCommandScopeAllPrivateChats(BotCommandScopeAllPrivateChats),
4317 #[serde(rename = "all_group_chats")]
4318 BotCommandScopeAllGroupChats(BotCommandScopeAllGroupChats),
4319 #[serde(rename = "all_chat_administrators")]
4320 BotCommandScopeAllChatAdministrators(BotCommandScopeAllChatAdministrators),
4321 #[serde(rename = "chat")]
4322 BotCommandScopeChat(BotCommandScopeChat),
4323 #[serde(rename = "chat_administrators")]
4324 BotCommandScopeChatAdministrators(BotCommandScopeChatAdministrators),
4325 #[serde(rename = "chat_member")]
4326 BotCommandScopeChatMember(BotCommandScopeChatMember),
4327}
4328
4329#[derive(Deserialize, Serialize, Debug, Clone)]
4337#[serde(tag = "type")]
4338pub enum MenuButton {
4339 #[serde(rename = "commands")]
4340 MenuButtonCommands(MenuButtonCommands),
4341 #[serde(rename = "web_app")]
4342 MenuButtonWebApp(MenuButtonWebApp),
4343 #[serde(rename = "default")]
4344 MenuButtonDefault(MenuButtonDefault),
4345}
4346
4347#[derive(Deserialize, Serialize, Debug, Clone)]
4356#[serde(tag = "type")]
4357pub enum InputMedia {
4358 #[serde(rename = "animation")]
4359 InputMediaAnimation(InputMediaAnimation),
4360 #[serde(rename = "document")]
4361 InputMediaDocument(InputMediaDocument),
4362 #[serde(rename = "audio")]
4363 InputMediaAudio(InputMediaAudio),
4364 #[serde(rename = "photo")]
4365 InputMediaPhoto(InputMediaPhoto),
4366 #[serde(rename = "video")]
4367 InputMediaVideo(InputMediaVideo),
4368}
4369
4370impl InputMedia {
4371 pub fn prepare_input_media_param(&self, idx: i32) -> Self {
4382 match self {
4383 InputMedia::InputMediaAnimation(animation) => {
4384 let mut media = animation.media.clone();
4385 if media.need_upload() {
4386 media = Self::attach_file(idx);
4387 }
4388 let mut thumb: Option<InputFile> = None;
4389 if let Some(some_thumb) = &animation.thumb {
4390 if some_thumb.need_upload() {
4391 thumb = Some(Self::attach_thumb_file(idx));
4392 }
4393 }
4394 Self::InputMediaAnimation(InputMediaAnimation {
4395 media,
4396 thumb,
4397 ..animation.clone()
4398 })
4399 }
4400 InputMedia::InputMediaDocument(document) => {
4401 let mut media = document.media.clone();
4402 if media.need_upload() {
4403 media = Self::attach_file(idx);
4404 }
4405 let mut thumb: Option<InputFile> = None;
4406 if let Some(some_thumb) = &document.thumb {
4407 if some_thumb.need_upload() {
4408 thumb = Some(Self::attach_thumb_file(idx));
4409 }
4410 }
4411 Self::InputMediaDocument(InputMediaDocument {
4412 media,
4413 thumb,
4414 ..document.clone()
4415 })
4416 }
4417 InputMedia::InputMediaAudio(audio) => {
4418 let mut media = audio.media.clone();
4419 if media.need_upload() {
4420 media = Self::attach_file(idx);
4421 }
4422 let mut thumb: Option<InputFile> = None;
4423 if let Some(some_thumb) = &audio.thumb {
4424 if some_thumb.need_upload() {
4425 thumb = Some(Self::attach_thumb_file(idx));
4426 }
4427 }
4428 Self::InputMediaAudio(InputMediaAudio {
4429 media,
4430 thumb,
4431 ..audio.clone()
4432 })
4433 }
4434 InputMedia::InputMediaPhoto(photo) => {
4435 if !photo.media.need_upload() {
4436 return self.clone();
4437 }
4438 Self::InputMediaPhoto(InputMediaPhoto {
4439 media: Self::attach_file(idx),
4440 ..photo.clone()
4441 })
4442 }
4443 InputMedia::InputMediaVideo(video) => {
4444 let mut media = video.media.clone();
4445 if media.need_upload() {
4446 media = Self::attach_file(idx);
4447 }
4448 let mut thumb: Option<InputFile> = None;
4449 if let Some(some_thumb) = &video.thumb {
4450 if some_thumb.need_upload() {
4451 thumb = Some(Self::attach_thumb_file(idx));
4452 }
4453 }
4454 Self::InputMediaVideo(InputMediaVideo {
4455 media,
4456 thumb,
4457 ..video.clone()
4458 })
4459 }
4460 }
4461 }
4462
4463 pub fn prepare_input_media_file(&self, idx: i32) -> Vec<(String, InputFile)> {
4472 let mut result: Vec<(String, InputFile)> = Vec::new();
4473 match self {
4474 InputMedia::InputMediaAnimation(animation) => {
4475 let media = animation.media.clone();
4476 if media.need_upload() {
4477 result.push((Self::attach_file_name(idx), media.clone()));
4478 }
4479 if let Some(thumb) = &animation.thumb {
4480 if thumb.need_upload() {
4481 result.push((Self::attach_thumb_file_name(idx), thumb.clone()));
4482 }
4483 }
4484 }
4485 InputMedia::InputMediaDocument(document) => {
4486 let media = document.media.clone();
4487 if media.need_upload() {
4488 result.push((Self::attach_file_name(idx), media.clone()));
4489 }
4490 if let Some(thumb) = &document.thumb {
4491 if thumb.need_upload() {
4492 result.push((Self::attach_thumb_file_name(idx), thumb.clone()));
4493 }
4494 }
4495 }
4496 InputMedia::InputMediaAudio(audio) => {
4497 let media = audio.media.clone();
4498 if media.need_upload() {
4499 result.push((Self::attach_file_name(idx), media.clone()));
4500 }
4501 if let Some(thumb) = &audio.thumb {
4502 if thumb.need_upload() {
4503 result.push((Self::attach_thumb_file_name(idx), thumb.clone()));
4504 }
4505 }
4506 }
4507 InputMedia::InputMediaPhoto(photo) => {
4508 if photo.media.need_upload() {
4509 result.push((Self::attach_file_name(idx), photo.media.clone()));
4510 }
4511 }
4512 InputMedia::InputMediaVideo(video) => {
4513 let media = video.media.clone();
4514 if media.need_upload() {
4515 result.push((Self::attach_file_name(idx), media.clone()));
4516 }
4517 if let Some(thumb) = &video.thumb {
4518 if thumb.need_upload() {
4519 result.push((Self::attach_thumb_file_name(idx), thumb.clone()));
4520 }
4521 }
4522 }
4523 }
4524 result
4525 }
4526
4527 fn attach_file_name(idx: i32) -> String {
4528 format!("file-{}", idx)
4529 }
4530
4531 fn attach_thumb_file_name(idx: i32) -> String {
4532 format!("file-{}-thumb", idx)
4533 }
4534
4535 fn attach_file(idx: i32) -> InputFile {
4536 InputFile::FileAttach(format!("attach://file-{}", idx))
4537 }
4538
4539 fn attach_thumb_file(idx: i32) -> InputFile {
4540 InputFile::FileAttach(format!("attach://file-{}-thumb", idx))
4541 }
4542}
4543
4544#[derive(Deserialize, Serialize, Debug, Clone)]
4546#[serde(untagged)]
4547pub enum MayBeMessage {
4548 Message(Message),
4549 Bool(bool),
4550}
4551
4552impl Chat {
4553 pub fn new_private(id: i64) -> Self {
4554 Self::new(id, ChatType::Private)
4555 }
4556 pub fn new_group(id: i64) -> Self {
4557 Self::new(id, ChatType::Group)
4558 }
4559 pub fn new_super_group(id: i64) -> Self {
4560 Self::new(id, ChatType::Supergroup)
4561 }
4562 pub fn new_channel(id: i64) -> Self {
4563 Self::new(id, ChatType::Channel)
4564 }
4565 pub fn is_private(&self) -> bool {
4566 matches!(self.type_name, ChatType::Private)
4567 }
4568 pub fn is_group(&self) -> bool {
4569 matches!(self.type_name, ChatType::Group)
4570 }
4571 pub fn is_super_group(&self) -> bool {
4572 matches!(self.type_name, ChatType::Supergroup)
4573 }
4574 pub fn is_channel(&self) -> bool {
4575 matches!(self.type_name, ChatType::Channel)
4576 }
4577}
4578
4579impl MessageEntity {
4580 pub fn new_mention(offset: i64, length: i64) -> Self {
4581 Self::new("mention".to_string(), offset, length)
4582 }
4583 pub fn new_hashtag(offset: i64, length: i64) -> Self {
4584 Self::new("hashtag".to_string(), offset, length)
4585 }
4586 pub fn new_cashtag(offset: i64, length: i64) -> Self {
4587 Self::new("cashtag".to_string(), offset, length)
4588 }
4589 pub fn new_bot_command(offset: i64, length: i64) -> Self {
4590 Self::new("bot_command".to_string(), offset, length)
4591 }
4592 pub fn new_url(offset: i64, length: i64) -> Self {
4593 Self::new("url".to_string(), offset, length)
4594 }
4595 pub fn new_email(offset: i64, length: i64) -> Self {
4596 Self::new("email".to_string(), offset, length)
4597 }
4598 pub fn new_phone_number(offset: i64, length: i64) -> Self {
4599 Self::new("phone_number".to_string(), offset, length)
4600 }
4601 pub fn new_bold(offset: i64, length: i64) -> Self {
4602 Self::new("bold".to_string(), offset, length)
4603 }
4604 pub fn new_italic(offset: i64, length: i64) -> Self {
4605 Self::new("italic".to_string(), offset, length)
4606 }
4607 pub fn new_underline(offset: i64, length: i64) -> Self {
4608 Self::new("underline".to_string(), offset, length)
4609 }
4610 pub fn new_strikethrough(offset: i64, length: i64) -> Self {
4611 Self::new("strikethrough".to_string(), offset, length)
4612 }
4613 pub fn new_code(offset: i64, length: i64) -> Self {
4614 Self::new("code".to_string(), offset, length)
4615 }
4616 pub fn new_pre(offset: i64, length: i64) -> Self {
4617 Self::new("pre".to_string(), offset, length)
4618 }
4619 pub fn new_text_link(offset: i64, length: i64) -> Self {
4620 Self::new("text_link".to_string(), offset, length)
4621 }
4622 pub fn new_text_mention(offset: i64, length: i64) -> Self {
4623 Self::new("text_mention".to_string(), offset, length)
4624 }
4625}
4626
4627impl Sticker {
4628 pub fn new_regular(
4629 file_id: String,
4630 file_unique_id: String,
4631 width: i64,
4632 height: i64,
4633 is_animated: bool,
4634 is_video: bool,
4635 ) -> Self {
4636 Self::new(
4637 file_id,
4638 file_unique_id,
4639 "regular".to_string(),
4640 width,
4641 height,
4642 is_animated,
4643 is_video,
4644 )
4645 }
4646 pub fn new_mask(
4647 file_id: String,
4648 file_unique_id: String,
4649 width: i64,
4650 height: i64,
4651 is_animated: bool,
4652 is_video: bool,
4653 ) -> Self {
4654 Self::new(
4655 file_id,
4656 file_unique_id,
4657 "mask".to_string(),
4658 width,
4659 height,
4660 is_animated,
4661 is_video,
4662 )
4663 }
4664 pub fn new_custom_emoji(
4665 file_id: String,
4666 file_unique_id: String,
4667 width: i64,
4668 height: i64,
4669 is_animated: bool,
4670 is_video: bool,
4671 ) -> Self {
4672 Self::new(
4673 file_id,
4674 file_unique_id,
4675 "custom_emoji".to_string(),
4676 width,
4677 height,
4678 is_animated,
4679 is_video,
4680 )
4681 }
4682}
4683
4684impl PassportElementErrorDataField {
4685 pub fn new_personal_details(
4686 source: String,
4687 field_name: String,
4688 data_hash: String,
4689 message: String,
4690 ) -> Self {
4691 Self::new(
4692 source,
4693 "personal_details".to_string(),
4694 field_name,
4695 data_hash,
4696 message,
4697 )
4698 }
4699 pub fn new_passport(
4700 source: String,
4701 field_name: String,
4702 data_hash: String,
4703 message: String,
4704 ) -> Self {
4705 Self::new(
4706 source,
4707 "passport".to_string(),
4708 field_name,
4709 data_hash,
4710 message,
4711 )
4712 }
4713 pub fn new_driver_license(
4714 source: String,
4715 field_name: String,
4716 data_hash: String,
4717 message: String,
4718 ) -> Self {
4719 Self::new(
4720 source,
4721 "driver_license".to_string(),
4722 field_name,
4723 data_hash,
4724 message,
4725 )
4726 }
4727 pub fn new_identity_card(
4728 source: String,
4729 field_name: String,
4730 data_hash: String,
4731 message: String,
4732 ) -> Self {
4733 Self::new(
4734 source,
4735 "identity_card".to_string(),
4736 field_name,
4737 data_hash,
4738 message,
4739 )
4740 }
4741 pub fn new_internal_passport(
4742 source: String,
4743 field_name: String,
4744 data_hash: String,
4745 message: String,
4746 ) -> Self {
4747 Self::new(
4748 source,
4749 "internal_passport".to_string(),
4750 field_name,
4751 data_hash,
4752 message,
4753 )
4754 }
4755 pub fn new_address(
4756 source: String,
4757 field_name: String,
4758 data_hash: String,
4759 message: String,
4760 ) -> Self {
4761 Self::new(
4762 source,
4763 "address".to_string(),
4764 field_name,
4765 data_hash,
4766 message,
4767 )
4768 }
4769}
4770
4771impl PassportElementErrorFrontSide {
4772 pub fn new_passport(source: String, file_hash: String, message: String) -> Self {
4773 Self::new(source, "passport".to_string(), file_hash, message)
4774 }
4775 pub fn new_driver_license(source: String, file_hash: String, message: String) -> Self {
4776 Self::new(source, "driver_license".to_string(), file_hash, message)
4777 }
4778 pub fn new_identity_card(source: String, file_hash: String, message: String) -> Self {
4779 Self::new(source, "identity_card".to_string(), file_hash, message)
4780 }
4781 pub fn new_internal_passport(source: String, file_hash: String, message: String) -> Self {
4782 Self::new(source, "internal_passport".to_string(), file_hash, message)
4783 }
4784}
4785
4786impl PassportElementErrorReverseSide {
4787 pub fn new_driver_license(source: String, file_hash: String, message: String) -> Self {
4788 Self::new(source, "driver_license".to_string(), file_hash, message)
4789 }
4790 pub fn new_identity_card(source: String, file_hash: String, message: String) -> Self {
4791 Self::new(source, "identity_card".to_string(), file_hash, message)
4792 }
4793}
4794
4795impl PassportElementErrorSelfie {
4796 pub fn new_passport(source: String, file_hash: String, message: String) -> Self {
4797 Self::new(source, "passport".to_string(), file_hash, message)
4798 }
4799 pub fn new_driver_license(source: String, file_hash: String, message: String) -> Self {
4800 Self::new(source, "driver_license".to_string(), file_hash, message)
4801 }
4802 pub fn new_identity_card(source: String, file_hash: String, message: String) -> Self {
4803 Self::new(source, "identity_card".to_string(), file_hash, message)
4804 }
4805 pub fn new_internal_passport(source: String, file_hash: String, message: String) -> Self {
4806 Self::new(source, "internal_passport".to_string(), file_hash, message)
4807 }
4808}
4809
4810impl PassportElementErrorFile {
4811 pub fn new_utility_bill(source: String, file_hash: String, message: String) -> Self {
4812 Self::new(source, "utility_bill".to_string(), file_hash, message)
4813 }
4814 pub fn new_bank_statement(source: String, file_hash: String, message: String) -> Self {
4815 Self::new(source, "bank_statement".to_string(), file_hash, message)
4816 }
4817 pub fn new_rental_agreement(source: String, file_hash: String, message: String) -> Self {
4818 Self::new(source, "rental_agreement".to_string(), file_hash, message)
4819 }
4820 pub fn new_passport_registration(source: String, file_hash: String, message: String) -> Self {
4821 Self::new(
4822 source,
4823 "passport_registration".to_string(),
4824 file_hash,
4825 message,
4826 )
4827 }
4828 pub fn new_temporary_registration(source: String, file_hash: String, message: String) -> Self {
4829 Self::new(
4830 source,
4831 "temporary_registration".to_string(),
4832 file_hash,
4833 message,
4834 )
4835 }
4836}
4837
4838impl PassportElementErrorFiles {
4839 pub fn new_utility_bill(source: String, file_hashes: Vec<String>, message: String) -> Self {
4840 Self::new(source, "utility_bill".to_string(), file_hashes, message)
4841 }
4842 pub fn new_bank_statement(source: String, file_hashes: Vec<String>, message: String) -> Self {
4843 Self::new(source, "bank_statement".to_string(), file_hashes, message)
4844 }
4845 pub fn new_rental_agreement(source: String, file_hashes: Vec<String>, message: String) -> Self {
4846 Self::new(source, "rental_agreement".to_string(), file_hashes, message)
4847 }
4848 pub fn new_passport_registration(
4849 source: String,
4850 file_hashes: Vec<String>,
4851 message: String,
4852 ) -> Self {
4853 Self::new(
4854 source,
4855 "passport_registration".to_string(),
4856 file_hashes,
4857 message,
4858 )
4859 }
4860 pub fn new_temporary_registration(
4861 source: String,
4862 file_hashes: Vec<String>,
4863 message: String,
4864 ) -> Self {
4865 Self::new(
4866 source,
4867 "temporary_registration".to_string(),
4868 file_hashes,
4869 message,
4870 )
4871 }
4872}
4873
4874impl PassportElementErrorTranslationFile {
4875 pub fn new_passport(source: String, file_hash: String, message: String) -> Self {
4876 Self::new(source, "passport".to_string(), file_hash, message)
4877 }
4878 pub fn new_driver_license(source: String, file_hash: String, message: String) -> Self {
4879 Self::new(source, "driver_license".to_string(), file_hash, message)
4880 }
4881 pub fn new_identity_card(source: String, file_hash: String, message: String) -> Self {
4882 Self::new(source, "identity_card".to_string(), file_hash, message)
4883 }
4884 pub fn new_internal_passport(source: String, file_hash: String, message: String) -> Self {
4885 Self::new(source, "internal_passport".to_string(), file_hash, message)
4886 }
4887 pub fn new_utility_bill(source: String, file_hash: String, message: String) -> Self {
4888 Self::new(source, "utility_bill".to_string(), file_hash, message)
4889 }
4890 pub fn new_bank_statement(source: String, file_hash: String, message: String) -> Self {
4891 Self::new(source, "bank_statement".to_string(), file_hash, message)
4892 }
4893 pub fn new_rental_agreement(source: String, file_hash: String, message: String) -> Self {
4894 Self::new(source, "rental_agreement".to_string(), file_hash, message)
4895 }
4896 pub fn new_passport_registration(source: String, file_hash: String, message: String) -> Self {
4897 Self::new(
4898 source,
4899 "passport_registration".to_string(),
4900 file_hash,
4901 message,
4902 )
4903 }
4904 pub fn new_temporary_registration(source: String, file_hash: String, message: String) -> Self {
4905 Self::new(
4906 source,
4907 "temporary_registration".to_string(),
4908 file_hash,
4909 message,
4910 )
4911 }
4912}
4913
4914impl PassportElementErrorTranslationFiles {
4915 pub fn new_passport(source: String, file_hashes: Vec<String>, message: String) -> Self {
4916 Self::new(source, "passport".to_string(), file_hashes, message)
4917 }
4918 pub fn new_driver_license(source: String, file_hashes: Vec<String>, message: String) -> Self {
4919 Self::new(source, "driver_license".to_string(), file_hashes, message)
4920 }
4921 pub fn new_identity_card(source: String, file_hashes: Vec<String>, message: String) -> Self {
4922 Self::new(source, "identity_card".to_string(), file_hashes, message)
4923 }
4924 pub fn new_internal_passport(
4925 source: String,
4926 file_hashes: Vec<String>,
4927 message: String,
4928 ) -> Self {
4929 Self::new(
4930 source,
4931 "internal_passport".to_string(),
4932 file_hashes,
4933 message,
4934 )
4935 }
4936 pub fn new_utility_bill(source: String, file_hashes: Vec<String>, message: String) -> Self {
4937 Self::new(source, "utility_bill".to_string(), file_hashes, message)
4938 }
4939 pub fn new_bank_statement(source: String, file_hashes: Vec<String>, message: String) -> Self {
4940 Self::new(source, "bank_statement".to_string(), file_hashes, message)
4941 }
4942 pub fn new_rental_agreement(source: String, file_hashes: Vec<String>, message: String) -> Self {
4943 Self::new(source, "rental_agreement".to_string(), file_hashes, message)
4944 }
4945 pub fn new_passport_registration(
4946 source: String,
4947 file_hashes: Vec<String>,
4948 message: String,
4949 ) -> Self {
4950 Self::new(
4951 source,
4952 "passport_registration".to_string(),
4953 file_hashes,
4954 message,
4955 )
4956 }
4957 pub fn new_temporary_registration(
4958 source: String,
4959 file_hashes: Vec<String>,
4960 message: String,
4961 ) -> Self {
4962 Self::new(
4963 source,
4964 "temporary_registration".to_string(),
4965 file_hashes,
4966 message,
4967 )
4968 }
4969}
4970
4971#[derive(Deserialize, Serialize, Debug, Clone)]
4980#[serde(untagged)]
4981pub enum InputMessageContent {
4982 InputTextMessageContent(InputTextMessageContent),
4983 InputLocationMessageContent(InputLocationMessageContent),
4984 InputVenueMessageContent(InputVenueMessageContent),
4985 InputContactMessageContent(InputContactMessageContent),
4986 InputInvoiceMessageContent(InputInvoiceMessageContent),
4987}
4988
4989#[derive(Deserialize, Serialize, Debug, Clone)]
5002pub enum PassportElementError {
5003 PassportElementErrorDataField(PassportElementErrorDataField),
5004 PassportElementErrorFrontSide(PassportElementErrorFrontSide),
5005 PassportElementErrorReverseSide(PassportElementErrorReverseSide),
5006 PassportElementErrorSelfie(PassportElementErrorSelfie),
5007 PassportElementErrorFile(PassportElementErrorFile),
5008 PassportElementErrorFiles(PassportElementErrorFiles),
5009 PassportElementErrorTranslationFile(PassportElementErrorTranslationFile),
5010 PassportElementErrorTranslationFiles(PassportElementErrorTranslationFiles),
5011 PassportElementErrorUnspecified(PassportElementErrorUnspecified),
5012}
5013
5014#[derive(Deserialize, Serialize, Debug, Clone)]
5038#[serde(tag = "type")]
5039pub enum InlineQueryResult {
5040 #[serde(rename = "audio")]
5041 InlineQueryResultCachedAudio(InlineQueryResultCachedAudio),
5042 #[serde(rename = "document")]
5043 InlineQueryResultCachedDocument(InlineQueryResultCachedDocument),
5044 #[serde(rename = "gif")]
5045 InlineQueryResultCachedGif(InlineQueryResultCachedGif),
5046 #[serde(rename = "mpeg4_gif")]
5047 InlineQueryResultCachedMpeg4Gif(InlineQueryResultCachedMpeg4Gif),
5048 #[serde(rename = "photo")]
5049 InlineQueryResultCachedPhoto(InlineQueryResultCachedPhoto),
5050 #[serde(rename = "sticker")]
5051 InlineQueryResultCachedSticker(InlineQueryResultCachedSticker),
5052 #[serde(rename = "video")]
5053 InlineQueryResultCachedVideo(InlineQueryResultCachedVideo),
5054 #[serde(rename = "voice")]
5055 InlineQueryResultCachedVoice(InlineQueryResultCachedVoice),
5056 #[serde(rename = "article")]
5057 InlineQueryResultArticle(InlineQueryResultArticle),
5058 #[serde(rename = "audio")]
5059 InlineQueryResultAudio(InlineQueryResultAudio),
5060 #[serde(rename = "contact")]
5061 InlineQueryResultContact(InlineQueryResultContact),
5062 #[serde(rename = "game")]
5063 InlineQueryResultGame(InlineQueryResultGame),
5064 #[serde(rename = "document")]
5065 InlineQueryResultDocument(InlineQueryResultDocument),
5066 #[serde(rename = "gif")]
5067 InlineQueryResultGif(InlineQueryResultGif),
5068 #[serde(rename = "location")]
5069 InlineQueryResultLocation(InlineQueryResultLocation),
5070 #[serde(rename = "mpeg4_gif")]
5071 InlineQueryResultMpeg4Gif(InlineQueryResultMpeg4Gif),
5072 #[serde(rename = "photo")]
5073 InlineQueryResultPhoto(InlineQueryResultPhoto),
5074 #[serde(rename = "venue")]
5075 InlineQueryResultVenue(InlineQueryResultVenue),
5076 #[serde(rename = "video")]
5077 InlineQueryResultVideo(InlineQueryResultVideo),
5078 #[serde(rename = "voice")]
5079 InlineQueryResultVoice(InlineQueryResultVoice),
5080}