1use serde::{Deserialize, Serialize};
2
3use crate::message::Message;
4use crate::user::User;
5
6#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
7#[serde(rename_all = "snake_case")]
9pub enum ChatType {
10 Private,
12 Group,
14 Supergroup,
16 Channel,
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize)]
21pub struct Chat {
23 pub id: i64,
25
26 #[serde(rename = "type")]
28 pub kind: ChatType,
29
30 #[serde(skip_serializing_if = "Option::is_none")]
32 pub title: Option<String>,
33
34 #[serde(skip_serializing_if = "Option::is_none")]
36 pub username: Option<String>,
37
38 #[serde(skip_serializing_if = "Option::is_none")]
40 pub first_name: Option<String>,
41
42 #[serde(skip_serializing_if = "Option::is_none")]
44 pub last_name: Option<String>,
45
46 #[serde(skip_serializing_if = "Option::is_none")]
48 pub is_forum: Option<bool>,
49 #[serde(skip_serializing_if = "Option::is_none")]
51 pub is_direct_messages: Option<bool>,
52 #[serde(skip_serializing_if = "Option::is_none")]
56 pub guard_bot: Option<User>,
57}
58
59impl Chat {
60 #[must_use]
62 pub fn display_name(&self) -> String {
63 self.title
64 .clone()
65 .or_else(|| {
66 self.first_name.as_ref().map(|f| {
67 self.last_name
68 .as_ref()
69 .map_or(f.clone(), |l| format!("{f} {l}"))
70 })
71 })
72 .or_else(|| self.username.clone())
73 .unwrap_or_else(|| self.id.to_string())
74 }
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize)]
78pub struct ChatFullInfo {
80 pub id: i64,
82
83 #[serde(rename = "type")]
85 pub kind: ChatType,
86
87 #[serde(skip_serializing_if = "Option::is_none")]
89 pub title: Option<String>,
90
91 #[serde(skip_serializing_if = "Option::is_none")]
93 pub username: Option<String>,
94
95 #[serde(skip_serializing_if = "Option::is_none")]
97 pub first_name: Option<String>,
98
99 #[serde(skip_serializing_if = "Option::is_none")]
101 pub last_name: Option<String>,
102
103 #[serde(skip_serializing_if = "Option::is_none")]
105 pub is_forum: Option<bool>,
106 #[serde(skip_serializing_if = "Option::is_none")]
108 pub is_direct_messages: Option<bool>,
109 #[serde(skip_serializing_if = "Option::is_none")]
111 pub accent_color_id: Option<u32>,
112
113 #[serde(skip_serializing_if = "Option::is_none")]
115 pub max_reaction_count: Option<u32>,
116
117 #[serde(skip_serializing_if = "Option::is_none")]
119 pub photo: Option<ChatPhoto>,
120
121 #[serde(skip_serializing_if = "Option::is_none")]
123 pub active_usernames: Option<Vec<String>>,
124
125 #[serde(skip_serializing_if = "Option::is_none")]
127 pub bio: Option<String>,
128
129 #[serde(skip_serializing_if = "Option::is_none")]
131 pub has_private_forwards: Option<bool>,
132
133 #[serde(skip_serializing_if = "Option::is_none")]
135 pub has_restricted_voice_and_video_messages: Option<bool>,
136
137 #[serde(skip_serializing_if = "Option::is_none")]
139 pub join_to_send_messages: Option<bool>,
140
141 #[serde(skip_serializing_if = "Option::is_none")]
143 pub join_by_request: Option<bool>,
144
145 #[serde(skip_serializing_if = "Option::is_none")]
147 pub description: Option<String>,
148
149 #[serde(skip_serializing_if = "Option::is_none")]
151 pub invite_link: Option<String>,
152
153 #[serde(skip_serializing_if = "Option::is_none")]
155 pub pinned_message: Option<Box<Message>>,
156
157 #[serde(skip_serializing_if = "Option::is_none")]
159 pub permissions: Option<ChatPermissions>,
160
161 #[serde(skip_serializing_if = "Option::is_none")]
163 pub can_send_paid_media: Option<bool>,
164
165 #[serde(skip_serializing_if = "Option::is_none")]
167 pub slow_mode_delay: Option<u32>,
168
169 #[serde(skip_serializing_if = "Option::is_none")]
172 pub unrestrict_boost_count: Option<u32>,
173
174 #[serde(skip_serializing_if = "Option::is_none")]
176 pub message_auto_delete_time: Option<u32>,
177
178 #[serde(skip_serializing_if = "Option::is_none")]
180 pub has_aggressive_anti_spam_enabled: Option<bool>,
181
182 #[serde(skip_serializing_if = "Option::is_none")]
184 pub has_hidden_members: Option<bool>,
185
186 #[serde(skip_serializing_if = "Option::is_none")]
188 pub has_protected_content: Option<bool>,
189
190 #[serde(skip_serializing_if = "Option::is_none")]
192 pub has_visible_history: Option<bool>,
193
194 #[serde(skip_serializing_if = "Option::is_none")]
196 pub sticker_set_name: Option<String>,
197
198 #[serde(skip_serializing_if = "Option::is_none")]
200 pub can_set_sticker_set: Option<bool>,
201
202 #[serde(skip_serializing_if = "Option::is_none")]
204 pub custom_emoji_sticker_set_name: Option<String>,
205
206 #[serde(skip_serializing_if = "Option::is_none")]
208 pub linked_chat_id: Option<i64>,
209
210 #[serde(skip_serializing_if = "Option::is_none")]
212 pub location: Option<ChatLocation>,
213}
214
215#[derive(Debug, Clone, Serialize, Deserialize)]
216pub struct ChatPhoto {
218 pub small_file_id: String,
220 pub small_file_unique_id: String,
222 pub big_file_id: String,
224 pub big_file_unique_id: String,
226}
227
228#[derive(Debug, Clone, Default, Serialize, Deserialize)]
229pub struct ChatPermissions {
231 #[serde(skip_serializing_if = "Option::is_none")]
234 pub can_send_messages: Option<bool>,
235 #[serde(skip_serializing_if = "Option::is_none")]
237 pub can_send_audios: Option<bool>,
238 #[serde(skip_serializing_if = "Option::is_none")]
240 pub can_send_documents: Option<bool>,
241 #[serde(skip_serializing_if = "Option::is_none")]
243 pub can_send_photos: Option<bool>,
244 #[serde(skip_serializing_if = "Option::is_none")]
246 pub can_send_videos: Option<bool>,
247 #[serde(skip_serializing_if = "Option::is_none")]
249 pub can_send_video_notes: Option<bool>,
250 #[serde(skip_serializing_if = "Option::is_none")]
252 pub can_send_voice_notes: Option<bool>,
253 #[serde(skip_serializing_if = "Option::is_none")]
255 pub can_send_polls: Option<bool>,
256 #[serde(skip_serializing_if = "Option::is_none")]
258 pub can_send_other_messages: Option<bool>,
259 #[serde(skip_serializing_if = "Option::is_none")]
261 pub can_add_web_page_previews: Option<bool>,
262 #[serde(skip_serializing_if = "Option::is_none")]
264 pub can_change_info: Option<bool>,
265 #[serde(skip_serializing_if = "Option::is_none")]
267 pub can_invite_users: Option<bool>,
268 #[serde(skip_serializing_if = "Option::is_none")]
270 pub can_pin_messages: Option<bool>,
271 #[serde(skip_serializing_if = "Option::is_none")]
273 pub can_manage_topics: Option<bool>,
274 #[serde(skip_serializing_if = "Option::is_none")]
276 pub can_edit_tag: Option<bool>,
277 #[serde(skip_serializing_if = "Option::is_none")]
281 pub can_react_to_messages: Option<bool>,
282}
283
284#[derive(Debug, Clone, Serialize, Deserialize)]
286pub struct ChatLocation {
287 pub location: Location,
289 pub address: String,
291}
292
293#[derive(Debug, Clone, Serialize, Deserialize)]
295pub struct Location {
296 pub latitude: f64,
298 pub longitude: f64,
300 #[serde(skip_serializing_if = "Option::is_none")]
302 pub horizontal_accuracy: Option<f64>,
303 #[serde(skip_serializing_if = "Option::is_none")]
306 pub live_period: Option<u32>,
307 #[serde(skip_serializing_if = "Option::is_none")]
309 pub heading: Option<u16>,
310 #[serde(skip_serializing_if = "Option::is_none")]
312 pub proximity_alert_radius: Option<u32>,
313}
314
315#[derive(Debug, Clone, Serialize, Deserialize)]
317pub struct Venue {
318 pub location: Location,
320 pub title: String,
322 pub address: String,
324 #[serde(skip_serializing_if = "Option::is_none")]
326 pub foursquare_id: Option<String>,
327 #[serde(skip_serializing_if = "Option::is_none")]
329 pub foursquare_type: Option<String>,
330 #[serde(skip_serializing_if = "Option::is_none")]
332 pub google_place_id: Option<String>,
333 #[serde(skip_serializing_if = "Option::is_none")]
335 pub google_place_type: Option<String>,
336}
337
338#[derive(Debug, Clone, Serialize, Deserialize)]
339pub struct ChatInviteLink {
341 pub invite_link: String,
343 pub creator: User,
345 pub creates_join_request: bool,
347 pub is_primary: bool,
349 pub is_revoked: bool,
351 #[serde(skip_serializing_if = "Option::is_none")]
353 pub name: Option<String>,
354 #[serde(skip_serializing_if = "Option::is_none")]
356 pub expire_date: Option<i64>,
357 #[serde(skip_serializing_if = "Option::is_none")]
359 pub member_limit: Option<u32>,
360 #[serde(skip_serializing_if = "Option::is_none")]
362 pub pending_join_request_count: Option<u32>,
363 #[serde(skip_serializing_if = "Option::is_none")]
365 pub subscription_period: Option<u32>,
366 #[serde(skip_serializing_if = "Option::is_none")]
368 pub subscription_price: Option<u32>,
369}
370
371#[derive(Debug, Clone, Serialize, Deserialize)]
372pub struct ChatJoinRequest {
374 pub chat: Chat,
376 pub from: User,
378 pub user_chat_id: i64,
380 pub date: i64,
382 #[serde(skip_serializing_if = "Option::is_none")]
384 pub bio: Option<String>,
385 #[serde(skip_serializing_if = "Option::is_none")]
387 pub invite_link: Option<ChatInviteLink>,
388 #[serde(skip_serializing_if = "Option::is_none")]
393 pub query_id: Option<String>,
394}
395
396#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
400pub struct Link {
401 pub url: String,
403}
404
405#[derive(Debug, Clone, Serialize, Deserialize)]
407pub struct InputMediaLink {
408 #[serde(rename = "type")]
410 pub kind: String,
411 pub url: String,
413}
414
415impl InputMediaLink {
416 pub fn new(url: impl Into<String>) -> Self {
418 Self {
419 kind: "link".to_owned(),
420 url: url.into(),
421 }
422 }
423}