vtg 1.1.2

Library for creating VK and Telegram bots
Documentation
use serde::Serialize;
use serde_json::Value;
use serde_with::skip_serializing_none;

use super::tg_api::TGChatAdministratorRights;

#[derive(Serialize, Clone, Debug)]
pub struct Keyboard {
    pub inline: bool,
    pub one_time: bool,
    pub vk_buttons: Option<VKKeyboard>,
    pub tg_buttons: Option<Vec<Vec<TGKeyboardButton>>>,
}
#[derive(Serialize, Clone, Debug)]
pub struct VKKeyboard {
    pub one_time: bool,
    pub inline: bool,
    pub buttons: Vec<Vec<VKKeyboardButton>>,
}
#[skip_serializing_none]
#[derive(Serialize, Clone, Debug)]
#[serde(untagged)]
pub enum KeyboardButton {
    Text {
        label: String,
        color: Color,
        data: Option<Value>,
    },
    Url {
        label: String,
        link: String,
        color: Color,
        data: Option<Value>,
    },
    Location {
        label: String,
        color: Color,
        data: Option<Value>,
    },
    VKPay {
        label: String,
        hash: String,
        color: Color,
        data: Option<Value>,
    },
    VKApp {
        label: String,
        app_id: u32,
        owner_id: u32,
        hash: String,
        color: Color,
        data: Option<Value>,
    },
    Callback {
        label: String,
        color: Color,
        data: Option<Value>,
    },
    TGInline {
        text: String,
        url: Option<String>,
        callback_data: Option<Value>,
        web_app: Option<TGInlineWebApp>,
        login: Option<TGInlineLogin>,
        switch_inline_query: Option<String>,
        switch_inline_query_current_chat: Option<String>,
        switch_inline_query_choosen_chat: Option<TGSwitchInlineQueryChoosenChat>,
        callback_game: Option<TGCallbackGame>,
        pay: Option<bool>,
    },
    TGKeyboardButton {
        text: String,
        request_contact: Option<bool>,
        request_location: Option<bool>,
        request_users: Option<TGKeyboardButtonRequestUsers>,
        request_chat: Option<TGKeyboardButtonRequestChat>,
        request_poll: Option<TGKeyboardButtonPollType>,
        web_app: Option<TGInlineWebApp>,
    },
    TGKeyboardRemove {
        remove_keyboard: bool,
        selective: Option<bool>,
    },
    TGForceReply {
        force_reply: bool,
        selective: Option<bool>,
        input_field_placeholder: Option<String>,
    },
}

#[derive(Serialize, Clone, Debug)]
pub struct TGInlineWebApp {
    pub url: String,
}

#[derive(Serialize, Clone, Debug)]
pub struct TGInlineLogin {
    pub url: String,
    pub forward_text: Option<String>,
    pub bot_username: Option<String>,
    pub request_write_access: Option<bool>,
}

#[derive(Serialize, Clone, Debug)]
pub struct TGSwitchInlineQueryChoosenChat {
    pub query: Option<String>,
    pub allow_user_chats: Option<bool>,
    pub allow_bot_chats: Option<bool>,
    pub allow_group_chats: Option<bool>,
    pub allow_channel_chats: Option<bool>,
}

#[derive(Serialize, Clone, Debug)]
pub struct TGCallbackGame {
    pub user_id: Option<i64>,
    pub score: Option<i64>,
    pub force: Option<bool>,
    pub disable_edit_message: Option<bool>,
    pub chat_id: Option<i64>,
    pub message_id: Option<i64>,
    pub inline_message_id: Option<String>,
}

#[derive(Serialize, Clone, Debug)]
pub struct TGKeyboardButtonRequestUsers {
    pub request_id: i64,
    pub user_is_bot: Option<bool>,
    pub user_is_premium: Option<bool>,
    pub max_quanity: Option<i8>,
}

#[derive(Serialize, Clone, Debug)]
pub struct TGKeyboardButtonRequestChat {
    pub request_id: i64,
    pub chat_is_channel: Option<bool>,
    pub chat_is_forum: Option<bool>,
    pub chat_has_username: Option<bool>,
    pub chat_is_created: Option<bool>,
    pub user_administrator_rights: Option<TGChatAdministratorRights>,
    pub bot_administrator_rights: Option<TGChatAdministratorRights>,
    pub bot_is_member: Option<bool>,
}

#[derive(Serialize, Clone, Debug)]
pub struct TGKeyboardButtonPollType {
    pub r#type: String,
}

#[derive(Serialize, Clone, Debug)]
pub enum Color {
    Negative,
    Positive,
    Secondary,
    Primary,
}
impl Color {
    pub fn as_string(&self) -> String {
        match self {
            Color::Negative => "negative".to_string(),
            Color::Positive => "positive".to_string(),
            Color::Secondary => "secondary".to_string(),
            Color::Primary => "primary".to_string(),
        }
    }
}
#[skip_serializing_none]
#[derive(Serialize, Clone, Debug, Default)]
pub struct TGKeyboardButton {
    pub text: String,
    pub callback_data: Option<String>,
    pub url: Option<String>,
    pub web_app: Option<TGInlineWebApp>,
    pub login: Option<TGInlineLogin>,
    pub switch_inline_query: Option<String>,
    pub switch_inline_query_current_chat: Option<String>,
    pub switch_inline_query_choosen_chat: Option<TGSwitchInlineQueryChoosenChat>,
    pub callback_game: Option<TGCallbackGame>,
    pub pay: Option<bool>,
    pub request_contact: Option<bool>,
    pub request_location: Option<bool>,
    pub request_users: Option<TGKeyboardButtonRequestUsers>,
    pub request_chat: Option<TGKeyboardButtonRequestChat>,
    pub request_poll: Option<TGKeyboardButtonPollType>,
    pub remove_keyboard: Option<bool>,
    pub selective: Option<bool>,
    pub force_reply: Option<bool>,
    pub input_field_placeholder: Option<String>,
}
#[derive(Serialize, Clone, Debug)]
pub struct VKKeyboardButton {
    pub action: KeyboardButtonAction,
    pub color: Option<String>,
}

#[skip_serializing_none]
#[derive(Serialize, Clone, Debug, Default)]
pub struct KeyboardButtonAction {
    pub r#type: String,
    pub payload: Option<Value>,
    pub label: Option<String>,
    pub link: Option<String>,
    pub hash: Option<String>,
    pub app_id: Option<u32>,
    pub owner_id: Option<u32>,
}

#[derive(Serialize, Clone, Debug)]
pub struct ReplyKeyboardMarkup {
    pub keyboard: Vec<Vec<TGKeyboardButton>>,
    pub one_time_keyboard: bool,
}

#[derive(Serialize, Clone, Debug)]
pub struct InlineKeyboardMarkup {
    pub inline_keyboard: Vec<Vec<TGKeyboardButton>>,
}