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}
53
54impl Chat {
55 #[must_use]
57 pub fn display_name(&self) -> String {
58 self.title
59 .clone()
60 .or_else(|| {
61 self.first_name.as_ref().map(|f| {
62 self.last_name
63 .as_ref()
64 .map_or(f.clone(), |l| format!("{f} {l}"))
65 })
66 })
67 .or_else(|| self.username.clone())
68 .unwrap_or_else(|| self.id.to_string())
69 }
70}
71
72#[derive(Debug, Clone, Serialize, Deserialize)]
73pub struct ChatFullInfo {
75 pub id: i64,
77
78 #[serde(rename = "type")]
80 pub kind: ChatType,
81
82 #[serde(skip_serializing_if = "Option::is_none")]
84 pub title: Option<String>,
85
86 #[serde(skip_serializing_if = "Option::is_none")]
88 pub username: Option<String>,
89
90 #[serde(skip_serializing_if = "Option::is_none")]
92 pub first_name: Option<String>,
93
94 #[serde(skip_serializing_if = "Option::is_none")]
96 pub last_name: Option<String>,
97
98 #[serde(skip_serializing_if = "Option::is_none")]
100 pub is_forum: Option<bool>,
101 #[serde(skip_serializing_if = "Option::is_none")]
103 pub is_direct_messages: Option<bool>,
104 #[serde(skip_serializing_if = "Option::is_none")]
106 pub accent_color_id: Option<u32>,
107
108 #[serde(skip_serializing_if = "Option::is_none")]
110 pub max_reaction_count: Option<u32>,
111
112 #[serde(skip_serializing_if = "Option::is_none")]
114 pub photo: Option<ChatPhoto>,
115
116 #[serde(skip_serializing_if = "Option::is_none")]
118 pub active_usernames: Option<Vec<String>>,
119
120 #[serde(skip_serializing_if = "Option::is_none")]
122 pub bio: Option<String>,
123
124 #[serde(skip_serializing_if = "Option::is_none")]
126 pub has_private_forwards: Option<bool>,
127
128 #[serde(skip_serializing_if = "Option::is_none")]
130 pub has_restricted_voice_and_video_messages: Option<bool>,
131
132 #[serde(skip_serializing_if = "Option::is_none")]
134 pub join_to_send_messages: Option<bool>,
135
136 #[serde(skip_serializing_if = "Option::is_none")]
138 pub join_by_request: Option<bool>,
139
140 #[serde(skip_serializing_if = "Option::is_none")]
142 pub description: Option<String>,
143
144 #[serde(skip_serializing_if = "Option::is_none")]
146 pub invite_link: Option<String>,
147
148 #[serde(skip_serializing_if = "Option::is_none")]
150 pub pinned_message: Option<Box<Message>>,
151
152 #[serde(skip_serializing_if = "Option::is_none")]
154 pub permissions: Option<ChatPermissions>,
155
156 #[serde(skip_serializing_if = "Option::is_none")]
158 pub can_send_paid_media: Option<bool>,
159
160 #[serde(skip_serializing_if = "Option::is_none")]
162 pub slow_mode_delay: Option<u32>,
163
164 #[serde(skip_serializing_if = "Option::is_none")]
167 pub unrestrict_boost_count: Option<u32>,
168
169 #[serde(skip_serializing_if = "Option::is_none")]
171 pub message_auto_delete_time: Option<u32>,
172
173 #[serde(skip_serializing_if = "Option::is_none")]
175 pub has_aggressive_anti_spam_enabled: Option<bool>,
176
177 #[serde(skip_serializing_if = "Option::is_none")]
179 pub has_hidden_members: Option<bool>,
180
181 #[serde(skip_serializing_if = "Option::is_none")]
183 pub has_protected_content: Option<bool>,
184
185 #[serde(skip_serializing_if = "Option::is_none")]
187 pub has_visible_history: Option<bool>,
188
189 #[serde(skip_serializing_if = "Option::is_none")]
191 pub sticker_set_name: Option<String>,
192
193 #[serde(skip_serializing_if = "Option::is_none")]
195 pub can_set_sticker_set: Option<bool>,
196
197 #[serde(skip_serializing_if = "Option::is_none")]
199 pub custom_emoji_sticker_set_name: Option<String>,
200
201 #[serde(skip_serializing_if = "Option::is_none")]
203 pub linked_chat_id: Option<i64>,
204
205 #[serde(skip_serializing_if = "Option::is_none")]
207 pub location: Option<ChatLocation>,
208}
209
210#[derive(Debug, Clone, Serialize, Deserialize)]
211pub struct ChatPhoto {
213 pub small_file_id: String,
215 pub small_file_unique_id: String,
217 pub big_file_id: String,
219 pub big_file_unique_id: String,
221}
222
223#[derive(Debug, Clone, Default, Serialize, Deserialize)]
224pub struct ChatPermissions {
226 #[serde(skip_serializing_if = "Option::is_none")]
228 pub can_send_messages: Option<bool>,
229 #[serde(skip_serializing_if = "Option::is_none")]
231 pub can_send_audios: Option<bool>,
232 #[serde(skip_serializing_if = "Option::is_none")]
234 pub can_send_documents: Option<bool>,
235 #[serde(skip_serializing_if = "Option::is_none")]
237 pub can_send_photos: Option<bool>,
238 #[serde(skip_serializing_if = "Option::is_none")]
240 pub can_send_videos: Option<bool>,
241 #[serde(skip_serializing_if = "Option::is_none")]
243 pub can_send_video_notes: Option<bool>,
244 #[serde(skip_serializing_if = "Option::is_none")]
246 pub can_send_voice_notes: Option<bool>,
247 #[serde(skip_serializing_if = "Option::is_none")]
249 pub can_send_polls: Option<bool>,
250 #[serde(skip_serializing_if = "Option::is_none")]
252 pub can_send_other_messages: Option<bool>,
253 #[serde(skip_serializing_if = "Option::is_none")]
255 pub can_add_web_page_previews: Option<bool>,
256 #[serde(skip_serializing_if = "Option::is_none")]
258 pub can_change_info: Option<bool>,
259 #[serde(skip_serializing_if = "Option::is_none")]
261 pub can_invite_users: Option<bool>,
262 #[serde(skip_serializing_if = "Option::is_none")]
264 pub can_pin_messages: Option<bool>,
265 #[serde(skip_serializing_if = "Option::is_none")]
267 pub can_manage_topics: Option<bool>,
268 #[serde(skip_serializing_if = "Option::is_none")]
270 pub can_edit_tag: Option<bool>,
271}
272
273#[derive(Debug, Clone, Serialize, Deserialize)]
275pub struct ChatLocation {
276 pub location: Location,
278 pub address: String,
280}
281
282#[derive(Debug, Clone, Serialize, Deserialize)]
284pub struct Location {
285 pub latitude: f64,
287 pub longitude: f64,
289 #[serde(skip_serializing_if = "Option::is_none")]
291 pub horizontal_accuracy: Option<f64>,
292 #[serde(skip_serializing_if = "Option::is_none")]
295 pub live_period: Option<u32>,
296 #[serde(skip_serializing_if = "Option::is_none")]
298 pub heading: Option<u16>,
299 #[serde(skip_serializing_if = "Option::is_none")]
301 pub proximity_alert_radius: Option<u32>,
302}
303
304#[derive(Debug, Clone, Serialize, Deserialize)]
306pub struct Venue {
307 pub location: Location,
309 pub title: String,
311 pub address: String,
313 #[serde(skip_serializing_if = "Option::is_none")]
315 pub foursquare_id: Option<String>,
316 #[serde(skip_serializing_if = "Option::is_none")]
318 pub foursquare_type: Option<String>,
319 #[serde(skip_serializing_if = "Option::is_none")]
321 pub google_place_id: Option<String>,
322 #[serde(skip_serializing_if = "Option::is_none")]
324 pub google_place_type: Option<String>,
325}
326
327#[derive(Debug, Clone, Serialize, Deserialize)]
328pub struct ChatInviteLink {
330 pub invite_link: String,
332 pub creator: User,
334 pub creates_join_request: bool,
336 pub is_primary: bool,
338 pub is_revoked: bool,
340 #[serde(skip_serializing_if = "Option::is_none")]
342 pub name: Option<String>,
343 #[serde(skip_serializing_if = "Option::is_none")]
345 pub expire_date: Option<i64>,
346 #[serde(skip_serializing_if = "Option::is_none")]
348 pub member_limit: Option<u32>,
349 #[serde(skip_serializing_if = "Option::is_none")]
351 pub pending_join_request_count: Option<u32>,
352 #[serde(skip_serializing_if = "Option::is_none")]
354 pub subscription_period: Option<u32>,
355 #[serde(skip_serializing_if = "Option::is_none")]
357 pub subscription_price: Option<u32>,
358}
359
360#[derive(Debug, Clone, Serialize, Deserialize)]
361pub struct ChatJoinRequest {
363 pub chat: Chat,
365 pub from: User,
367 pub user_chat_id: i64,
369 pub date: i64,
371 #[serde(skip_serializing_if = "Option::is_none")]
373 pub bio: Option<String>,
374 #[serde(skip_serializing_if = "Option::is_none")]
376 pub invite_link: Option<ChatInviteLink>,
377}