mirror of
https://github.com/teloxide/teloxide.git
synced 2025-03-20 13:59:00 +01:00
commit
8ccc4449a9
3 changed files with 131 additions and 19 deletions
|
@ -11,6 +11,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
- `InlineKeyboardButton::{pay, login, web_app, callback_game, pay}` constructors ([#231][pr231])
|
- `InlineKeyboardButton::{pay, login, web_app, callback_game, pay}` constructors ([#231][pr231])
|
||||||
- Support for Telegram Bot API [version 6.1](https://core.telegram.org/bots/api#june-20-2022) ([#233][pr233])
|
- Support for Telegram Bot API [version 6.1](https://core.telegram.org/bots/api#june-20-2022) ([#233][pr233])
|
||||||
|
- `StickerKind` that is now used instead of `is_animated` and `is_video` fields of `Sticker` and `StickerSet` ([#238][pr238])
|
||||||
|
|
||||||
|
[pr238]: https://github.com/teloxide/teloxide-core/pull/238
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
use std::{convert::TryFrom, ops::Deref};
|
||||||
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::types::{File, MaskPosition, PhotoSize};
|
use crate::types::{File, MaskPosition, PhotoSize};
|
||||||
|
@ -22,15 +24,9 @@ pub struct Sticker {
|
||||||
/// Sticker height.
|
/// Sticker height.
|
||||||
pub height: u16,
|
pub height: u16,
|
||||||
|
|
||||||
/// `true`, if the sticker is [animated].
|
/// Kind of this sticker - webp, animated or video.
|
||||||
///
|
#[serde(flatten)]
|
||||||
/// [animated]: https://telegram.org/blog/animated-stickers
|
pub kind: StickerKind,
|
||||||
pub is_animated: bool,
|
|
||||||
|
|
||||||
/// `true`, if the sticker is a [video sticker].
|
|
||||||
///
|
|
||||||
/// [video sticker]: https://telegram.org/blog/video-stickers-better-reactions
|
|
||||||
pub is_video: bool,
|
|
||||||
|
|
||||||
/// Sticker thumbnail in the .webp or .jpg format.
|
/// Sticker thumbnail in the .webp or .jpg format.
|
||||||
pub thumb: Option<PhotoSize>,
|
pub thumb: Option<PhotoSize>,
|
||||||
|
@ -50,3 +46,103 @@ pub struct Sticker {
|
||||||
/// File size in bytes.
|
/// File size in bytes.
|
||||||
pub file_size: Option<u32>,
|
pub file_size: Option<u32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Kind of a sticker - webp, animated or video.
|
||||||
|
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
|
||||||
|
#[serde(try_from = "StickerKindRaw", into = "StickerKindRaw")]
|
||||||
|
pub enum StickerKind {
|
||||||
|
/// "Normal", raster sticker.
|
||||||
|
Webp,
|
||||||
|
/// [Animated] sticker.
|
||||||
|
///
|
||||||
|
/// [Animated]: https://telegram.org/blog/animated-stickers
|
||||||
|
Animated,
|
||||||
|
/// [Video] sticker.
|
||||||
|
///
|
||||||
|
/// [Video]: https://telegram.org/blog/video-stickers-better-reactions
|
||||||
|
Video,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// This allows calling [`StickerKind`]'s methods directly on [`Sticker`].
|
||||||
|
///
|
||||||
|
/// ```no_run
|
||||||
|
/// use teloxide_core::types::Sticker;
|
||||||
|
///
|
||||||
|
/// let sticker: Sticker = todo!();
|
||||||
|
///
|
||||||
|
/// let _ = sticker.is_video();
|
||||||
|
/// let _ = sticker.kind.is_video();
|
||||||
|
/// ```
|
||||||
|
impl Deref for Sticker {
|
||||||
|
type Target = StickerKind;
|
||||||
|
|
||||||
|
fn deref(&self) -> &Self::Target {
|
||||||
|
&self.kind
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl StickerKind {
|
||||||
|
/// Returns `true` is this is a "normal" raster sticker.
|
||||||
|
pub fn is_webp(&self) -> bool {
|
||||||
|
matches!(self, Self::Webp)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns `true` is this is an [animated] sticker.
|
||||||
|
///
|
||||||
|
/// [animated]: https://telegram.org/blog/animated-stickers
|
||||||
|
pub fn is_animated(&self) -> bool {
|
||||||
|
matches!(self, Self::Animated)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns `true` is this is a [video] sticker.
|
||||||
|
///
|
||||||
|
/// [video]: https://telegram.org/blog/video-stickers-better-reactions
|
||||||
|
pub fn is_video(&self) -> bool {
|
||||||
|
matches!(self, Self::Video)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
struct StickerKindRaw {
|
||||||
|
is_animated: bool,
|
||||||
|
is_video: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TryFrom<StickerKindRaw> for StickerKind {
|
||||||
|
type Error = &'static str;
|
||||||
|
|
||||||
|
fn try_from(
|
||||||
|
StickerKindRaw {
|
||||||
|
is_animated,
|
||||||
|
is_video,
|
||||||
|
}: StickerKindRaw,
|
||||||
|
) -> Result<Self, Self::Error> {
|
||||||
|
let ret = match (is_animated, is_video) {
|
||||||
|
(false, false) => Self::Webp,
|
||||||
|
(true, false) => Self::Animated,
|
||||||
|
(false, true) => Self::Video,
|
||||||
|
(true, true) => return Err("`is_animated` and `is_video` present at the same time"),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(ret)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<StickerKind> for StickerKindRaw {
|
||||||
|
fn from(kind: StickerKind) -> Self {
|
||||||
|
match kind {
|
||||||
|
StickerKind::Webp => Self {
|
||||||
|
is_animated: false,
|
||||||
|
is_video: false,
|
||||||
|
},
|
||||||
|
StickerKind::Animated => Self {
|
||||||
|
is_animated: true,
|
||||||
|
is_video: false,
|
||||||
|
},
|
||||||
|
StickerKind::Video => Self {
|
||||||
|
is_animated: false,
|
||||||
|
is_video: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
|
use std::ops::Deref;
|
||||||
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::types::{PhotoSize, Sticker};
|
use crate::types::{PhotoSize, Sticker, StickerKind};
|
||||||
|
|
||||||
/// This object represents a sticker set.
|
/// This object represents a sticker set.
|
||||||
///
|
///
|
||||||
|
@ -13,15 +15,8 @@ pub struct StickerSet {
|
||||||
/// Sticker set title.
|
/// Sticker set title.
|
||||||
pub title: String,
|
pub title: String,
|
||||||
|
|
||||||
/// `true`, if the sticker set contains [animated stickers].
|
/// Sticker kind shared by all stickers in this set.
|
||||||
///
|
pub kind: StickerKind,
|
||||||
/// [animates stickers]: https://telegram.org/blog/animated-stickers
|
|
||||||
pub is_animated: bool,
|
|
||||||
|
|
||||||
/// `true`, if the sticker is a [video sticker].
|
|
||||||
///
|
|
||||||
/// [video sticker]: https://telegram.org/blog/video-stickers-better-reactions
|
|
||||||
pub is_video: bool,
|
|
||||||
|
|
||||||
/// `true`, if the sticker set contains masks.
|
/// `true`, if the sticker set contains masks.
|
||||||
pub contains_masks: bool,
|
pub contains_masks: bool,
|
||||||
|
@ -32,3 +27,21 @@ pub struct StickerSet {
|
||||||
/// Sticker set thumbnail in the .WEBP or .TGS format.
|
/// Sticker set thumbnail in the .WEBP or .TGS format.
|
||||||
pub thumb: Option<PhotoSize>,
|
pub thumb: Option<PhotoSize>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// This allows calling [`StickerKind`]'s methods directly on [`StickerSet`].
|
||||||
|
///
|
||||||
|
/// ```no_run
|
||||||
|
/// use teloxide_core::types::StickerSet;
|
||||||
|
///
|
||||||
|
/// let sticker: StickerSet = todo!();
|
||||||
|
///
|
||||||
|
/// let _ = sticker.is_video();
|
||||||
|
/// let _ = sticker.kind.is_video();
|
||||||
|
/// ```
|
||||||
|
impl Deref for StickerSet {
|
||||||
|
type Target = StickerKind;
|
||||||
|
|
||||||
|
fn deref(&self) -> &Self::Target {
|
||||||
|
&self.kind
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue