diff --git a/lib/src/prelude.rs b/lib/src/prelude.rs index c8f7b549c1..2467d7ac63 100644 --- a/lib/src/prelude.rs +++ b/lib/src/prelude.rs @@ -5,6 +5,7 @@ pub use telegram_bot_raw::CanAnswerCallbackQuery; pub use telegram_bot_raw::CanAnswerInlineQuery; pub use telegram_bot_raw::CanExportChatInviteLink; +pub use telegram_bot_raw::CanGetStickerSet; pub use telegram_bot_raw::CanLeaveChat; pub use telegram_bot_raw::CanSendChatAction; pub use telegram_bot_raw::{CanDeleteMessage, CanForwardMessage}; diff --git a/lib/src/util/messages.rs b/lib/src/util/messages.rs index 14fa6d3c8e..9577e22d75 100644 --- a/lib/src/util/messages.rs +++ b/lib/src/util/messages.rs @@ -3,8 +3,10 @@ //! [`telegram_bot_raw::types::message`]: ../../telegram_bot_raw/types/message/index.html use crate::prelude::CanGetFile; +use crate::prelude::CanGetStickerSet; use crate::types::{ - requests::get_file::GetFile, ChannelPost, Message, MessageKind, MessageOrChannelPost, + requests::get_file::GetFile, requests::get_sticker_set::GetStickerSet, ChannelPost, Message, + MessageKind, MessageOrChannelPost, }; /// A trait to obtain text from a message. @@ -152,3 +154,51 @@ impl MessageGetFiles for ChannelPost { self.kind.get_files() } } + +/// A trait to obtain `GetStickerSet` requests from a message. +/// +/// Only available on a sticker message. +pub trait MessageGetStickerSet { + /// Obtain a sticker set from a message if available. + fn get_sticker_set(&self) -> Option; +} + +impl MessageGetStickerSet for Message { + fn get_sticker_set<'a>(&'a self) -> Option { + self.kind.get_sticker_set() + } +} + +impl MessageGetStickerSet for MessageKind { + fn get_sticker_set<'a>(&'a self) -> Option { + match self { + MessageKind::Text { .. } => None, + MessageKind::Audio { .. } => None, + MessageKind::Document { .. } => None, + MessageKind::Photo { .. } => None, + MessageKind::Sticker { data } => match data.set_name { + Some(_) => Some(data.get_sticker_set()), + None => None, + }, + MessageKind::Video { .. } => None, + MessageKind::Voice { .. } => None, + MessageKind::VideoNote { .. } => None, + MessageKind::Contact { .. } => None, + MessageKind::Location { .. } => None, + MessageKind::Poll { .. } => None, + MessageKind::Venue { .. } => None, + MessageKind::NewChatMembers { .. } => None, + MessageKind::LeftChatMember { .. } => None, + MessageKind::NewChatTitle { .. } => None, + MessageKind::NewChatPhoto { .. } => None, + MessageKind::DeleteChatPhoto => None, + MessageKind::GroupChatCreated => None, + MessageKind::SupergroupChatCreated => None, + MessageKind::ChannelChatCreated => None, + MessageKind::MigrateToChatId { .. } => None, + MessageKind::MigrateFromChatId { .. } => None, + MessageKind::PinnedMessage { .. } => None, + MessageKind::Unknown { .. } => None, + } + } +} diff --git a/raw/src/requests/get_sticker_set.rs b/raw/src/requests/get_sticker_set.rs new file mode 100644 index 0000000000..9ec9932082 --- /dev/null +++ b/raw/src/requests/get_sticker_set.rs @@ -0,0 +1,43 @@ +use crate::requests::*; +use crate::types::*; + +/// Use this method to get a sticker set. +#[derive(Debug, Clone, PartialEq, PartialOrd, Serialize)] +#[must_use = "requests do nothing unless sent"] +pub struct GetStickerSet { + name: StickerSetRef, +} + +impl Request for GetStickerSet { + type Type = JsonRequestType; + type Response = JsonIdResponse; + + fn serialize(&self) -> Result { + Self::Type::serialize(RequestUrl::method("getStickerSet"), self) + } +} + +impl GetStickerSet { + pub fn new(set: S) -> Self + where + S: ToStickerSetRef, + { + Self { + name: set.to_sticker_set_ref(), + } + } +} + +/// Get basic info about a sticker set and prepare it for downloading. +pub trait CanGetStickerSet { + fn get_sticker_set(&self) -> GetStickerSet; +} + +impl CanGetStickerSet for S +where + S: ToStickerSetRef, +{ + fn get_sticker_set(&self) -> GetStickerSet { + GetStickerSet::new(self) + } +} diff --git a/raw/src/requests/mod.rs b/raw/src/requests/mod.rs index 4d744a2d1a..590be240cd 100644 --- a/raw/src/requests/mod.rs +++ b/raw/src/requests/mod.rs @@ -15,6 +15,7 @@ pub mod get_chat_member; pub mod get_chat_members_count; pub mod get_file; pub mod get_me; +pub mod get_sticker_set; pub mod get_updates; pub mod get_user_profile_photos; pub mod kick_chat_member; @@ -51,6 +52,7 @@ pub use self::get_chat_member::*; pub use self::get_chat_members_count::*; pub use self::get_file::*; pub use self::get_me::*; +pub use self::get_sticker_set::*; pub use self::get_updates::*; pub use self::get_user_profile_photos::*; pub use self::kick_chat_member::*; diff --git a/raw/src/types/message.rs b/raw/src/types/message.rs index b43824e64f..c2dfa245d1 100644 --- a/raw/src/types/message.rs +++ b/raw/src/types/message.rs @@ -772,6 +772,23 @@ pub struct Sticker { pub file_size: Option, } +/// This object represents a sticker set. +#[derive(Debug, Clone, PartialEq, PartialOrd, Deserialize)] +pub struct StickerSet { + /// Sticker set name. + pub name: String, + /// Sticket set title. + pub title: String, + /// True, if the sticker set contains animated stickers. + pub is_animated: bool, + /// True, if the sticker set contains masks. + pub contains_masks: bool, + /// List of all set stickers. + pub stickers: Vec, + /// Sticker set thumbnail in the .WEBP or .TGS format. + pub thumb: Option, +} + /// This object represents a video file. #[derive(Debug, Clone, PartialEq, PartialOrd, Deserialize)] pub struct Video { diff --git a/raw/src/types/refs.rs b/raw/src/types/refs.rs index aa51f16093..90640ac2da 100644 --- a/raw/src/types/refs.rs +++ b/raw/src/types/refs.rs @@ -269,6 +269,9 @@ specific_chat_id_impls!(ChannelId, Channel); pub struct ChatId(Integer); chat_id_impls!(ChatId); +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct Name(String); + /// Get `MessageId` from the type reference. pub trait ToMessageId { fn to_message_id(&self) -> MessageId; @@ -378,6 +381,59 @@ impl Serialize for FileRef { } } +/// Get `StickerSetRef` from the type reference. +pub trait ToStickerSetRef { + fn to_sticker_set_ref(&self) -> StickerSetRef; +} + +impl ToStickerSetRef for S +where + S: Deref, + S::Target: ToStickerSetRef, +{ + fn to_sticker_set_ref(&self) -> StickerSetRef { + self.deref().to_sticker_set_ref() + } +} + +impl ToStickerSetRef for Sticker { + fn to_sticker_set_ref(&self) -> StickerSetRef { + match &self.set_name { + Some(s) => s.to_owned().into(), + None => panic!("Failed to convert sticker set_name to StickerSetRef"), + } + } +} + +/// Unique sticker set name identifier reference. +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct StickerSetRef { + pub(crate) inner: String, +} + +impl<'a> From<&'a str> for StickerSetRef { + fn from(s: &'a str) -> Self { + StickerSetRef { + inner: s.to_string(), + } + } +} + +impl<'a> From for StickerSetRef { + fn from(s: String) -> Self { + StickerSetRef { inner: s.clone() } + } +} + +impl Serialize for StickerSetRef { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_str(&self.inner) + } +} + /// Get `CallbackQueryId` from the type reference. pub trait ToCallbackQueryId { fn to_callback_query_id(&self) -> CallbackQueryId;