1use serde::{Deserialize, Serialize};
2
3use crate::business::{
4 Birthdate, BusinessIntro, BusinessLocation, BusinessOpeningHours, UserRating,
5};
6use crate::community::Community;
7use crate::file::Audio;
8use crate::gifts::UniqueGiftColors;
9use crate::message::{Message, ReactionType};
10use crate::payments::AcceptedGiftTypes;
11use crate::user::User;
12
13#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
14#[serde(rename_all = "snake_case")]
16pub enum ChatType {
17 #[default]
23 Private,
24 Group,
26 Supergroup,
28 Channel,
30}
31
32#[derive(Debug, Clone, Default, Serialize, Deserialize)]
33#[non_exhaustive]
39pub struct Chat {
40 pub id: i64,
42
43 #[serde(rename = "type")]
45 pub kind: ChatType,
46
47 #[serde(skip_serializing_if = "Option::is_none")]
49 pub title: Option<String>,
50
51 #[serde(skip_serializing_if = "Option::is_none")]
53 pub username: Option<String>,
54
55 #[serde(skip_serializing_if = "Option::is_none")]
57 pub first_name: Option<String>,
58
59 #[serde(skip_serializing_if = "Option::is_none")]
61 pub last_name: Option<String>,
62
63 #[serde(skip_serializing_if = "Option::is_none")]
65 pub is_forum: Option<bool>,
66 #[serde(skip_serializing_if = "Option::is_none")]
68 pub is_direct_messages: Option<bool>,
69}
70
71impl Chat {
72 #[must_use]
74 pub fn display_name(&self) -> String {
75 self.title
76 .clone()
77 .or_else(|| {
78 self.first_name.as_ref().map(|f| {
79 self.last_name
80 .as_ref()
81 .map_or(f.clone(), |l| format!("{f} {l}"))
82 })
83 })
84 .or_else(|| self.username.clone())
85 .unwrap_or_else(|| self.id.to_string())
86 }
87}
88
89#[derive(Debug, Clone, Default, Serialize, Deserialize)]
90#[non_exhaustive]
95pub struct ChatFullInfo {
96 pub id: i64,
98
99 #[serde(rename = "type")]
101 pub kind: ChatType,
102
103 #[serde(skip_serializing_if = "Option::is_none")]
105 pub title: Option<String>,
106
107 #[serde(skip_serializing_if = "Option::is_none")]
109 pub username: Option<String>,
110
111 #[serde(skip_serializing_if = "Option::is_none")]
113 pub first_name: Option<String>,
114
115 #[serde(skip_serializing_if = "Option::is_none")]
117 pub last_name: Option<String>,
118
119 #[serde(skip_serializing_if = "Option::is_none")]
121 pub is_forum: Option<bool>,
122 #[serde(skip_serializing_if = "Option::is_none")]
124 pub is_direct_messages: Option<bool>,
125 #[serde(default)]
130 pub accent_color_id: u32,
131
132 #[serde(default)]
134 pub max_reaction_count: u32,
135
136 #[serde(skip_serializing_if = "Option::is_none")]
140 pub guard_bot: Option<User>,
141 #[serde(skip_serializing_if = "Option::is_none")]
143 pub birthdate: Option<Birthdate>,
144 #[serde(skip_serializing_if = "Option::is_none")]
146 pub business_intro: Option<BusinessIntro>,
147 #[serde(skip_serializing_if = "Option::is_none")]
149 pub business_location: Option<BusinessLocation>,
150 #[serde(skip_serializing_if = "Option::is_none")]
152 pub business_opening_hours: Option<BusinessOpeningHours>,
153 #[serde(skip_serializing_if = "Option::is_none")]
155 pub personal_chat: Option<Box<Chat>>,
156 #[serde(skip_serializing_if = "Option::is_none")]
158 pub parent_chat: Option<Box<Chat>>,
159 #[serde(skip_serializing_if = "Option::is_none")]
161 pub available_reactions: Option<Vec<ReactionType>>,
162 #[serde(skip_serializing_if = "Option::is_none")]
165 pub background_custom_emoji_id: Option<String>,
166 #[serde(skip_serializing_if = "Option::is_none")]
168 pub profile_accent_color_id: Option<u32>,
169 #[serde(skip_serializing_if = "Option::is_none")]
172 pub profile_background_custom_emoji_id: Option<String>,
173 #[serde(skip_serializing_if = "Option::is_none")]
175 pub emoji_status_custom_emoji_id: Option<String>,
176 #[serde(skip_serializing_if = "Option::is_none")]
178 pub emoji_status_expiration_date: Option<i64>,
179 #[serde(default)]
181 pub accepted_gift_types: AcceptedGiftTypes,
182 #[serde(skip_serializing_if = "Option::is_none")]
184 pub rating: Option<UserRating>,
185 #[serde(skip_serializing_if = "Option::is_none")]
187 pub first_profile_audio: Option<Audio>,
188 #[serde(skip_serializing_if = "Option::is_none")]
191 pub unique_gift_colors: Option<UniqueGiftColors>,
192 #[serde(skip_serializing_if = "Option::is_none")]
194 pub paid_message_star_count: Option<i64>,
195
196 #[serde(skip_serializing_if = "Option::is_none")]
198 pub photo: Option<ChatPhoto>,
199
200 #[serde(skip_serializing_if = "Option::is_none")]
202 pub active_usernames: Option<Vec<String>>,
203
204 #[serde(skip_serializing_if = "Option::is_none")]
206 pub bio: Option<String>,
207
208 #[serde(skip_serializing_if = "Option::is_none")]
210 pub has_private_forwards: Option<bool>,
211
212 #[serde(skip_serializing_if = "Option::is_none")]
214 pub has_restricted_voice_and_video_messages: Option<bool>,
215
216 #[serde(skip_serializing_if = "Option::is_none")]
218 pub join_to_send_messages: Option<bool>,
219
220 #[serde(skip_serializing_if = "Option::is_none")]
222 pub join_by_request: Option<bool>,
223
224 #[serde(skip_serializing_if = "Option::is_none")]
226 pub description: Option<String>,
227
228 #[serde(skip_serializing_if = "Option::is_none")]
230 pub invite_link: Option<String>,
231
232 #[serde(skip_serializing_if = "Option::is_none")]
234 pub pinned_message: Option<Box<Message>>,
235
236 #[serde(skip_serializing_if = "Option::is_none")]
238 pub permissions: Option<ChatPermissions>,
239
240 #[serde(skip_serializing_if = "Option::is_none")]
242 pub can_send_paid_media: Option<bool>,
243
244 #[serde(skip_serializing_if = "Option::is_none")]
246 pub slow_mode_delay: Option<u32>,
247
248 #[serde(skip_serializing_if = "Option::is_none")]
251 pub unrestrict_boost_count: Option<u32>,
252
253 #[serde(skip_serializing_if = "Option::is_none")]
255 pub message_auto_delete_time: Option<u32>,
256
257 #[serde(skip_serializing_if = "Option::is_none")]
259 pub has_aggressive_anti_spam_enabled: Option<bool>,
260
261 #[serde(skip_serializing_if = "Option::is_none")]
263 pub has_hidden_members: Option<bool>,
264
265 #[serde(skip_serializing_if = "Option::is_none")]
267 pub has_protected_content: Option<bool>,
268
269 #[serde(skip_serializing_if = "Option::is_none")]
271 pub has_visible_history: Option<bool>,
272
273 #[serde(skip_serializing_if = "Option::is_none")]
275 pub sticker_set_name: Option<String>,
276
277 #[serde(skip_serializing_if = "Option::is_none")]
279 pub can_set_sticker_set: Option<bool>,
280
281 #[serde(skip_serializing_if = "Option::is_none")]
283 pub custom_emoji_sticker_set_name: Option<String>,
284
285 #[serde(skip_serializing_if = "Option::is_none")]
287 pub linked_chat_id: Option<i64>,
288
289 #[serde(skip_serializing_if = "Option::is_none")]
291 pub location: Option<ChatLocation>,
292
293 #[serde(skip_serializing_if = "Option::is_none")]
295 pub community: Option<Community>,
296}
297
298#[derive(Debug, Clone, Serialize, Deserialize)]
299pub struct ChatPhoto {
301 pub small_file_id: String,
303 pub small_file_unique_id: String,
305 pub big_file_id: String,
307 pub big_file_unique_id: String,
309}
310
311#[derive(Debug, Clone, Default, Serialize, Deserialize)]
312pub struct ChatPermissions {
314 #[serde(skip_serializing_if = "Option::is_none")]
317 pub can_send_messages: Option<bool>,
318 #[serde(skip_serializing_if = "Option::is_none")]
320 pub can_send_audios: Option<bool>,
321 #[serde(skip_serializing_if = "Option::is_none")]
323 pub can_send_documents: Option<bool>,
324 #[serde(skip_serializing_if = "Option::is_none")]
326 pub can_send_photos: Option<bool>,
327 #[serde(skip_serializing_if = "Option::is_none")]
329 pub can_send_videos: Option<bool>,
330 #[serde(skip_serializing_if = "Option::is_none")]
332 pub can_send_video_notes: Option<bool>,
333 #[serde(skip_serializing_if = "Option::is_none")]
335 pub can_send_voice_notes: Option<bool>,
336 #[serde(skip_serializing_if = "Option::is_none")]
338 pub can_send_polls: Option<bool>,
339 #[serde(skip_serializing_if = "Option::is_none")]
341 pub can_send_other_messages: Option<bool>,
342 #[serde(skip_serializing_if = "Option::is_none")]
344 pub can_add_web_page_previews: Option<bool>,
345 #[serde(skip_serializing_if = "Option::is_none")]
347 pub can_change_info: Option<bool>,
348 #[serde(skip_serializing_if = "Option::is_none")]
350 pub can_invite_users: Option<bool>,
351 #[serde(skip_serializing_if = "Option::is_none")]
353 pub can_pin_messages: Option<bool>,
354 #[serde(skip_serializing_if = "Option::is_none")]
356 pub can_manage_topics: Option<bool>,
357 #[serde(skip_serializing_if = "Option::is_none")]
359 pub can_edit_tag: Option<bool>,
360 #[serde(skip_serializing_if = "Option::is_none")]
364 pub can_react_to_messages: Option<bool>,
365}
366
367#[derive(Debug, Clone, Serialize, Deserialize)]
369pub struct ChatLocation {
370 pub location: Location,
372 pub address: String,
374}
375
376#[derive(Debug, Clone, Serialize, Deserialize)]
378pub struct Location {
379 pub latitude: f64,
381 pub longitude: f64,
383 #[serde(skip_serializing_if = "Option::is_none")]
385 pub horizontal_accuracy: Option<f64>,
386 #[serde(skip_serializing_if = "Option::is_none")]
389 pub live_period: Option<u32>,
390 #[serde(skip_serializing_if = "Option::is_none")]
392 pub heading: Option<u16>,
393 #[serde(skip_serializing_if = "Option::is_none")]
395 pub proximity_alert_radius: Option<u32>,
396}
397
398#[derive(Debug, Clone, Serialize, Deserialize)]
400pub struct Venue {
401 pub location: Location,
403 pub title: String,
405 pub address: String,
407 #[serde(skip_serializing_if = "Option::is_none")]
409 pub foursquare_id: Option<String>,
410 #[serde(skip_serializing_if = "Option::is_none")]
412 pub foursquare_type: Option<String>,
413 #[serde(skip_serializing_if = "Option::is_none")]
415 pub google_place_id: Option<String>,
416 #[serde(skip_serializing_if = "Option::is_none")]
418 pub google_place_type: Option<String>,
419}
420
421#[derive(Debug, Clone, Serialize, Deserialize)]
422pub struct ChatInviteLink {
424 pub invite_link: String,
426 pub creator: User,
428 pub creates_join_request: bool,
430 pub is_primary: bool,
432 pub is_revoked: bool,
434 #[serde(skip_serializing_if = "Option::is_none")]
436 pub name: Option<String>,
437 #[serde(skip_serializing_if = "Option::is_none")]
439 pub expire_date: Option<i64>,
440 #[serde(skip_serializing_if = "Option::is_none")]
442 pub member_limit: Option<u32>,
443 #[serde(skip_serializing_if = "Option::is_none")]
445 pub pending_join_request_count: Option<u32>,
446 #[serde(skip_serializing_if = "Option::is_none")]
448 pub subscription_period: Option<u32>,
449 #[serde(skip_serializing_if = "Option::is_none")]
451 pub subscription_price: Option<u32>,
452}
453
454#[derive(Debug, Clone, Serialize, Deserialize)]
455pub struct ChatJoinRequest {
457 pub chat: Chat,
459 pub from: User,
461 pub user_chat_id: i64,
463 pub date: i64,
465 #[serde(skip_serializing_if = "Option::is_none")]
467 pub bio: Option<String>,
468 #[serde(skip_serializing_if = "Option::is_none")]
470 pub invite_link: Option<ChatInviteLink>,
471 #[serde(skip_serializing_if = "Option::is_none")]
476 pub query_id: Option<String>,
477}
478
479#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
483pub struct Link {
484 pub url: String,
486}
487
488#[derive(Debug, Clone, Serialize, Deserialize)]
496pub struct InputMediaLink {
497 pub url: String,
499}
500
501impl InputMediaLink {
502 pub fn new(url: impl Into<String>) -> Self {
504 Self { url: url.into() }
505 }
506}