vtg 1.1.2

Library for creating VK and Telegram bots
Documentation
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;

use super::{context::EAttachment, tg::TGMessage};

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct PhotoSize {
    pub file_id: String,
    pub file_unique_id: String,
    pub width: i32,
    pub height: i32,
    pub file_size: Option<i32>,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Photo {
    pub file_id: String,
    pub file_unique_id: String,
    pub width: i32,
    pub height: i32,
    pub file_size: Option<i32>,
    pub thumb: Option<PhotoSize>,
    pub file_name: Option<String>,
    pub mime_type: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Animation {
    pub file_id: String,
    pub file_unique_id: String,
    pub width: i32,
    pub height: i32,
    pub duration: i32,
    pub thumb: Option<PhotoSize>,
    pub file_name: Option<String>,
    pub mime_type: Option<String>,
    pub file_size: Option<i32>,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Audio {
    pub file_id: String,
    pub file_unique_id: String,
    pub duration: i32,
    pub performer: Option<String>,
    pub title: Option<String>,
    pub mime_type: Option<String>,
    pub file_size: Option<i32>,
    pub thumb: Option<PhotoSize>,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Document {
    pub file_id: String,
    pub file_unique_id: String,
    pub thumb: Option<PhotoSize>,
    pub file_name: Option<String>,
    pub mime_type: Option<String>,
    pub file_size: Option<i32>,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Video {
    pub file_id: String,
    pub file_unique_id: String,
    pub width: i32,
    pub height: i32,
    pub duration: i32,
    pub thumb: Option<PhotoSize>,
    pub file_name: Option<String>,
    pub mime_type: Option<String>,
    pub file_size: Option<i32>,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Voice {
    pub file_id: String,
    pub file_unique_id: String,
    pub duration: i32,
    pub mime_type: Option<String>,
    pub file_size: Option<i32>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct VideoNote {
    pub file_id: String,
    pub file_unique_id: String,
    pub length: i32,
    pub duration: i32,
    pub thumb: Option<PhotoSize>,
    pub file_size: Option<i32>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Contact {
    pub phone_number: String,
    pub first_name: String,
    pub last_name: Option<String>,
    pub user_id: Option<i32>,
    pub vcard: Option<String>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Location {
    pub longitude: f32,
    pub latitude: f32,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Venue {
    pub location: Location,
    pub title: String,
    pub address: String,
    pub foursquare_id: Option<String>,
    pub foursquare_type: Option<String>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Sticker {
    pub file_id: String,
    pub file_unique_id: String,
    pub width: i32,
    pub height: i32,
    pub is_animated: bool,
    pub thumb: Option<PhotoSize>,
    pub emoji: Option<String>,
    pub set_name: Option<String>,
    pub mask_position: Option<MaskPosition>,
    pub file_size: Option<i32>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct MaskPosition {
    pub point: String,
    pub x_shift: f32,
    pub y_shift: f32,
    pub scale: f32,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct TGPhotoSize {
    pub file_id: String,
    pub file_unique_id: String,
    pub width: i32,
    pub height: i32,
    pub file_size: Option<i32>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct TGInvoice {
    pub title: String,
    pub description: String,
    pub start_parameter: String,
    pub currency: String,
    pub total_amount: i32,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct TGSuccessfulPayment {
    pub currency: String,
    pub total_amount: i32,
    pub invoice_payload: String,
    pub shipping_option_id: Option<String>,
    pub order_info: Option<TGOrderInfo>,
    pub telegram_payment_charge_id: String,
    pub provider_payment_charge_id: String,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct TGOrderInfo {
    pub name: Option<String>,
    pub phone_number: Option<String>,
    pub email: Option<String>,
    pub shipping_address: Option<TGShippingAddress>,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct TGShippingAddress {
    pub country_code: String,
    pub state: String,
    pub city: String,
    pub street_line1: String,
    pub street_line2: String,
    pub post_code: String,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct WebAppData {
    pub data: String,
    pub button_text: String,
}

pub fn unify_attachments(message: Option<TGMessage>) -> Option<EAttachment> {
    message.as_ref()?;
    let message = message.unwrap();
    Some(EAttachment::Telegram(Box::new(TGAttachment {
        audio: message.audio,
        document: message.document,
        photo: message.photo,
        sticker: message.sticker,
        video: message.video,
        video_note: message.video_note,
        voice: message.voice,
        caption: message.caption,
        contact: message.contact,
        location: message.location,
        venue: message.venue,
    })))
}

#[skip_serializing_none]
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct TGAttachment {
    pub audio: Option<Audio>,
    pub document: Option<Document>,
    pub photo: Option<Vec<PhotoSize>>,
    pub sticker: Option<Sticker>,
    pub video: Option<Video>,
    pub video_note: Option<VideoNote>,
    pub voice: Option<Voice>,
    pub caption: Option<String>,
    pub contact: Option<Contact>,
    pub location: Option<Location>,
    pub venue: Option<Venue>,
}