use std::convert::From;
use serde_json;
use failure::{Error, Fail};
use futures::Future;
use erased_serde::Serialize;
use crate::bot::RequestHandle;
use crate::objects::{self, Integer};
use crate::file::{self, MediaFile};
use crate::error::ErrorKind;
#[derive(Serialize)]
pub enum ParseMode {
Markdown,
HTML,
Text,
}
impl Into<String> for ParseMode {
fn into(self) -> String {
let tmp = match self {
ParseMode::Markdown => "Markdown",
ParseMode::HTML => "HTML",
ParseMode::Text => "Text",
};
tmp.into()
}
}
pub enum Action {
Typing,
UploadPhoto,
RecordVideo,
UploadVideo,
RecordAudio,
UploadAudio,
UploadDocument,
FindLocation,
}
pub enum ReplyMarkup {
InlineKeyboardMarkup(objects::InlineKeyboardMarkup),
ReplyKeyboardMarkup(objects::ReplyKeyboardMarkup),
ReplyKeyboardRemove(objects::ReplyKeyboardRemove),
ForceReply(objects::ForceReply),
}
impl ::serde::Serialize for ReplyMarkup {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: ::serde::Serializer,
{
use self::ReplyMarkup::*;
match self {
&InlineKeyboardMarkup(ref x) => x.serialize(serializer),
&ReplyKeyboardMarkup(ref x) => x.serialize(serializer),
&ReplyKeyboardRemove(ref x) => x.serialize(serializer),
&ForceReply(ref x) => x.serialize(serializer),
}
}
}
impl From<objects::InlineKeyboardMarkup> for ReplyMarkup {
fn from(f: objects::InlineKeyboardMarkup) -> Self {
ReplyMarkup::InlineKeyboardMarkup(f)
}
}
impl From<objects::ReplyKeyboardMarkup> for ReplyMarkup {
fn from(f: objects::ReplyKeyboardMarkup) -> Self {
ReplyMarkup::ReplyKeyboardMarkup(f)
}
}
impl From<objects::ReplyKeyboardRemove> for ReplyMarkup {
fn from(f: objects::ReplyKeyboardRemove) -> Self {
ReplyMarkup::ReplyKeyboardRemove(f)
}
}
impl From<objects::ForceReply> for ReplyMarkup {
fn from(f: objects::ForceReply) -> Self {
ReplyMarkup::ForceReply(f)
}
}
impl Into<String> for Action {
fn into(self) -> String {
let tmp = match self {
Action::Typing => "Typing",
Action::UploadPhoto => "UploadPhoto",
Action::RecordVideo => "RecordVideo",
Action::UploadVideo => "UploadVideo",
Action::RecordAudio => "RecordVideo",
Action::UploadAudio => "UploadAudio",
Action::UploadDocument => "UploadDocument",
Action::FindLocation => "FindLocation",
};
tmp.into()
}
}
#[derive(TelegramFunction, Serialize)]
#[call = "getMe"]
#[answer = "User"]
#[function = "get_me"]
pub struct GetMe;
#[derive(TelegramFunction, Serialize)]
#[call = "getUpdates"]
#[answer = "Updates"]
#[function = "get_updates"]
pub struct GetUpdates {
#[serde(skip_serializing_if = "Option::is_none")]
offset: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
limit: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
timeout: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
allowed_updates: Option<Vec<String>>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "sendMessage"]
#[answer = "Message"]
#[function = "message"]
pub struct SendMessage {
chat_id: Integer,
text: String,
#[serde(skip_serializing_if = "Option::is_none")]
parse_mode: Option<ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
disable_web_page_preview: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
disable_notification: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_to_message_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_markup: Option<ReplyMarkup>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "forwardMessage"]
#[answer = "Message"]
#[function = "forward"]
pub struct FowardMessage {
chat_id: Integer,
from_chat_id: Integer,
message_id: Integer,
#[serde(skip_serializing_if = "Option::is_none")]
disable_notification: Option<bool>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "sendPhoto"]
#[answer = "Message"]
#[function = "photo"]
#[file_kind = "photo"]
pub struct SendPhoto {
chat_id: Integer,
#[serde(skip_serializing_if = "Option::is_none")]
photo: Option<MediaFile>,
#[serde(skip_serializing_if = "Option::is_none")]
caption: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
parse_mode: Option<ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
disable_notification: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_to_message_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_markup: Option<ReplyMarkup>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "sendAudio"]
#[answer = "Message"]
#[function = "audio"]
#[file_kind = "audio"]
pub struct SendAudio {
chat_id: Integer,
#[serde(skip_serializing_if = "Option::is_none")]
audio: Option<MediaFile>,
#[serde(skip_serializing_if = "Option::is_none")]
caption: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
parse_mode: Option<ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
duration: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
performer: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
disable_notification: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_to_message_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_markup: Option<ReplyMarkup>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "sendDocument"]
#[answer = "Message"]
#[function = "document"]
#[file_kind = "document"]
pub struct SendDocument {
chat_id: Integer,
#[serde(skip_serializing_if = "Option::is_none")]
document: Option<MediaFile>,
#[serde(skip_serializing_if = "Option::is_none")]
caption: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
parse_mode: Option<ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
disable_notification: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_to_message_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_markup: Option<ReplyMarkup>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "sendSticker"]
#[answer = "Message"]
#[function = "sticker"]
#[file_kind = "sticker"]
pub struct SendSticker {
chat_id: Integer,
#[serde(skip_serializing_if = "Option::is_none")]
sticker: Option<MediaFile>,
#[serde(skip_serializing_if = "Option::is_none")]
disable_notification: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_to_message_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_markup: Option<ReplyMarkup>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "sendVideo"]
#[answer = "Message"]
#[function = "video"]
#[file_kind = "video"]
pub struct SendVideo {
chat_id: Integer,
#[serde(skip_serializing_if = "Option::is_none")]
video: Option<MediaFile>,
#[serde(skip_serializing_if = "Option::is_none")]
duration: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
width: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
height: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
caption: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
parse_mode: Option<ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
disable_notification: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_to_message_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_markup: Option<ReplyMarkup>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "sendVoice"]
#[answer = "Message"]
#[function = "voice"]
#[file_kind = "voice"]
pub struct SendVoice {
chat_id: Integer,
#[serde(skip_serializing_if = "Option::is_none")]
voice: Option<MediaFile>,
#[serde(skip_serializing_if = "Option::is_none")]
caption: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
parse_mode: Option<ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
duration: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
disable_notification: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_to_message_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_markup: Option<ReplyMarkup>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "sendMediaGroup"]
#[answer = "Messages"]
#[function = "mediagroup"]
#[file_kind = "media"]
pub struct SendMediaGroup {
chat_id: Integer,
media: Option<MediaFile>,
#[serde(skip_serializing_if = "Option::is_none")]
disable_notification: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_to_message_id: Option<Integer>
}
#[derive(TelegramFunction, Serialize)]
#[call = "sendLocation"]
#[answer = "Message"]
#[function = "location"]
pub struct SendLocation {
chat_id: Integer,
latitude: f32,
longitude: f32,
#[serde(skip_serializing_if = "Option::is_none")]
disable_notification: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_to_message_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_markup: Option<ReplyMarkup>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "sendVenue"]
#[answer = "Message"]
#[function = "venue"]
pub struct SendVenue {
chat_id: Integer,
latitude: f32,
longitude: f32,
title: String,
address: String,
#[serde(skip_serializing_if = "Option::is_none")]
foursquare_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
disable_notification: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_to_message_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_markup: Option<ReplyMarkup>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "sendContact"]
#[answer = "Message"]
#[function = "contact"]
pub struct SendContact {
chat_id: Integer,
phone_number: String,
first_name: String,
last_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
disable_notification: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_to_message_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_markup: Option<ReplyMarkup>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "sendChatAction"]
#[answer = "Boolean"]
#[function = "chat_action"]
pub struct SendAction {
chat_id: Integer,
action: String,
}
#[derive(TelegramFunction, Serialize)]
#[call = "sendGame"]
#[answer = "Message"]
#[function = "send_game"]
pub struct SendGame {
chat_id: Integer,
game_short_name: String,
#[serde(skip_serializing_if = "Option::is_none")]
disable_notification: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_to_message_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_markup: Option<objects::InlineKeyboardMarkup>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "setGameScore"]
#[answer = "Message"]
#[function = "set_game_score"]
pub struct SetGameScore {
user_id: Integer,
score: Integer,
#[serde(skip_serializing_if = "Option::is_none")]
force: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
disable_edit_message: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
chat_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
message_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
inline_message_id: Option<String>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "getGameHighScores"]
#[answer = "GameHighScore"]
#[function = "get_game_high_scores"]
pub struct GetGameHighScores {
user_id: Integer,
#[serde(skip_serializing_if = "Option::is_none")]
chat_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
message_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
inline_message_id: Option<String>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "getUserProfilePhotos"]
#[answer = "UserProfilePhotos"]
#[function = "get_user_profile_photos"]
pub struct GetUserProfilePhotos {
user_id: Integer,
#[serde(skip_serializing_if = "Option::is_none")]
offset: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
limit: Option<Integer>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "getFile"]
#[answer = "File"]
#[function = "get_file"]
pub struct GetFile {
file_id: String,
}
#[derive(TelegramFunction, Serialize)]
#[call = "kickChatMember"]
#[answer = "Boolean"]
#[function = "kick_chat_member"]
pub struct KickChatMember {
chat_id: Integer,
user_id: Integer,
}
#[derive(TelegramFunction, Serialize)]
#[call = "leaveChat"]
#[answer = "Boolean"]
#[function = "leave_chat"]
pub struct LeaveChat {
chat_id: Integer,
}
#[derive(TelegramFunction, Serialize)]
#[call = "unbanChatMember"]
#[answer = "Boolean"]
#[function = "unban_chat_member"]
pub struct UnbanChatMember {
chat_id: Integer,
user_id: Integer,
}
#[derive(TelegramFunction, Serialize)]
#[call = "restrictChatMember"]
#[answer = "Boolean"]
#[function = "restrict_chat_member"]
pub struct RestrictChatMember {
chat_id: Integer,
user_id: Integer,
#[serde(skip_serializing_if = "Option::is_none")]
until_date: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
can_send_messages: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
can_send_media_messages: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
can_send_other_messages: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
can_add_web_previews: Option<bool>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "promoteChatMember"]
#[answer = "Boolean"]
#[function = "promote_chat_member"]
pub struct PromoteChatMember {
chat_id: Integer,
user_id: Integer,
#[serde(skip_serializing_if = "Option::is_none")]
can_change_into: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
can_post_messages: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
can_edit_messages: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
can_delete_messages: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
can_invite_users: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
can_restrict_members: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
can_pin_messages: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
can_promote_members: Option<bool>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "exportChatInviteLink"]
#[answer = "Link"]
#[function = "export_chat_invite_link"]
pub struct ExportChatInviteLink {
chat_id: Integer,
}
#[derive(TelegramFunction, Serialize)]
#[call = "deleteChatPhoto"]
#[answer = "Boolean"]
#[function = "delete_chat_photo"]
pub struct DeleteChatPhoto {
chat_id: Integer,
}
#[derive(TelegramFunction, Serialize)]
#[call = "setChatTitle"]
#[answer = "Boolean"]
#[function = "set_chat_title"]
pub struct SetChatTitle {
chat_id: Integer,
title: String,
}
#[derive(TelegramFunction, Serialize)]
#[call = "setChatDescription"]
#[answer = "Boolean"]
#[function = "set_chat_description"]
pub struct SetChatDescription {
chat_id: Integer,
description: String,
}
#[derive(TelegramFunction, Serialize)]
#[call = "pinChatMessage"]
#[answer = "Boolean"]
#[function = "pin_chat_message"]
pub struct PinChatMessage {
chat_id: Integer,
message_id: Integer,
#[serde(skip_serializing_if = "Option::is_none")]
disable_notification: Option<bool>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "unpinChatMessage"]
#[answer = "Boolean"]
#[function = "unpin_chat_message"]
pub struct UnpinChatMessage {
chat_id: Integer,
}
#[derive(TelegramFunction, Serialize)]
#[call = "getChat"]
#[answer = "Chat"]
#[function = "get_chat"]
pub struct GetChat {
chat_id: Integer,
}
#[derive(TelegramFunction, Serialize)]
#[call = "getChatAdministrators"]
#[answer = "Vector<objects::ChatMember>"]
#[function = "unban_chat_administrators"]
pub struct GetChatAdministrators {
chat_id: Integer,
}
#[derive(TelegramFunction, Serialize)]
#[call = "getChatMembersCount"]
#[answer = "Integer"]
#[function = "get_chat_members_count"]
pub struct GetChatMemberCounts {
chat_id: Integer,
}
#[derive(TelegramFunction, Serialize)]
#[call = "getChatMember"]
#[answer = "ChatMember"]
#[function = "get_chat_member"]
pub struct GetChatMember {
chat_id: Integer,
user_id: Integer,
}
#[derive(TelegramFunction, Serialize)]
#[call = "answerCallbackQuery"]
#[answer = "Boolean"]
#[function = "answer_callback_query"]
pub struct AnswerCallbackQuery {
callback_query_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
show_alert: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
cache_time: Option<Integer>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "answerInlineQuery"]
#[answer = "Boolean"]
#[function = "answer_inline_query"]
pub struct AnswerInlineQuery {
inline_query_id: String,
results: Vec<Box<Serialize + Send>>,
#[serde(skip_serializing_if = "Option::is_none")]
cache_time: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
is_personal: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
next_offset: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
switch_pm_text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
switch_pm_parameter: Option<String>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "editMessageText"]
#[answer = "EditResponse"]
#[function = "edit_message_text"]
pub struct EditMessageText {
text: String,
#[serde(skip_serializing_if = "Option::is_none")]
chat_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
message_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
inline_message_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
parse_mode: Option<ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
disable_web_page_preview: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_markup: Option<objects::InlineKeyboardMarkup>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "editMessageCaption"]
#[answer = "EditResponse"]
#[function = "edit_message_caption"]
pub struct EditMessageCaption {
#[serde(skip_serializing_if = "Option::is_none")]
chat_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
message_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
inline_message_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
caption: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
parse_mode: Option<ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_markup: Option<objects::InlineKeyboardMarkup>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "editMessageReplyMarkup"]
#[answer = "EditResponse"]
#[function = "edit_message_reply_markup"]
pub struct EditMessageReplyMarkup {
#[serde(skip_serializing_if = "Option::is_none")]
chat_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
message_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
inline_message_id: Option<Integer>,
#[serde(skip_serializing_if = "Option::is_none")]
reply_markup: Option<objects::InlineKeyboardMarkup>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "deleteMessage"]
#[answer = "Boolean"]
#[function = "delete_message"]
pub struct DeleteMessage {
chat_id: Integer,
message_id: Integer,
}
#[derive(TelegramFunction, Serialize)]
#[call = "createNewStickerSet"]
#[answer = "Boolean"]
#[function = "create_new_sticker_set"]
#[file_kind = "png_sticker"]
pub struct CreateNewStickerSet {
user_id: Integer,
name: String,
title: String,
emojis: String,
#[serde(skip_serializing_if = "Option::is_none")]
png_sticker: Option<MediaFile>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "addStickerToSet"]
#[answer = "Boolean"]
#[function = "add_sticker_to_set"]
#[file_kind = "png_sticker"]
pub struct AddStickerToSet {
user_id: Integer,
name: String,
emojis: String,
#[serde(skip_serializing_if = "Option::is_none")]
png_sticker: Option<MediaFile>,
}
#[derive(TelegramFunction, Serialize)]
#[call = "deleteStickerFromSet"]
#[answer = "Boolean"]
#[function = "delete_sticker_from_set"]
pub struct DeleteStickerFromSet {
sticker: String,
}