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 #[serde(skip_serializing_if = "Option::is_none")]
275 pub can_react_to_messages: Option<bool>,
276}
277
278#[derive(Debug, Clone, Serialize, Deserialize)]
280pub struct ChatLocation {
281 pub location: Location,
283 pub address: String,
285}
286
287#[derive(Debug, Clone, Serialize, Deserialize)]
289pub struct Location {
290 pub latitude: f64,
292 pub longitude: f64,
294 #[serde(skip_serializing_if = "Option::is_none")]
296 pub horizontal_accuracy: Option<f64>,
297 #[serde(skip_serializing_if = "Option::is_none")]
300 pub live_period: Option<u32>,
301 #[serde(skip_serializing_if = "Option::is_none")]
303 pub heading: Option<u16>,
304 #[serde(skip_serializing_if = "Option::is_none")]
306 pub proximity_alert_radius: Option<u32>,
307}
308
309#[derive(Debug, Clone, Serialize, Deserialize)]
311pub struct Venue {
312 pub location: Location,
314 pub title: String,
316 pub address: String,
318 #[serde(skip_serializing_if = "Option::is_none")]
320 pub foursquare_id: Option<String>,
321 #[serde(skip_serializing_if = "Option::is_none")]
323 pub foursquare_type: Option<String>,
324 #[serde(skip_serializing_if = "Option::is_none")]
326 pub google_place_id: Option<String>,
327 #[serde(skip_serializing_if = "Option::is_none")]
329 pub google_place_type: Option<String>,
330}
331
332#[derive(Debug, Clone, Serialize, Deserialize)]
333pub struct ChatInviteLink {
335 pub invite_link: String,
337 pub creator: User,
339 pub creates_join_request: bool,
341 pub is_primary: bool,
343 pub is_revoked: bool,
345 #[serde(skip_serializing_if = "Option::is_none")]
347 pub name: Option<String>,
348 #[serde(skip_serializing_if = "Option::is_none")]
350 pub expire_date: Option<i64>,
351 #[serde(skip_serializing_if = "Option::is_none")]
353 pub member_limit: Option<u32>,
354 #[serde(skip_serializing_if = "Option::is_none")]
356 pub pending_join_request_count: Option<u32>,
357 #[serde(skip_serializing_if = "Option::is_none")]
359 pub subscription_period: Option<u32>,
360 #[serde(skip_serializing_if = "Option::is_none")]
362 pub subscription_price: Option<u32>,
363}
364
365#[derive(Debug, Clone, Serialize, Deserialize)]
366pub struct ChatJoinRequest {
368 pub chat: Chat,
370 pub from: User,
372 pub user_chat_id: i64,
374 pub date: i64,
376 #[serde(skip_serializing_if = "Option::is_none")]
378 pub bio: Option<String>,
379 #[serde(skip_serializing_if = "Option::is_none")]
381 pub invite_link: Option<ChatInviteLink>,
382}