use crate::client::Bot;
use serde::Serialize;
/// As of v.4.0, Telegram clients support rounded square MPEG4 videos of up to 1 minute long. Use this method to send video messages. On success, the sent Message is returned.
/// # Documentation
/// <https://core.telegram.org/bots/api#sendvideonote>
/// # Returns
/// - `crate::types::Message`
#[derive(Clone, Debug, Serialize)]
pub struct SendVideoNote {
/// Unique identifier of the business connection on behalf of which the message will be sent
#[serde(skip_serializing_if = "Option::is_none")]
pub business_connection_id: Option<Box<str>>,
/// Unique identifier for the target chat or username of the target channel (in the format @channelusername)
pub chat_id: crate::types::ChatIdKind,
/// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only
#[serde(skip_serializing_if = "Option::is_none")]
pub message_thread_id: Option<i64>,
/// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat
#[serde(skip_serializing_if = "Option::is_none")]
pub direct_messages_topic_id: Option<i64>,
/// Video note to send. Pass a `file_id` as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. More information on Sending Files: <https://core.telegram.org/bots/api#sending-files>. Sending video notes by a URL is currently unsupported
pub video_note: crate::types::InputFile,
/// Duration of sent video in seconds
#[serde(skip_serializing_if = "Option::is_none")]
pub duration: Option<i64>,
/// Video width and height, i.e. diameter of the video message
#[serde(skip_serializing_if = "Option::is_none")]
pub length: Option<i64>,
/// Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass `attach://<file_attach_name>` if the thumbnail was uploaded using multipart/form-data under <`file_attach_name`>. More information on Sending Files: <https://core.telegram.org/bots/api#sending-files>
#[serde(skip_serializing_if = "Option::is_none")]
pub thumbnail: Option<crate::types::InputFile>,
/// Sends the message silently. Users will receive a notification with no sound.
#[serde(skip_serializing_if = "Option::is_none")]
pub disable_notification: Option<bool>,
/// Protects the contents of the sent message from forwarding and saving
#[serde(skip_serializing_if = "Option::is_none")]
pub protect_content: Option<bool>,
/// Pass `true` to allow up to 1000 messages per second, ignoring broadcasting limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_paid_broadcast: Option<bool>,
/// Unique identifier of the message effect to be added to the message; for private chats only
#[serde(skip_serializing_if = "Option::is_none")]
pub message_effect_id: Option<Box<str>>,
/// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.
#[serde(skip_serializing_if = "Option::is_none")]
pub suggested_post_parameters: Option<crate::types::SuggestedPostParameters>,
/// Description of the message to reply to
#[serde(skip_serializing_if = "Option::is_none")]
pub reply_parameters: Option<crate::types::ReplyParameters>,
/// Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user
#[serde(skip_serializing_if = "Option::is_none")]
pub reply_markup: Option<crate::types::ReplyMarkup>,
}
impl SendVideoNote {
/// Creates a new `SendVideoNote`.
///
/// # Arguments
/// * `chat_id` - Unique identifier for the target chat or username of the target channel (in the format @channelusername)
/// * `video_note` - Video note to send. Pass a `file_id` as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. More information on Sending Files: <https://core.telegram.org/bots/api#sending-files>. Sending video notes by a URL is currently unsupported
///
/// # Notes
/// Use builder methods to set optional fields.
#[must_use]
pub fn new<T0: Into<crate::types::ChatIdKind>, T1: Into<crate::types::InputFile>>(
chat_id: T0,
video_note: T1,
) -> Self {
Self {
business_connection_id: None,
chat_id: chat_id.into(),
message_thread_id: None,
direct_messages_topic_id: None,
video_note: video_note.into(),
duration: None,
length: None,
thumbnail: None,
disable_notification: None,
protect_content: None,
allow_paid_broadcast: None,
message_effect_id: None,
suggested_post_parameters: None,
reply_parameters: None,
reply_markup: None,
}
}
/// Unique identifier of the business connection on behalf of which the message will be sent
#[must_use]
pub fn business_connection_id<T: Into<Box<str>>>(self, val: T) -> Self {
let mut this = self;
this.business_connection_id = Some(val.into());
this
}
/// Unique identifier of the business connection on behalf of which the message will be sent
#[must_use]
pub fn business_connection_id_option<T: Into<Box<str>>>(self, val: Option<T>) -> Self {
let mut this = self;
this.business_connection_id = val.map(Into::into);
this
}
/// Unique identifier for the target chat or username of the target channel (in the format @channelusername)
#[must_use]
pub fn chat_id<T: Into<crate::types::ChatIdKind>>(self, val: T) -> Self {
let mut this = self;
this.chat_id = val.into();
this
}
/// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only
#[must_use]
pub fn message_thread_id<T: Into<i64>>(self, val: T) -> Self {
let mut this = self;
this.message_thread_id = Some(val.into());
this
}
/// Unique identifier for the target message thread (topic) of a forum; for forum supergroups and private chats of bots with forum topic mode enabled only
#[must_use]
pub fn message_thread_id_option<T: Into<i64>>(self, val: Option<T>) -> Self {
let mut this = self;
this.message_thread_id = val.map(Into::into);
this
}
/// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat
#[must_use]
pub fn direct_messages_topic_id<T: Into<i64>>(self, val: T) -> Self {
let mut this = self;
this.direct_messages_topic_id = Some(val.into());
this
}
/// Identifier of the direct messages topic to which the message will be sent; required if the message is sent to a direct messages chat
#[must_use]
pub fn direct_messages_topic_id_option<T: Into<i64>>(self, val: Option<T>) -> Self {
let mut this = self;
this.direct_messages_topic_id = val.map(Into::into);
this
}
/// Video note to send. Pass a `file_id` as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. More information on Sending Files: <https://core.telegram.org/bots/api#sending-files>. Sending video notes by a URL is currently unsupported
#[must_use]
pub fn video_note<T: Into<crate::types::InputFile>>(self, val: T) -> Self {
let mut this = self;
this.video_note = val.into();
this
}
/// Duration of sent video in seconds
#[must_use]
pub fn duration<T: Into<i64>>(self, val: T) -> Self {
let mut this = self;
this.duration = Some(val.into());
this
}
/// Duration of sent video in seconds
#[must_use]
pub fn duration_option<T: Into<i64>>(self, val: Option<T>) -> Self {
let mut this = self;
this.duration = val.map(Into::into);
this
}
/// Video width and height, i.e. diameter of the video message
#[must_use]
pub fn length<T: Into<i64>>(self, val: T) -> Self {
let mut this = self;
this.length = Some(val.into());
this
}
/// Video width and height, i.e. diameter of the video message
#[must_use]
pub fn length_option<T: Into<i64>>(self, val: Option<T>) -> Self {
let mut this = self;
this.length = val.map(Into::into);
this
}
/// Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass `attach://<file_attach_name>` if the thumbnail was uploaded using multipart/form-data under <`file_attach_name`>. More information on Sending Files: <https://core.telegram.org/bots/api#sending-files>
#[must_use]
pub fn thumbnail<T: Into<crate::types::InputFile>>(self, val: T) -> Self {
let mut this = self;
this.thumbnail = Some(val.into());
this
}
/// Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass `attach://<file_attach_name>` if the thumbnail was uploaded using multipart/form-data under <`file_attach_name`>. More information on Sending Files: <https://core.telegram.org/bots/api#sending-files>
#[must_use]
pub fn thumbnail_option<T: Into<crate::types::InputFile>>(self, val: Option<T>) -> Self {
let mut this = self;
this.thumbnail = val.map(Into::into);
this
}
/// Sends the message silently. Users will receive a notification with no sound.
#[must_use]
pub fn disable_notification<T: Into<bool>>(self, val: T) -> Self {
let mut this = self;
this.disable_notification = Some(val.into());
this
}
/// Sends the message silently. Users will receive a notification with no sound.
#[must_use]
pub fn disable_notification_option<T: Into<bool>>(self, val: Option<T>) -> Self {
let mut this = self;
this.disable_notification = val.map(Into::into);
this
}
/// Protects the contents of the sent message from forwarding and saving
#[must_use]
pub fn protect_content<T: Into<bool>>(self, val: T) -> Self {
let mut this = self;
this.protect_content = Some(val.into());
this
}
/// Protects the contents of the sent message from forwarding and saving
#[must_use]
pub fn protect_content_option<T: Into<bool>>(self, val: Option<T>) -> Self {
let mut this = self;
this.protect_content = val.map(Into::into);
this
}
/// Pass `true` to allow up to 1000 messages per second, ignoring broadcasting limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance
#[must_use]
pub fn allow_paid_broadcast<T: Into<bool>>(self, val: T) -> Self {
let mut this = self;
this.allow_paid_broadcast = Some(val.into());
this
}
/// Pass `true` to allow up to 1000 messages per second, ignoring broadcasting limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance
#[must_use]
pub fn allow_paid_broadcast_option<T: Into<bool>>(self, val: Option<T>) -> Self {
let mut this = self;
this.allow_paid_broadcast = val.map(Into::into);
this
}
/// Unique identifier of the message effect to be added to the message; for private chats only
#[must_use]
pub fn message_effect_id<T: Into<Box<str>>>(self, val: T) -> Self {
let mut this = self;
this.message_effect_id = Some(val.into());
this
}
/// Unique identifier of the message effect to be added to the message; for private chats only
#[must_use]
pub fn message_effect_id_option<T: Into<Box<str>>>(self, val: Option<T>) -> Self {
let mut this = self;
this.message_effect_id = val.map(Into::into);
this
}
/// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.
#[must_use]
pub fn suggested_post_parameters<T: Into<crate::types::SuggestedPostParameters>>(
self,
val: T,
) -> Self {
let mut this = self;
this.suggested_post_parameters = Some(val.into());
this
}
/// A JSON-serialized object containing the parameters of the suggested post to send; for direct messages chats only. If the message is sent as a reply to another suggested post, then that suggested post is automatically declined.
#[must_use]
pub fn suggested_post_parameters_option<T: Into<crate::types::SuggestedPostParameters>>(
self,
val: Option<T>,
) -> Self {
let mut this = self;
this.suggested_post_parameters = val.map(Into::into);
this
}
/// Description of the message to reply to
#[must_use]
pub fn reply_parameters<T: Into<crate::types::ReplyParameters>>(self, val: T) -> Self {
let mut this = self;
this.reply_parameters = Some(val.into());
this
}
/// Description of the message to reply to
#[must_use]
pub fn reply_parameters_option<T: Into<crate::types::ReplyParameters>>(
self,
val: Option<T>,
) -> Self {
let mut this = self;
this.reply_parameters = val.map(Into::into);
this
}
/// Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user
#[must_use]
pub fn reply_markup<T: Into<crate::types::ReplyMarkup>>(self, val: T) -> Self {
let mut this = self;
this.reply_markup = Some(val.into());
this
}
/// Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to remove a reply keyboard or to force a reply from the user
#[must_use]
pub fn reply_markup_option<T: Into<crate::types::ReplyMarkup>>(self, val: Option<T>) -> Self {
let mut this = self;
this.reply_markup = val.map(Into::into);
this
}
}
impl super::TelegramMethod for SendVideoNote {
type Method = Self;
type Return = crate::types::Message;
fn build_request<Client>(mut self, _bot: &Bot<Client>) -> super::Request<Self::Method> {
let mut files = vec![];
super::prepare_file(&mut files, &mut self.video_note);
if let Some(file) = &mut self.thumbnail {
super::prepare_file(&mut files, file);
}
super::Request::new("sendVideoNote", self, Some(files))
}
}