use serde::{Deserialize, Serialize};
use crate::games::CallbackGame;
use crate::user::ChatAdministratorRights;
use crate::message::WebAppInfo;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct InlineKeyboardMarkup {
pub inline_keyboard: Vec<Vec<InlineKeyboardButton>>,
}
impl InlineKeyboardMarkup {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn row(mut self, row: Vec<InlineKeyboardButton>) -> Self {
self.inline_keyboard.push(row);
self
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InlineKeyboardButton {
pub text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub icon_custom_emoji_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub style: Option<ButtonStyle>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_data: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub web_app: Option<WebAppInfo>,
#[serde(skip_serializing_if = "Option::is_none")]
pub login_url: Option<LoginUrl>,
#[serde(skip_serializing_if = "Option::is_none")]
pub switch_inline_query: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub switch_inline_query_current_chat: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub switch_inline_query_chosen_chat: Option<SwitchInlineQueryChosenChat>,
#[serde(skip_serializing_if = "Option::is_none")]
pub copy_text: Option<CopyTextButton>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_game: Option<CallbackGame>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pay: Option<bool>,
}
impl InlineKeyboardButton {
#[must_use]
pub fn callback(text: impl Into<String>, data: impl Into<String>) -> Self {
Self {
text: text.into(),
callback_data: Some(data.into()),
icon_custom_emoji_id: None,
style: None,
url: None,
web_app: None,
login_url: None,
switch_inline_query: None,
switch_inline_query_current_chat: None,
switch_inline_query_chosen_chat: None,
copy_text: None,
callback_game: None,
pay: None,
}
}
#[must_use]
pub fn url(text: impl Into<String>, url: impl Into<String>) -> Self {
Self {
text: text.into(),
url: Some(url.into()),
icon_custom_emoji_id: None,
style: None,
callback_data: None,
web_app: None,
login_url: None,
switch_inline_query: None,
switch_inline_query_current_chat: None,
switch_inline_query_chosen_chat: None,
copy_text: None,
callback_game: None,
pay: None,
}
}
#[must_use]
pub fn web_app(text: impl Into<String>, url: impl Into<String>) -> Self {
Self {
text: text.into(),
web_app: Some(WebAppInfo { url: url.into() }),
icon_custom_emoji_id: None,
style: None,
url: None,
callback_data: None,
login_url: None,
switch_inline_query: None,
switch_inline_query_current_chat: None,
switch_inline_query_chosen_chat: None,
copy_text: None,
callback_game: None,
pay: None,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ButtonStyle {
Danger,
Success,
Primary,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LoginUrl {
pub url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub forward_text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bot_username: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_write_access: Option<bool>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SwitchInlineQueryChosenChat {
#[serde(skip_serializing_if = "Option::is_none")]
pub query: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_user_chats: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_bot_chats: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_group_chats: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_channel_chats: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CopyTextButton {
pub text: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReplyKeyboardMarkup {
pub keyboard: Vec<Vec<KeyboardButton>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_persistent: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resize_keyboard: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub one_time_keyboard: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub input_field_placeholder: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub selective: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KeyboardButton {
pub text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub icon_custom_emoji_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub style: Option<ButtonStyle>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_users: Option<KeyboardButtonRequestUsers>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_chat: Option<KeyboardButtonRequestChat>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_managed_bot: Option<KeyboardButtonRequestManagedBot>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_contact: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_location: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_poll: Option<KeyboardButtonPollType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub web_app: Option<WebAppInfo>,
}
impl KeyboardButton {
#[must_use]
pub fn text(label: impl Into<String>) -> Self {
Self {
text: label.into(),
icon_custom_emoji_id: None,
style: None,
request_users: None,
request_chat: None,
request_managed_bot: None,
request_contact: None,
request_location: None,
request_poll: None,
web_app: None,
}
}
#[must_use]
pub fn request_contact(label: impl Into<String>) -> Self {
Self {
request_contact: Some(true),
..Self::text(label)
}
}
#[must_use]
pub fn request_location(label: impl Into<String>) -> Self {
Self {
request_location: Some(true),
..Self::text(label)
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KeyboardButtonRequestUsers {
pub request_id: i32,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_is_bot: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_is_premium: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_quantity: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_name: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_username: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_photo: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KeyboardButtonRequestChat {
pub request_id: i32,
pub chat_is_channel: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub chat_is_forum: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub chat_has_username: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub chat_is_created: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_administrator_rights: Option<ChatAdministratorRights>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bot_administrator_rights: Option<ChatAdministratorRights>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bot_is_member: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_title: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_username: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_photo: Option<bool>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct KeyboardButtonRequestManagedBot {
pub request_id: i32,
#[serde(skip_serializing_if = "Option::is_none")]
pub suggested_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub suggested_username: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KeyboardButtonPollType {
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub kind: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReplyKeyboardRemove {
pub remove_keyboard: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub selective: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ForceReply {
pub force_reply: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub input_field_placeholder: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub selective: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ReplyMarkup {
InlineKeyboard(InlineKeyboardMarkup),
ReplyKeyboard(ReplyKeyboardMarkup),
Remove(ReplyKeyboardRemove),
ForceReply(ForceReply),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum MenuButton {
Commands,
WebApp {
text: String,
web_app: WebAppInfo,
},
Default,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[non_exhaustive]
pub struct PreparedKeyboardButton {
pub id: String,
}