use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Update {
#[serde(rename = "type")]
pub update_type: String,
pub object: Value,
pub group_id: i64,
#[serde(default)]
pub event_id: Option<String>,
}
#[derive(Debug, Clone)]
pub enum Event {
MessageNew(Message),
MessageEdit(Message),
MessageReply(Message),
MessageAllow(MessageAllow),
MessageDeny(MessageDeny),
MessageTypingState(MessageTypingState),
MessageEvent(MessageEvent),
Unknown(String, Value),
}
impl Event {
pub fn from_update(update: &Update) -> Self {
match update.update_type.as_str() {
"message_new" => {
if let Ok(message) = serde_json::from_value(update.object["message"].clone()) {
Event::MessageNew(message)
} else {
Event::Unknown(update.update_type.clone(), update.object.clone())
}
}
"message_edit" => {
if let Ok(message) = serde_json::from_value(update.object.clone()) {
Event::MessageEdit(message)
} else {
Event::Unknown(update.update_type.clone(), update.object.clone())
}
}
"message_reply" => {
if let Ok(message) = serde_json::from_value(update.object.clone()) {
Event::MessageReply(message)
} else {
Event::Unknown(update.update_type.clone(), update.object.clone())
}
}
"message_allow" => {
if let Ok(message_allow) = serde_json::from_value(update.object.clone()) {
Event::MessageAllow(message_allow)
} else {
Event::Unknown(update.update_type.clone(), update.object.clone())
}
}
"message_deny" => {
if let Ok(message_deny) = serde_json::from_value(update.object.clone()) {
Event::MessageDeny(message_deny)
} else {
Event::Unknown(update.update_type.clone(), update.object.clone())
}
}
"message_typing_state" => {
if let Ok(typing_state) = serde_json::from_value(update.object.clone()) {
Event::MessageTypingState(typing_state)
} else {
Event::Unknown(update.update_type.clone(), update.object.clone())
}
}
"message_event" => {
if let Ok(message_event) = serde_json::from_value(update.object.clone()) {
Event::MessageEvent(message_event)
} else {
Event::Unknown(update.update_type.clone(), update.object.clone())
}
}
_ => Event::Unknown(update.update_type.clone(), update.object.clone()),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Message {
pub id: i64,
pub from_id: i64,
pub text: String,
pub peer_id: i64,
#[serde(default)]
pub conversation_message_id: Option<i64>,
pub date: i64,
#[serde(default)]
pub attachments: Vec<Attachment>,
#[serde(default)]
pub reply_message: Option<Box<Message>>,
#[serde(default)]
pub fwd_messages: Vec<Message>,
#[serde(default)]
pub important: bool,
#[serde(default)]
pub random_id: Option<i64>,
#[serde(default)]
pub payload: Option<String>,
#[serde(default)]
pub geo: Option<Geo>,
#[serde(default)]
pub action: Option<Action>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Action {
#[serde(rename = "type")]
pub action_type: String,
#[serde(default)]
pub member_id: Option<i64>,
#[serde(default)]
pub text: Option<String>,
#[serde(default)]
pub email: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Geo {
#[serde(default)]
pub place: Option<Place>,
pub coordinates: Coordinates,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Place {
pub id: i64,
pub title: String,
pub latitude: f64,
pub longitude: f64,
pub created: i64,
#[serde(default)]
pub icon: Option<String>,
#[serde(default)]
pub country: Option<String>,
#[serde(default)]
pub city: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Coordinates {
pub latitude: f64,
pub longitude: f64,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct MessageAllow {
pub user_id: i64,
pub key: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct MessageDeny {
pub user_id: i64,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct MessageTypingState {
pub user_id: i64,
pub peer_id: i64,
pub state: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct MessageEvent {
pub user_id: i64,
pub peer_id: i64,
pub event_id: String,
#[serde(default)]
pub payload: Option<HashMap<String, Value>>,
#[serde(default)]
pub conversation_message_id: Option<i64>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Attachment {
#[serde(rename = "type")]
pub attachment_type: String,
#[serde(default)]
pub photo: Option<Photo>,
#[serde(default)]
pub video: Option<Video>,
#[serde(default)]
pub audio: Option<Audio>,
#[serde(default)]
pub doc: Option<Document>,
#[serde(default)]
pub link: Option<Link>,
#[serde(default)]
pub market: Option<Market>,
#[serde(default)]
pub market_album: Option<MarketAlbum>,
#[serde(default)]
pub wall: Option<WallPost>,
#[serde(default)]
pub wall_reply: Option<WallReply>,
#[serde(default)]
pub sticker: Option<Sticker>,
#[serde(default)]
pub gift: Option<Gift>,
#[serde(default)]
pub poll: Option<Poll>,
#[serde(default)]
pub audio_message: Option<AudioMessage>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Photo {
pub id: i64,
pub owner_id: i64,
#[serde(default)]
pub access_key: Option<String>,
pub sizes: Vec<PhotoSize>,
#[serde(default)]
pub text: Option<String>,
pub date: i64,
#[serde(default)]
pub width: Option<i32>,
#[serde(default)]
pub height: Option<i32>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct PhotoSize {
#[serde(rename = "type")]
pub size_type: String,
pub url: String,
pub width: i32,
pub height: i32,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Video {
pub id: i64,
pub owner_id: i64,
pub title: String,
#[serde(default)]
pub description: Option<String>,
pub duration: i32,
pub image: Vec<VideoImage>,
#[serde(default)]
pub first_frame: Vec<VideoImage>,
pub date: i64,
#[serde(default)]
pub views: Option<i32>,
#[serde(default)]
pub comments: Option<i32>,
#[serde(default)]
pub access_key: Option<String>,
#[serde(default)]
pub player: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct VideoImage {
pub url: String,
pub width: i32,
pub height: i32,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Audio {
pub id: i64,
pub owner_id: i64,
pub artist: String,
pub title: String,
pub duration: i32,
#[serde(default)]
pub url: Option<String>,
pub date: i64,
#[serde(default)]
pub album_id: Option<i64>,
#[serde(default)]
pub genre_id: Option<i64>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Document {
pub id: i64,
pub owner_id: i64,
pub title: String,
pub size: i64,
pub ext: String,
pub url: String,
pub date: i64,
#[serde(default)]
pub r#type: Option<i32>,
#[serde(default)]
pub preview: Option<DocumentPreview>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct DocumentPreview {
#[serde(default)]
pub photo: Option<DocumentPreviewPhoto>,
#[serde(default)]
pub graffiti: Option<Graffiti>,
#[serde(default)]
pub audio_message: Option<AudioMessage>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct DocumentPreviewPhoto {
pub sizes: Vec<PhotoSize>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Graffiti {
pub src: String,
pub width: i32,
pub height: i32,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct AudioMessage {
pub duration: i32,
pub waveform: Vec<i32>,
pub link_ogg: String,
pub link_mp3: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Link {
pub url: String,
#[serde(default)]
pub title: Option<String>,
#[serde(default)]
pub caption: Option<String>,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub photo: Option<Photo>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Market {
pub id: i64,
pub owner_id: i64,
pub title: String,
pub description: String,
pub price: MarketPrice,
pub photos: Vec<Photo>,
pub date: i64,
#[serde(default)]
pub access_key: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct MarketPrice {
pub amount: String,
pub currency: Currency,
pub text: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Currency {
pub id: i64,
pub name: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct MarketAlbum {
pub id: i64,
pub owner_id: i64,
pub title: String,
#[serde(default)]
pub photo: Option<Photo>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct WallPost {
pub id: i64,
pub owner_id: i64,
pub from_id: i64,
pub date: i64,
pub text: String,
#[serde(default)]
pub attachments: Vec<Attachment>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct WallReply {
pub id: i64,
pub from_id: i64,
pub date: i64,
pub text: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Sticker {
pub product_id: i64,
pub sticker_id: i64,
pub images: Vec<StickerImage>,
#[serde(default)]
pub images_with_background: Vec<StickerImage>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct StickerImage {
pub url: String,
pub width: i32,
pub height: i32,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Gift {
pub id: i64,
pub thumb_256: String,
pub thumb_96: String,
pub thumb_48: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Poll {
pub id: i64,
pub owner_id: i64,
pub created: i64,
pub question: String,
pub votes: i64,
pub answers: Vec<PollAnswer>,
pub anonymous: bool,
#[serde(default)]
pub multiple: Option<bool>,
#[serde(default)]
pub end_date: Option<i64>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct PollAnswer {
pub id: i64,
pub text: String,
pub votes: i64,
pub rate: f64,
}