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}
50
51impl Chat {
52 #[must_use]
54 pub fn display_name(&self) -> String {
55 self.title
56 .clone()
57 .or_else(|| {
58 self.first_name.as_ref().map(|f| {
59 self.last_name
60 .as_ref()
61 .map_or(f.clone(), |l| format!("{f} {l}"))
62 })
63 })
64 .or_else(|| self.username.clone())
65 .unwrap_or_else(|| self.id.to_string())
66 }
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize)]
70pub struct ChatFullInfo {
72 pub id: i64,
74
75 #[serde(rename = "type")]
77 pub kind: ChatType,
78
79 #[serde(skip_serializing_if = "Option::is_none")]
81 pub title: Option<String>,
82
83 #[serde(skip_serializing_if = "Option::is_none")]
85 pub username: Option<String>,
86
87 #[serde(skip_serializing_if = "Option::is_none")]
89 pub first_name: Option<String>,
90
91 #[serde(skip_serializing_if = "Option::is_none")]
93 pub last_name: Option<String>,
94
95 #[serde(skip_serializing_if = "Option::is_none")]
97 pub is_forum: Option<bool>,
98
99 #[serde(skip_serializing_if = "Option::is_none")]
101 pub accent_color_id: Option<u32>,
102
103 #[serde(skip_serializing_if = "Option::is_none")]
105 pub max_reaction_count: Option<u32>,
106
107 #[serde(skip_serializing_if = "Option::is_none")]
109 pub photo: Option<ChatPhoto>,
110
111 #[serde(skip_serializing_if = "Option::is_none")]
113 pub active_usernames: Option<Vec<String>>,
114
115 #[serde(skip_serializing_if = "Option::is_none")]
117 pub bio: Option<String>,
118
119 #[serde(skip_serializing_if = "Option::is_none")]
121 pub has_private_forwards: Option<bool>,
122
123 #[serde(skip_serializing_if = "Option::is_none")]
125 pub has_restricted_voice_and_video_messages: Option<bool>,
126
127 #[serde(skip_serializing_if = "Option::is_none")]
129 pub join_to_send_messages: Option<bool>,
130
131 #[serde(skip_serializing_if = "Option::is_none")]
133 pub join_by_request: Option<bool>,
134
135 #[serde(skip_serializing_if = "Option::is_none")]
137 pub description: Option<String>,
138
139 #[serde(skip_serializing_if = "Option::is_none")]
141 pub invite_link: Option<String>,
142
143 #[serde(skip_serializing_if = "Option::is_none")]
145 pub pinned_message: Option<Box<Message>>,
146
147 #[serde(skip_serializing_if = "Option::is_none")]
149 pub permissions: Option<ChatPermissions>,
150
151 #[serde(skip_serializing_if = "Option::is_none")]
153 pub can_send_paid_media: Option<bool>,
154
155 #[serde(skip_serializing_if = "Option::is_none")]
157 pub slow_mode_delay: Option<u32>,
158
159 #[serde(skip_serializing_if = "Option::is_none")]
162 pub unrestrict_boost_count: Option<u32>,
163
164 #[serde(skip_serializing_if = "Option::is_none")]
166 pub message_auto_delete_time: Option<u32>,
167
168 #[serde(skip_serializing_if = "Option::is_none")]
170 pub has_aggressive_anti_spam_enabled: Option<bool>,
171
172 #[serde(skip_serializing_if = "Option::is_none")]
174 pub has_hidden_members: Option<bool>,
175
176 #[serde(skip_serializing_if = "Option::is_none")]
178 pub has_protected_content: Option<bool>,
179
180 #[serde(skip_serializing_if = "Option::is_none")]
182 pub has_visible_history: Option<bool>,
183
184 #[serde(skip_serializing_if = "Option::is_none")]
186 pub sticker_set_name: Option<String>,
187
188 #[serde(skip_serializing_if = "Option::is_none")]
190 pub can_set_sticker_set: Option<bool>,
191
192 #[serde(skip_serializing_if = "Option::is_none")]
194 pub custom_emoji_sticker_set_name: Option<String>,
195
196 #[serde(skip_serializing_if = "Option::is_none")]
198 pub linked_chat_id: Option<i64>,
199
200 #[serde(skip_serializing_if = "Option::is_none")]
202 pub location: Option<ChatLocation>,
203}
204
205#[derive(Debug, Clone, Serialize, Deserialize)]
206pub struct ChatPhoto {
208 pub small_file_id: String,
210 pub small_file_unique_id: String,
212 pub big_file_id: String,
214 pub big_file_unique_id: String,
216}
217
218#[derive(Debug, Clone, Default, Serialize, Deserialize)]
219pub struct ChatPermissions {
221 #[serde(skip_serializing_if = "Option::is_none")]
223 pub can_send_messages: Option<bool>,
224 #[serde(skip_serializing_if = "Option::is_none")]
226 pub can_send_audios: Option<bool>,
227 #[serde(skip_serializing_if = "Option::is_none")]
229 pub can_send_documents: Option<bool>,
230 #[serde(skip_serializing_if = "Option::is_none")]
232 pub can_send_photos: Option<bool>,
233 #[serde(skip_serializing_if = "Option::is_none")]
235 pub can_send_videos: Option<bool>,
236 #[serde(skip_serializing_if = "Option::is_none")]
238 pub can_send_video_notes: Option<bool>,
239 #[serde(skip_serializing_if = "Option::is_none")]
241 pub can_send_voice_notes: Option<bool>,
242 #[serde(skip_serializing_if = "Option::is_none")]
244 pub can_send_polls: Option<bool>,
245 #[serde(skip_serializing_if = "Option::is_none")]
247 pub can_send_other_messages: Option<bool>,
248 #[serde(skip_serializing_if = "Option::is_none")]
250 pub can_add_web_page_previews: Option<bool>,
251 #[serde(skip_serializing_if = "Option::is_none")]
253 pub can_change_info: Option<bool>,
254 #[serde(skip_serializing_if = "Option::is_none")]
256 pub can_invite_users: Option<bool>,
257 #[serde(skip_serializing_if = "Option::is_none")]
259 pub can_pin_messages: Option<bool>,
260 #[serde(skip_serializing_if = "Option::is_none")]
262 pub can_manage_topics: Option<bool>,
263 #[serde(skip_serializing_if = "Option::is_none")]
265 pub can_edit_tag: Option<bool>,
266}
267
268#[derive(Debug, Clone, Serialize, Deserialize)]
270pub struct ChatLocation {
271 pub location: Location,
273 pub address: String,
275}
276
277#[derive(Debug, Clone, Serialize, Deserialize)]
279pub struct Location {
280 pub latitude: f64,
282 pub longitude: f64,
284 #[serde(skip_serializing_if = "Option::is_none")]
286 pub horizontal_accuracy: Option<f64>,
287 #[serde(skip_serializing_if = "Option::is_none")]
290 pub live_period: Option<u32>,
291 #[serde(skip_serializing_if = "Option::is_none")]
293 pub heading: Option<u16>,
294 #[serde(skip_serializing_if = "Option::is_none")]
296 pub proximity_alert_radius: Option<u32>,
297}
298
299#[derive(Debug, Clone, Serialize, Deserialize)]
301pub struct Venue {
302 pub location: Location,
304 pub title: String,
306 pub address: String,
308 #[serde(skip_serializing_if = "Option::is_none")]
310 pub foursquare_id: Option<String>,
311 #[serde(skip_serializing_if = "Option::is_none")]
313 pub foursquare_type: Option<String>,
314 #[serde(skip_serializing_if = "Option::is_none")]
316 pub google_place_id: Option<String>,
317 #[serde(skip_serializing_if = "Option::is_none")]
319 pub google_place_type: Option<String>,
320}
321
322#[derive(Debug, Clone, Serialize, Deserialize)]
323pub struct ChatInviteLink {
325 pub invite_link: String,
327 pub creator: User,
329 pub creates_join_request: bool,
331 pub is_primary: bool,
333 pub is_revoked: bool,
335 #[serde(skip_serializing_if = "Option::is_none")]
337 pub name: Option<String>,
338 #[serde(skip_serializing_if = "Option::is_none")]
340 pub expire_date: Option<i64>,
341 #[serde(skip_serializing_if = "Option::is_none")]
343 pub member_limit: Option<u32>,
344 #[serde(skip_serializing_if = "Option::is_none")]
346 pub pending_join_request_count: Option<u32>,
347 #[serde(skip_serializing_if = "Option::is_none")]
349 pub subscription_period: Option<u32>,
350 #[serde(skip_serializing_if = "Option::is_none")]
352 pub subscription_price: Option<u32>,
353}
354
355#[derive(Debug, Clone, Serialize, Deserialize)]
356pub struct ChatJoinRequest {
358 pub chat: Chat,
360 pub from: User,
362 pub user_chat_id: i64,
364 pub date: i64,
366 #[serde(skip_serializing_if = "Option::is_none")]
368 pub bio: Option<String>,
369 #[serde(skip_serializing_if = "Option::is_none")]
371 pub invite_link: Option<ChatInviteLink>,
372}