1use serde::{Deserialize, Serialize};
2
3use crate::community::Community;
4use crate::message::Message;
5use crate::user::User;
6
7#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
8#[serde(rename_all = "snake_case")]
10pub enum ChatType {
11 Private,
13 Group,
15 Supergroup,
17 Channel,
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct Chat {
24 pub id: i64,
26
27 #[serde(rename = "type")]
29 pub kind: ChatType,
30
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub title: Option<String>,
34
35 #[serde(skip_serializing_if = "Option::is_none")]
37 pub username: Option<String>,
38
39 #[serde(skip_serializing_if = "Option::is_none")]
41 pub first_name: Option<String>,
42
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub last_name: Option<String>,
46
47 #[serde(skip_serializing_if = "Option::is_none")]
49 pub is_forum: Option<bool>,
50 #[serde(skip_serializing_if = "Option::is_none")]
52 pub is_direct_messages: Option<bool>,
53 #[serde(skip_serializing_if = "Option::is_none")]
57 pub guard_bot: Option<User>,
58}
59
60impl Chat {
61 #[must_use]
63 pub fn display_name(&self) -> String {
64 self.title
65 .clone()
66 .or_else(|| {
67 self.first_name.as_ref().map(|f| {
68 self.last_name
69 .as_ref()
70 .map_or(f.clone(), |l| format!("{f} {l}"))
71 })
72 })
73 .or_else(|| self.username.clone())
74 .unwrap_or_else(|| self.id.to_string())
75 }
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
79pub struct ChatFullInfo {
81 pub id: i64,
83
84 #[serde(rename = "type")]
86 pub kind: ChatType,
87
88 #[serde(skip_serializing_if = "Option::is_none")]
90 pub title: Option<String>,
91
92 #[serde(skip_serializing_if = "Option::is_none")]
94 pub username: Option<String>,
95
96 #[serde(skip_serializing_if = "Option::is_none")]
98 pub first_name: Option<String>,
99
100 #[serde(skip_serializing_if = "Option::is_none")]
102 pub last_name: Option<String>,
103
104 #[serde(skip_serializing_if = "Option::is_none")]
106 pub is_forum: Option<bool>,
107 #[serde(skip_serializing_if = "Option::is_none")]
109 pub is_direct_messages: Option<bool>,
110 #[serde(skip_serializing_if = "Option::is_none")]
112 pub accent_color_id: Option<u32>,
113
114 #[serde(skip_serializing_if = "Option::is_none")]
116 pub max_reaction_count: Option<u32>,
117
118 #[serde(skip_serializing_if = "Option::is_none")]
120 pub photo: Option<ChatPhoto>,
121
122 #[serde(skip_serializing_if = "Option::is_none")]
124 pub active_usernames: Option<Vec<String>>,
125
126 #[serde(skip_serializing_if = "Option::is_none")]
128 pub bio: Option<String>,
129
130 #[serde(skip_serializing_if = "Option::is_none")]
132 pub has_private_forwards: Option<bool>,
133
134 #[serde(skip_serializing_if = "Option::is_none")]
136 pub has_restricted_voice_and_video_messages: Option<bool>,
137
138 #[serde(skip_serializing_if = "Option::is_none")]
140 pub join_to_send_messages: Option<bool>,
141
142 #[serde(skip_serializing_if = "Option::is_none")]
144 pub join_by_request: Option<bool>,
145
146 #[serde(skip_serializing_if = "Option::is_none")]
148 pub description: Option<String>,
149
150 #[serde(skip_serializing_if = "Option::is_none")]
152 pub invite_link: Option<String>,
153
154 #[serde(skip_serializing_if = "Option::is_none")]
156 pub pinned_message: Option<Box<Message>>,
157
158 #[serde(skip_serializing_if = "Option::is_none")]
160 pub permissions: Option<ChatPermissions>,
161
162 #[serde(skip_serializing_if = "Option::is_none")]
164 pub can_send_paid_media: Option<bool>,
165
166 #[serde(skip_serializing_if = "Option::is_none")]
168 pub slow_mode_delay: Option<u32>,
169
170 #[serde(skip_serializing_if = "Option::is_none")]
173 pub unrestrict_boost_count: Option<u32>,
174
175 #[serde(skip_serializing_if = "Option::is_none")]
177 pub message_auto_delete_time: Option<u32>,
178
179 #[serde(skip_serializing_if = "Option::is_none")]
181 pub has_aggressive_anti_spam_enabled: Option<bool>,
182
183 #[serde(skip_serializing_if = "Option::is_none")]
185 pub has_hidden_members: Option<bool>,
186
187 #[serde(skip_serializing_if = "Option::is_none")]
189 pub has_protected_content: Option<bool>,
190
191 #[serde(skip_serializing_if = "Option::is_none")]
193 pub has_visible_history: Option<bool>,
194
195 #[serde(skip_serializing_if = "Option::is_none")]
197 pub sticker_set_name: Option<String>,
198
199 #[serde(skip_serializing_if = "Option::is_none")]
201 pub can_set_sticker_set: Option<bool>,
202
203 #[serde(skip_serializing_if = "Option::is_none")]
205 pub custom_emoji_sticker_set_name: Option<String>,
206
207 #[serde(skip_serializing_if = "Option::is_none")]
209 pub linked_chat_id: Option<i64>,
210
211 #[serde(skip_serializing_if = "Option::is_none")]
213 pub location: Option<ChatLocation>,
214
215 #[serde(skip_serializing_if = "Option::is_none")]
217 pub community: Option<Community>,
218}
219
220#[derive(Debug, Clone, Serialize, Deserialize)]
221pub struct ChatPhoto {
223 pub small_file_id: String,
225 pub small_file_unique_id: String,
227 pub big_file_id: String,
229 pub big_file_unique_id: String,
231}
232
233#[derive(Debug, Clone, Default, Serialize, Deserialize)]
234pub struct ChatPermissions {
236 #[serde(skip_serializing_if = "Option::is_none")]
239 pub can_send_messages: Option<bool>,
240 #[serde(skip_serializing_if = "Option::is_none")]
242 pub can_send_audios: Option<bool>,
243 #[serde(skip_serializing_if = "Option::is_none")]
245 pub can_send_documents: Option<bool>,
246 #[serde(skip_serializing_if = "Option::is_none")]
248 pub can_send_photos: Option<bool>,
249 #[serde(skip_serializing_if = "Option::is_none")]
251 pub can_send_videos: Option<bool>,
252 #[serde(skip_serializing_if = "Option::is_none")]
254 pub can_send_video_notes: Option<bool>,
255 #[serde(skip_serializing_if = "Option::is_none")]
257 pub can_send_voice_notes: Option<bool>,
258 #[serde(skip_serializing_if = "Option::is_none")]
260 pub can_send_polls: Option<bool>,
261 #[serde(skip_serializing_if = "Option::is_none")]
263 pub can_send_other_messages: Option<bool>,
264 #[serde(skip_serializing_if = "Option::is_none")]
266 pub can_add_web_page_previews: Option<bool>,
267 #[serde(skip_serializing_if = "Option::is_none")]
269 pub can_change_info: Option<bool>,
270 #[serde(skip_serializing_if = "Option::is_none")]
272 pub can_invite_users: Option<bool>,
273 #[serde(skip_serializing_if = "Option::is_none")]
275 pub can_pin_messages: Option<bool>,
276 #[serde(skip_serializing_if = "Option::is_none")]
278 pub can_manage_topics: Option<bool>,
279 #[serde(skip_serializing_if = "Option::is_none")]
281 pub can_edit_tag: Option<bool>,
282 #[serde(skip_serializing_if = "Option::is_none")]
286 pub can_react_to_messages: Option<bool>,
287}
288
289#[derive(Debug, Clone, Serialize, Deserialize)]
291pub struct ChatLocation {
292 pub location: Location,
294 pub address: String,
296}
297
298#[derive(Debug, Clone, Serialize, Deserialize)]
300pub struct Location {
301 pub latitude: f64,
303 pub longitude: f64,
305 #[serde(skip_serializing_if = "Option::is_none")]
307 pub horizontal_accuracy: Option<f64>,
308 #[serde(skip_serializing_if = "Option::is_none")]
311 pub live_period: Option<u32>,
312 #[serde(skip_serializing_if = "Option::is_none")]
314 pub heading: Option<u16>,
315 #[serde(skip_serializing_if = "Option::is_none")]
317 pub proximity_alert_radius: Option<u32>,
318}
319
320#[derive(Debug, Clone, Serialize, Deserialize)]
322pub struct Venue {
323 pub location: Location,
325 pub title: String,
327 pub address: String,
329 #[serde(skip_serializing_if = "Option::is_none")]
331 pub foursquare_id: Option<String>,
332 #[serde(skip_serializing_if = "Option::is_none")]
334 pub foursquare_type: Option<String>,
335 #[serde(skip_serializing_if = "Option::is_none")]
337 pub google_place_id: Option<String>,
338 #[serde(skip_serializing_if = "Option::is_none")]
340 pub google_place_type: Option<String>,
341}
342
343#[derive(Debug, Clone, Serialize, Deserialize)]
344pub struct ChatInviteLink {
346 pub invite_link: String,
348 pub creator: User,
350 pub creates_join_request: bool,
352 pub is_primary: bool,
354 pub is_revoked: bool,
356 #[serde(skip_serializing_if = "Option::is_none")]
358 pub name: Option<String>,
359 #[serde(skip_serializing_if = "Option::is_none")]
361 pub expire_date: Option<i64>,
362 #[serde(skip_serializing_if = "Option::is_none")]
364 pub member_limit: Option<u32>,
365 #[serde(skip_serializing_if = "Option::is_none")]
367 pub pending_join_request_count: Option<u32>,
368 #[serde(skip_serializing_if = "Option::is_none")]
370 pub subscription_period: Option<u32>,
371 #[serde(skip_serializing_if = "Option::is_none")]
373 pub subscription_price: Option<u32>,
374}
375
376#[derive(Debug, Clone, Serialize, Deserialize)]
377pub struct ChatJoinRequest {
379 pub chat: Chat,
381 pub from: User,
383 pub user_chat_id: i64,
385 pub date: i64,
387 #[serde(skip_serializing_if = "Option::is_none")]
389 pub bio: Option<String>,
390 #[serde(skip_serializing_if = "Option::is_none")]
392 pub invite_link: Option<ChatInviteLink>,
393 #[serde(skip_serializing_if = "Option::is_none")]
398 pub query_id: Option<String>,
399}
400
401#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
405pub struct Link {
406 pub url: String,
408}
409
410#[derive(Debug, Clone, Serialize, Deserialize)]
412pub struct InputMediaLink {
413 #[serde(rename = "type")]
415 pub kind: String,
416 pub url: String,
418}
419
420impl InputMediaLink {
421 pub fn new(url: impl Into<String>) -> Self {
423 Self {
424 kind: "link".to_owned(),
425 url: url.into(),
426 }
427 }
428}