use crate::chat::Chat;
use crate::file::PhotoSize;
use crate::gifts::{Gift, UniqueGift};
use crate::message::MessageEntity;
use crate::user::User;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LabeledPrice {
pub label: String,
pub amount: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Invoice {
pub title: String,
pub description: String,
pub start_parameter: String,
pub currency: String,
pub total_amount: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ShippingAddress {
pub country_code: String,
pub state: String,
pub city: String,
pub street_line1: String,
pub street_line2: String,
pub post_code: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OrderInfo {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub phone_number: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub shipping_address: Option<ShippingAddress>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ShippingOption {
pub id: String,
pub title: String,
pub prices: Vec<LabeledPrice>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SuccessfulPayment {
pub currency: String,
pub total_amount: i64,
pub invoice_payload: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub shipping_option_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub order_info: Option<OrderInfo>,
pub telegram_payment_charge_id: String,
pub provider_payment_charge_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub subscription_expiration_date: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_recurring: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_first_recurring: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RefundedPayment {
pub currency: String,
pub total_amount: i64,
pub invoice_payload: String,
pub telegram_payment_charge_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub provider_payment_charge_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ShippingQuery {
pub id: String,
pub from: User,
pub invoice_payload: String,
pub shipping_address: ShippingAddress,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PreCheckoutQuery {
pub id: String,
pub from: User,
pub currency: String,
pub total_amount: i64,
pub invoice_payload: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub shipping_option_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub order_info: Option<OrderInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BotSubscriptionUpdated {
pub user: User,
pub invoice_payload: String,
pub state: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StarAmount {
pub amount: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub nanostar_amount: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum RevenueWithdrawalState {
Pending,
Succeeded {
date: i64,
url: String,
},
Failed,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AffiliateInfo {
#[serde(skip_serializing_if = "Option::is_none")]
pub affiliate_user: Option<User>,
#[serde(skip_serializing_if = "Option::is_none")]
pub affiliate_chat: Option<Chat>,
pub commission_per_mille: i64,
pub amount: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub nanostar_amount: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum TransactionPartner {
User(Box<TransactionPartnerUser>),
Chat(Box<TransactionPartnerChat>),
AffiliateProgram(Box<TransactionPartnerAffiliateProgram>),
Fragment(Box<TransactionPartnerFragment>),
TelegramAds,
TelegramApi(Box<TransactionPartnerTelegramApi>),
Other,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TransactionPartnerUser {
pub transaction_type: String,
pub user: User,
#[serde(skip_serializing_if = "Option::is_none")]
pub affiliate: Option<AffiliateInfo>,
#[serde(skip_serializing_if = "Option::is_none")]
pub invoice_payload: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subscription_period: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub paid_media: Option<Vec<PaidMedia>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub paid_media_payload: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gift: Option<Gift>,
#[serde(skip_serializing_if = "Option::is_none")]
pub premium_subscription_duration: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TransactionPartnerChat {
pub chat: Chat,
#[serde(skip_serializing_if = "Option::is_none")]
pub gift: Option<Gift>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TransactionPartnerAffiliateProgram {
#[serde(skip_serializing_if = "Option::is_none")]
pub sponsor_user: Option<User>,
pub commission_per_mille: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TransactionPartnerFragment {
#[serde(skip_serializing_if = "Option::is_none")]
pub withdrawal_state: Option<RevenueWithdrawalState>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TransactionPartnerTelegramApi {
pub request_count: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StarTransactions {
pub transactions: Vec<StarTransaction>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StarTransaction {
pub id: String,
pub amount: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub nanostar_amount: Option<u32>,
pub date: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub source: Option<TransactionPartner>,
#[serde(skip_serializing_if = "Option::is_none")]
pub receiver: Option<TransactionPartner>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct AcceptedGiftTypes {
pub unlimited_gifts: bool,
pub limited_gifts: bool,
pub unique_gifts: bool,
pub premium_subscription: bool,
pub gifts_from_channels: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OwnedGiftRegular {
pub gift: Gift,
#[serde(skip_serializing_if = "Option::is_none")]
pub owned_gift_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sender_user: Option<User>,
pub send_date: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub entities: Option<Vec<MessageEntity>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_private: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_saved: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub can_be_upgraded: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub was_refunded: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub convert_star_count: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prepaid_upgrade_star_count: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_upgrade_separate: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unique_gift_number: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OwnedGiftUnique {
pub gift: UniqueGift,
#[serde(skip_serializing_if = "Option::is_none")]
pub owned_gift_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sender_user: Option<User>,
pub send_date: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_saved: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub can_be_transferred: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transfer_star_count: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub next_transfer_date: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum OwnedGift {
Regular(Box<OwnedGiftRegular>),
Unique(Box<OwnedGiftUnique>),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OwnedGifts {
pub total_count: i64,
pub gifts: Vec<OwnedGift>,
#[serde(skip_serializing_if = "Option::is_none")]
pub next_offset: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaidMediaPhoto {
pub photo: Vec<PhotoSize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaidMediaPreview {
#[serde(skip_serializing_if = "Option::is_none")]
pub width: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub height: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaidMediaLivePhoto {
pub live_photo: crate::file::LivePhoto,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaidMediaVideo {
pub video: crate::file::Video,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum PaidMedia {
Preview(PaidMediaPreview),
Photo(PaidMediaPhoto),
Video(PaidMediaVideo),
LivePhoto(PaidMediaLivePhoto),
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[non_exhaustive]
pub struct PaidMediaInfo {
pub star_count: i64,
pub paid_media: Vec<PaidMedia>,
}