1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3use std::collections::HashMap;
4
5#[derive(Debug, Clone, Deserialize, Serialize)]
7pub struct Update {
8 #[serde(rename = "type")]
10 pub update_type: String,
11 pub object: Value,
13 pub group_id: i64,
15 #[serde(default)]
17 pub event_id: Option<String>,
18}
19
20#[derive(Debug, Clone)]
22pub enum Event {
23 MessageNew(Message),
25 MessageEdit(Message),
27 MessageReply(Message),
29 MessageAllow(MessageAllow),
31 MessageDeny(MessageDeny),
33 MessageTypingState(MessageTypingState),
35 MessageEvent(MessageEvent),
37 Unknown(String, Value),
39}
40
41impl Event {
42 pub fn from_update(update: &Update) -> Self {
44 match update.update_type.as_str() {
45 "message_new" => {
46 if let Ok(message) = serde_json::from_value(update.object["message"].clone()) {
47 Event::MessageNew(message)
48 } else {
49 Event::Unknown(update.update_type.clone(), update.object.clone())
50 }
51 }
52 "message_edit" => {
53 if let Ok(message) = serde_json::from_value(update.object.clone()) {
54 Event::MessageEdit(message)
55 } else {
56 Event::Unknown(update.update_type.clone(), update.object.clone())
57 }
58 }
59 "message_reply" => {
60 if let Ok(message) = serde_json::from_value(update.object.clone()) {
61 Event::MessageReply(message)
62 } else {
63 Event::Unknown(update.update_type.clone(), update.object.clone())
64 }
65 }
66 "message_allow" => {
67 if let Ok(message_allow) = serde_json::from_value(update.object.clone()) {
68 Event::MessageAllow(message_allow)
69 } else {
70 Event::Unknown(update.update_type.clone(), update.object.clone())
71 }
72 }
73 "message_deny" => {
74 if let Ok(message_deny) = serde_json::from_value(update.object.clone()) {
75 Event::MessageDeny(message_deny)
76 } else {
77 Event::Unknown(update.update_type.clone(), update.object.clone())
78 }
79 }
80 "message_typing_state" => {
81 if let Ok(typing_state) = serde_json::from_value(update.object.clone()) {
82 Event::MessageTypingState(typing_state)
83 } else {
84 Event::Unknown(update.update_type.clone(), update.object.clone())
85 }
86 }
87 "message_event" => {
88 if let Ok(message_event) = serde_json::from_value(update.object.clone()) {
89 Event::MessageEvent(message_event)
90 } else {
91 Event::Unknown(update.update_type.clone(), update.object.clone())
92 }
93 }
94 _ => Event::Unknown(update.update_type.clone(), update.object.clone()),
95 }
96 }
97}
98
99#[derive(Debug, Clone, Deserialize, Serialize)]
101pub struct Message {
102 pub id: i64,
104 pub from_id: i64,
106 pub text: String,
108 pub peer_id: i64,
110 #[serde(default)]
112 pub conversation_message_id: Option<i64>,
113 pub date: i64,
115 #[serde(default)]
117 pub attachments: Vec<Attachment>,
118 #[serde(default)]
120 pub reply_message: Option<Box<Message>>,
121 #[serde(default)]
123 pub fwd_messages: Vec<Message>,
124 #[serde(default)]
126 pub important: bool,
127 #[serde(default)]
129 pub random_id: Option<i64>,
130 #[serde(default)]
132 pub payload: Option<String>,
133 #[serde(default)]
135 pub geo: Option<Geo>,
136 #[serde(default)]
138 pub action: Option<Action>,
139}
140
141#[derive(Debug, Clone, Deserialize, Serialize)]
143pub struct Action {
144 #[serde(rename = "type")]
146 pub action_type: String,
147 #[serde(default)]
149 pub member_id: Option<i64>,
150 #[serde(default)]
152 pub text: Option<String>,
153 #[serde(default)]
155 pub email: Option<String>,
156}
157
158#[derive(Debug, Clone, Deserialize, Serialize)]
160pub struct Geo {
161 #[serde(default)]
163 pub place: Option<Place>,
164 pub coordinates: Coordinates,
166}
167
168#[derive(Debug, Clone, Deserialize, Serialize)]
170pub struct Place {
171 pub id: i64,
173 pub title: String,
175 pub latitude: f64,
177 pub longitude: f64,
179 pub created: i64,
181 #[serde(default)]
183 pub icon: Option<String>,
184 #[serde(default)]
186 pub country: Option<String>,
187 #[serde(default)]
189 pub city: Option<String>,
190}
191
192#[derive(Debug, Clone, Deserialize, Serialize)]
194pub struct Coordinates {
195 pub latitude: f64,
197 pub longitude: f64,
199}
200
201#[derive(Debug, Clone, Deserialize, Serialize)]
203pub struct MessageAllow {
204 pub user_id: i64,
206 pub key: String,
208}
209
210#[derive(Debug, Clone, Deserialize, Serialize)]
212pub struct MessageDeny {
213 pub user_id: i64,
215}
216
217#[derive(Debug, Clone, Deserialize, Serialize)]
219pub struct MessageTypingState {
220 pub user_id: i64,
222 pub peer_id: i64,
224 pub state: String,
226}
227
228#[derive(Debug, Clone, Deserialize, Serialize)]
230pub struct MessageEvent {
231 pub user_id: i64,
233 pub peer_id: i64,
235 pub event_id: String,
237 #[serde(default)]
239 pub payload: Option<HashMap<String, Value>>,
240 #[serde(default)]
242 pub conversation_message_id: Option<i64>,
243}
244
245#[derive(Debug, Clone, Deserialize, Serialize)]
247pub struct Attachment {
248 #[serde(rename = "type")]
250 pub attachment_type: String,
251 #[serde(default)]
253 pub photo: Option<Photo>,
254 #[serde(default)]
256 pub video: Option<Video>,
257 #[serde(default)]
259 pub audio: Option<Audio>,
260 #[serde(default)]
262 pub doc: Option<Document>,
263 #[serde(default)]
265 pub link: Option<Link>,
266 #[serde(default)]
268 pub market: Option<Market>,
269 #[serde(default)]
271 pub market_album: Option<MarketAlbum>,
272 #[serde(default)]
274 pub wall: Option<WallPost>,
275 #[serde(default)]
277 pub wall_reply: Option<WallReply>,
278 #[serde(default)]
280 pub sticker: Option<Sticker>,
281 #[serde(default)]
283 pub gift: Option<Gift>,
284 #[serde(default)]
286 pub poll: Option<Poll>,
287 #[serde(default)]
289 pub audio_message: Option<AudioMessage>,
290}
291
292#[derive(Debug, Clone, Deserialize, Serialize)]
294pub struct Photo {
295 pub id: i64,
297 pub owner_id: i64,
299 #[serde(default)]
301 pub access_key: Option<String>,
302 pub sizes: Vec<PhotoSize>,
304 #[serde(default)]
306 pub text: Option<String>,
307 pub date: i64,
309 #[serde(default)]
311 pub width: Option<i32>,
312 #[serde(default)]
314 pub height: Option<i32>,
315}
316
317#[derive(Debug, Clone, Deserialize, Serialize)]
319pub struct PhotoSize {
320 #[serde(rename = "type")]
322 pub size_type: String,
323 pub url: String,
325 pub width: i32,
327 pub height: i32,
329}
330
331#[derive(Debug, Clone, Deserialize, Serialize)]
333pub struct Video {
334 pub id: i64,
336 pub owner_id: i64,
338 pub title: String,
340 #[serde(default)]
342 pub description: Option<String>,
343 pub duration: i32,
345 pub image: Vec<VideoImage>,
347 #[serde(default)]
349 pub first_frame: Vec<VideoImage>,
350 pub date: i64,
352 #[serde(default)]
354 pub views: Option<i32>,
355 #[serde(default)]
357 pub comments: Option<i32>,
358 #[serde(default)]
360 pub access_key: Option<String>,
361 #[serde(default)]
363 pub player: Option<String>,
364}
365
366#[derive(Debug, Clone, Deserialize, Serialize)]
368pub struct VideoImage {
369 pub url: String,
371 pub width: i32,
373 pub height: i32,
375}
376
377#[derive(Debug, Clone, Deserialize, Serialize)]
379pub struct Audio {
380 pub id: i64,
382 pub owner_id: i64,
384 pub artist: String,
386 pub title: String,
388 pub duration: i32,
390 #[serde(default)]
392 pub url: Option<String>,
393 pub date: i64,
395 #[serde(default)]
397 pub album_id: Option<i64>,
398 #[serde(default)]
400 pub genre_id: Option<i64>,
401}
402
403#[derive(Debug, Clone, Deserialize, Serialize)]
405pub struct Document {
406 pub id: i64,
408 pub owner_id: i64,
410 pub title: String,
412 pub size: i64,
414 pub ext: String,
416 pub url: String,
418 pub date: i64,
420 #[serde(default)]
422 pub r#type: Option<i32>,
423 #[serde(default)]
425 pub preview: Option<DocumentPreview>,
426}
427
428#[derive(Debug, Clone, Deserialize, Serialize)]
430pub struct DocumentPreview {
431 #[serde(default)]
433 pub photo: Option<DocumentPreviewPhoto>,
434 #[serde(default)]
436 pub graffiti: Option<Graffiti>,
437 #[serde(default)]
439 pub audio_message: Option<AudioMessage>,
440}
441
442#[derive(Debug, Clone, Deserialize, Serialize)]
444pub struct DocumentPreviewPhoto {
445 pub sizes: Vec<PhotoSize>,
447}
448
449#[derive(Debug, Clone, Deserialize, Serialize)]
451pub struct Graffiti {
452 pub src: String,
454 pub width: i32,
456 pub height: i32,
458}
459
460#[derive(Debug, Clone, Deserialize, Serialize)]
462pub struct AudioMessage {
463 pub duration: i32,
465 pub waveform: Vec<i32>,
467 pub link_ogg: String,
469 pub link_mp3: String,
471}
472
473#[derive(Debug, Clone, Deserialize, Serialize)]
475pub struct Link {
476 pub url: String,
478 #[serde(default)]
480 pub title: Option<String>,
481 #[serde(default)]
483 pub caption: Option<String>,
484 #[serde(default)]
486 pub description: Option<String>,
487 #[serde(default)]
489 pub photo: Option<Photo>,
490}
491
492#[derive(Debug, Clone, Deserialize, Serialize)]
494pub struct Market {
495 pub id: i64,
497 pub owner_id: i64,
499 pub title: String,
501 pub description: String,
503 pub price: MarketPrice,
505 pub photos: Vec<Photo>,
507 pub date: i64,
509 #[serde(default)]
511 pub access_key: Option<String>,
512}
513
514#[derive(Debug, Clone, Deserialize, Serialize)]
516pub struct MarketPrice {
517 pub amount: String,
519 pub currency: Currency,
521 pub text: String,
523}
524
525#[derive(Debug, Clone, Deserialize, Serialize)]
527pub struct Currency {
528 pub id: i64,
530 pub name: String,
532}
533
534#[derive(Debug, Clone, Deserialize, Serialize)]
536pub struct MarketAlbum {
537 pub id: i64,
539 pub owner_id: i64,
541 pub title: String,
543 #[serde(default)]
545 pub photo: Option<Photo>,
546}
547
548#[derive(Debug, Clone, Deserialize, Serialize)]
550pub struct WallPost {
551 pub id: i64,
553 pub owner_id: i64,
555 pub from_id: i64,
557 pub date: i64,
559 pub text: String,
561 #[serde(default)]
563 pub attachments: Vec<Attachment>,
564}
565
566#[derive(Debug, Clone, Deserialize, Serialize)]
568pub struct WallReply {
569 pub id: i64,
571 pub from_id: i64,
573 pub date: i64,
575 pub text: String,
577}
578
579#[derive(Debug, Clone, Deserialize, Serialize)]
581pub struct Sticker {
582 pub product_id: i64,
584 pub sticker_id: i64,
586 pub images: Vec<StickerImage>,
588 #[serde(default)]
590 pub images_with_background: Vec<StickerImage>,
591}
592
593#[derive(Debug, Clone, Deserialize, Serialize)]
595pub struct StickerImage {
596 pub url: String,
598 pub width: i32,
600 pub height: i32,
602}
603
604#[derive(Debug, Clone, Deserialize, Serialize)]
606pub struct Gift {
607 pub id: i64,
609 pub thumb_256: String,
611 pub thumb_96: String,
613 pub thumb_48: String,
615}
616
617#[derive(Debug, Clone, Deserialize, Serialize)]
619pub struct Poll {
620 pub id: i64,
622 pub owner_id: i64,
624 pub created: i64,
626 pub question: String,
628 pub votes: i64,
630 pub answers: Vec<PollAnswer>,
632 pub anonymous: bool,
634 #[serde(default)]
636 pub multiple: Option<bool>,
637 #[serde(default)]
639 pub end_date: Option<i64>,
640}
641
642#[derive(Debug, Clone, Deserialize, Serialize)]
644pub struct PollAnswer {
645 pub id: i64,
647 pub text: String,
649 pub votes: i64,
651 pub rate: f64,
653}