diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fc64a20..887e19ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `ApiError::TooMuchInlineQueryResults` ([#135][pr135]) - Support for 5.4 telegram bot API ([#133][pr133]) +- Support for 5.5 telegram bot API ([#143][pr143]) - `EditedMessageIsTooLong` error ([#109][pr109]) - `UntilDate` enum and use it for `{Restricted, Banned}::until_date` ([#116][pr116]) - `Limits::messages_per_min_channel` ([#121][pr121]) @@ -23,6 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [pr135]: https://github.com/teloxide/teloxide-core/pull/135 [pr139]: https://github.com/teloxide/teloxide-core/pull/139 [pr140]: https://github.com/teloxide/teloxide-core/pull/140 +[pr143]: https://github.com/teloxide/teloxide-core/pull/143 ### Changed diff --git a/src/adaptors/auto_send.rs b/src/adaptors/auto_send.rs index 5e9c7285..c496d899 100644 --- a/src/adaptors/auto_send.rs +++ b/src/adaptors/auto_send.rs @@ -90,7 +90,8 @@ where stop_message_live_location, stop_message_live_location_inline, send_venue, send_contact, send_poll, send_dice, send_chat_action, get_user_profile_photos, get_file, kick_chat_member, ban_chat_member, unban_chat_member, restrict_chat_member, - promote_chat_member, set_chat_administrator_custom_title, set_chat_permissions, + promote_chat_member, set_chat_administrator_custom_title, + ban_chat_sender_chat, unban_chat_sender_chat, set_chat_permissions, export_chat_invite_link, create_chat_invite_link, edit_chat_invite_link, revoke_chat_invite_link, set_chat_photo, delete_chat_photo, set_chat_title, set_chat_description, pin_chat_message, unpin_chat_message, unpin_all_chat_messages, diff --git a/src/adaptors/cache_me.rs b/src/adaptors/cache_me.rs index b38101b8..99f8c5d5 100644 --- a/src/adaptors/cache_me.rs +++ b/src/adaptors/cache_me.rs @@ -97,7 +97,8 @@ where stop_message_live_location, stop_message_live_location_inline, send_venue, send_contact, send_poll, send_dice, send_chat_action, get_user_profile_photos, get_file, kick_chat_member, ban_chat_member, unban_chat_member, restrict_chat_member, - promote_chat_member, set_chat_administrator_custom_title, set_chat_permissions, + promote_chat_member, set_chat_administrator_custom_title, + ban_chat_sender_chat, unban_chat_sender_chat, set_chat_permissions, export_chat_invite_link, create_chat_invite_link, edit_chat_invite_link, revoke_chat_invite_link, set_chat_photo, delete_chat_photo, set_chat_title, set_chat_description, pin_chat_message, unpin_chat_message, unpin_all_chat_messages, diff --git a/src/adaptors/erased.rs b/src/adaptors/erased.rs index c30ebbd5..585f199e 100644 --- a/src/adaptors/erased.rs +++ b/src/adaptors/erased.rs @@ -166,7 +166,8 @@ where stop_message_live_location, stop_message_live_location_inline, send_venue, send_contact, send_poll, send_dice, send_chat_action, get_user_profile_photos, get_file, kick_chat_member, ban_chat_member, unban_chat_member, restrict_chat_member, - promote_chat_member, set_chat_administrator_custom_title, set_chat_permissions, + promote_chat_member, set_chat_administrator_custom_title, + ban_chat_sender_chat, unban_chat_sender_chat, set_chat_permissions, export_chat_invite_link, create_chat_invite_link, edit_chat_invite_link, revoke_chat_invite_link, set_chat_photo, delete_chat_photo, set_chat_title, set_chat_description, pin_chat_message, unpin_chat_message, unpin_all_chat_messages, @@ -386,6 +387,18 @@ trait ErasableRequester<'a> { custom_title: String, ) -> ErasedRequest<'a, SetChatAdministratorCustomTitle, Self::Err>; + fn ban_chat_sender_chat( + &self, + chat_id: ChatId, + sender_chat_id: i64, + ) -> ErasedRequest<'a, BanChatSenderChat, Self::Err>; + + fn unban_chat_sender_chat( + &self, + chat_id: ChatId, + sender_chat_id: i64, + ) -> ErasedRequest<'a, UnbanChatSenderChat, Self::Err>; + fn set_chat_permissions( &self, chat_id: ChatId, @@ -960,6 +973,22 @@ where Requester::set_chat_administrator_custom_title(self, chat_id, user_id, custom_title).erase() } + fn ban_chat_sender_chat( + &self, + chat_id: ChatId, + sender_chat_id: i64, + ) -> ErasedRequest<'a, BanChatSenderChat, Self::Err> { + Requester::ban_chat_sender_chat(self, chat_id, sender_chat_id).erase() + } + + fn unban_chat_sender_chat( + &self, + chat_id: ChatId, + sender_chat_id: i64, + ) -> ErasedRequest<'a, UnbanChatSenderChat, Self::Err> { + Requester::unban_chat_sender_chat(self, chat_id, sender_chat_id).erase() + } + fn set_chat_permissions( &self, chat_id: ChatId, diff --git a/src/adaptors/parse_mode.rs b/src/adaptors/parse_mode.rs index 12ba2ff6..c347c428 100644 --- a/src/adaptors/parse_mode.rs +++ b/src/adaptors/parse_mode.rs @@ -102,7 +102,8 @@ impl<B: Requester> Requester for DefaultParseMode<B> { stop_message_live_location, stop_message_live_location_inline, send_venue, send_contact, send_dice, send_chat_action, get_user_profile_photos, get_file, kick_chat_member, ban_chat_member, unban_chat_member, restrict_chat_member, - promote_chat_member, set_chat_administrator_custom_title, set_chat_permissions, + promote_chat_member, set_chat_administrator_custom_title, + ban_chat_sender_chat, unban_chat_sender_chat, set_chat_permissions, export_chat_invite_link, create_chat_invite_link, edit_chat_invite_link, revoke_chat_invite_link, set_chat_photo, delete_chat_photo, set_chat_title, set_chat_description, pin_chat_message, unpin_chat_message, unpin_all_chat_messages, diff --git a/src/adaptors/throttle.rs b/src/adaptors/throttle.rs index 96073954..291e389a 100644 --- a/src/adaptors/throttle.rs +++ b/src/adaptors/throttle.rs @@ -605,7 +605,8 @@ where stop_message_live_location, stop_message_live_location_inline, send_chat_action, get_user_profile_photos, get_file, kick_chat_member, ban_chat_member, unban_chat_member, restrict_chat_member, promote_chat_member, - set_chat_administrator_custom_title, set_chat_permissions, + set_chat_administrator_custom_title, + ban_chat_sender_chat, unban_chat_sender_chat, set_chat_permissions, export_chat_invite_link, create_chat_invite_link, edit_chat_invite_link, revoke_chat_invite_link, set_chat_photo, delete_chat_photo, set_chat_title, set_chat_description, pin_chat_message, unpin_chat_message, unpin_all_chat_messages, diff --git a/src/adaptors/trace.rs b/src/adaptors/trace.rs index 9f7ded47..6139070c 100644 --- a/src/adaptors/trace.rs +++ b/src/adaptors/trace.rs @@ -122,7 +122,8 @@ where stop_message_live_location, stop_message_live_location_inline, send_venue, send_contact, send_poll, send_dice, send_chat_action, get_user_profile_photos, get_file, kick_chat_member, ban_chat_member, unban_chat_member, restrict_chat_member, - promote_chat_member, set_chat_administrator_custom_title, set_chat_permissions, + promote_chat_member, set_chat_administrator_custom_title, + ban_chat_sender_chat, unban_chat_sender_chat, set_chat_permissions, export_chat_invite_link, create_chat_invite_link, edit_chat_invite_link, revoke_chat_invite_link, set_chat_photo, delete_chat_photo, set_chat_title, set_chat_description, pin_chat_message, unpin_chat_message, unpin_all_chat_messages, diff --git a/src/bot/api.rs b/src/bot/api.rs index c03a19fd..750a8f1a 100644 --- a/src/bot/api.rs +++ b/src/bot/api.rs @@ -399,6 +399,34 @@ impl Requester for Bot { ) } + type BanChatSenderChat = JsonRequest<payloads::BanChatSenderChat>; + + fn ban_chat_sender_chat<C>(&self, chat_id: C, sender_chat_id: i64) -> Self::BanChatSenderChat + where + C: Into<ChatId>, + { + Self::BanChatSenderChat::new( + self.clone(), + payloads::BanChatSenderChat::new(chat_id, sender_chat_id), + ) + } + + type UnbanChatSenderChat = JsonRequest<payloads::UnbanChatSenderChat>; + + fn unban_chat_sender_chat<C>( + &self, + chat_id: C, + sender_chat_id: i64, + ) -> Self::UnbanChatSenderChat + where + C: Into<ChatId>, + { + Self::UnbanChatSenderChat::new( + self.clone(), + payloads::UnbanChatSenderChat::new(chat_id, sender_chat_id), + ) + } + type SetChatPermissions = JsonRequest<payloads::SetChatPermissions>; fn set_chat_permissions<C>( diff --git a/src/local_macros.rs b/src/local_macros.rs index b278c285..626789de 100644 --- a/src/local_macros.rs +++ b/src/local_macros.rs @@ -739,6 +739,22 @@ macro_rules! requester_forward { $body!(set_chat_administrator_custom_title this (chat_id: Ch, user_id: i64, custom_title: Cu)) } }; + (@method ban_chat_sender_chat $body:ident $ty:ident) => { + type BanChatSenderChat = $ty![BanChatSenderChat]; + + fn ban_chat_sender_chat<C>(&self, chat_id: C, sender_chat_id: i64) -> Self::BanChatSenderChat where C: Into<ChatId> { + let this = self; + $body!(ban_chat_sender_chat this (chat_id: C, sender_chat_id: i64)) + } + }; + (@method unban_chat_sender_chat $body:ident $ty:ident) => { + type UnbanChatSenderChat = $ty![UnbanChatSenderChat]; + + fn unban_chat_sender_chat<C>(&self, chat_id: C, sender_chat_id: i64) -> Self::UnbanChatSenderChat where C: Into<ChatId> { + let this = self; + $body!(unban_chat_sender_chat this (chat_id: C, sender_chat_id: i64)) + } + }; (@method set_chat_permissions $body:ident $ty:ident) => { type SetChatPermissions = $ty![SetChatPermissions]; @@ -1187,4 +1203,5 @@ macro_rules! requester_forward { $body!(get_updates_fault_tolerant this ()) } }; + } diff --git a/src/payloads.rs b/src/payloads.rs index 5f386927..d069ce5f 100644 --- a/src/payloads.rs +++ b/src/payloads.rs @@ -27,6 +27,7 @@ mod answer_pre_checkout_query; mod answer_shipping_query; mod approve_chat_join_request; mod ban_chat_member; +mod ban_chat_sender_chat; mod close; mod copy_message; mod create_chat_invite_link; @@ -106,6 +107,7 @@ mod stop_message_live_location; mod stop_message_live_location_inline; mod stop_poll; mod unban_chat_member; +mod unban_chat_sender_chat; mod unpin_all_chat_messages; mod unpin_chat_message; mod upload_sticker_file; @@ -117,6 +119,7 @@ pub use answer_pre_checkout_query::{AnswerPreCheckoutQuery, AnswerPreCheckoutQue pub use answer_shipping_query::{AnswerShippingQuery, AnswerShippingQuerySetters}; pub use approve_chat_join_request::{ApproveChatJoinRequest, ApproveChatJoinRequestSetters}; pub use ban_chat_member::{BanChatMember, BanChatMemberSetters}; +pub use ban_chat_sender_chat::{BanChatSenderChat, BanChatSenderChatSetters}; pub use close::{Close, CloseSetters}; pub use copy_message::{CopyMessage, CopyMessageSetters}; pub use create_chat_invite_link::{CreateChatInviteLink, CreateChatInviteLinkSetters}; @@ -204,6 +207,7 @@ pub use stop_message_live_location_inline::{ }; pub use stop_poll::{StopPoll, StopPollSetters}; pub use unban_chat_member::{UnbanChatMember, UnbanChatMemberSetters}; +pub use unban_chat_sender_chat::{UnbanChatSenderChat, UnbanChatSenderChatSetters}; pub use unpin_all_chat_messages::{UnpinAllChatMessages, UnpinAllChatMessagesSetters}; pub use unpin_chat_message::{UnpinChatMessage, UnpinChatMessageSetters}; pub use upload_sticker_file::{UploadStickerFile, UploadStickerFileSetters}; diff --git a/src/payloads/ban_chat_sender_chat.rs b/src/payloads/ban_chat_sender_chat.rs new file mode 100644 index 00000000..d46e5def --- /dev/null +++ b/src/payloads/ban_chat_sender_chat.rs @@ -0,0 +1,24 @@ +// This file is auto generated by [`cg`] from [`schema`]. +// +// **DO NOT EDIT THIS FILE**, +// +// Edit `cg` or `schema` instead. +// +// [cg]: https://github.com/teloxide/cg +// [`schema`]: https://github.com/WaffleLapkin/tg-methods-schema +use serde::Serialize; + +use crate::types::{ChatId, True}; + +impl_payload! { + /// Use this method to ban a channel chat in a supergroup or a channel. The owner of the chat will not be able to send messages and join live streams on behalf of the chat, unless it is unbanned first. The bot must be an administrator in the supergroup or channel for this to work and must have the appropriate administrator rights. + #[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize)] + pub BanChatSenderChat (BanChatSenderChatSetters) => True { + required { + /// Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) + pub chat_id: ChatId [into], + /// Unique identifier of the target sender chat + pub sender_chat_id: i64, + } + } +} diff --git a/src/payloads/setters.rs b/src/payloads/setters.rs index 88623f6c..1fb5ead2 100644 --- a/src/payloads/setters.rs +++ b/src/payloads/setters.rs @@ -10,17 +10,17 @@ pub use crate::payloads::{ AddStickerToSetSetters as _, AnswerCallbackQuerySetters as _, AnswerInlineQuerySetters as _, AnswerPreCheckoutQuerySetters as _, AnswerShippingQuerySetters as _, - ApproveChatJoinRequestSetters as _, BanChatMemberSetters as _, CloseSetters as _, - CopyMessageSetters as _, CreateChatInviteLinkSetters as _, CreateNewStickerSetSetters as _, - DeclineChatJoinRequestSetters as _, DeleteChatPhotoSetters as _, - DeleteChatStickerSetSetters as _, DeleteMessageSetters as _, DeleteMyCommandsSetters as _, - DeleteStickerFromSetSetters as _, DeleteWebhookSetters as _, EditChatInviteLinkSetters as _, - EditMessageCaptionInlineSetters as _, EditMessageCaptionSetters as _, - EditMessageLiveLocationInlineSetters as _, EditMessageLiveLocationSetters as _, - EditMessageMediaInlineSetters as _, EditMessageMediaSetters as _, - EditMessageReplyMarkupInlineSetters as _, EditMessageReplyMarkupSetters as _, - EditMessageTextInlineSetters as _, EditMessageTextSetters as _, - ExportChatInviteLinkSetters as _, ForwardMessageSetters as _, + ApproveChatJoinRequestSetters as _, BanChatMemberSetters as _, BanChatSenderChatSetters as _, + CloseSetters as _, CopyMessageSetters as _, CreateChatInviteLinkSetters as _, + CreateNewStickerSetSetters as _, DeclineChatJoinRequestSetters as _, + DeleteChatPhotoSetters as _, DeleteChatStickerSetSetters as _, DeleteMessageSetters as _, + DeleteMyCommandsSetters as _, DeleteStickerFromSetSetters as _, DeleteWebhookSetters as _, + EditChatInviteLinkSetters as _, EditMessageCaptionInlineSetters as _, + EditMessageCaptionSetters as _, EditMessageLiveLocationInlineSetters as _, + EditMessageLiveLocationSetters as _, EditMessageMediaInlineSetters as _, + EditMessageMediaSetters as _, EditMessageReplyMarkupInlineSetters as _, + EditMessageReplyMarkupSetters as _, EditMessageTextInlineSetters as _, + EditMessageTextSetters as _, ExportChatInviteLinkSetters as _, ForwardMessageSetters as _, GetChatAdministratorsSetters as _, GetChatMemberCountSetters as _, GetChatMemberSetters as _, GetChatMembersCountSetters as _, GetChatSetters as _, GetFileSetters as _, GetGameHighScoresSetters as _, GetMeSetters as _, GetMyCommandsSetters as _, @@ -39,6 +39,6 @@ pub use crate::payloads::{ SetMyCommandsSetters as _, SetPassportDataErrorsSetters as _, SetStickerPositionInSetSetters as _, SetStickerSetThumbSetters as _, SetWebhookSetters as _, StopMessageLiveLocationInlineSetters as _, StopMessageLiveLocationSetters as _, - StopPollSetters as _, UnbanChatMemberSetters as _, UnpinAllChatMessagesSetters as _, - UnpinChatMessageSetters as _, UploadStickerFileSetters as _, + StopPollSetters as _, UnbanChatMemberSetters as _, UnbanChatSenderChatSetters as _, + UnpinAllChatMessagesSetters as _, UnpinChatMessageSetters as _, UploadStickerFileSetters as _, }; diff --git a/src/payloads/unban_chat_sender_chat.rs b/src/payloads/unban_chat_sender_chat.rs new file mode 100644 index 00000000..17f5d9db --- /dev/null +++ b/src/payloads/unban_chat_sender_chat.rs @@ -0,0 +1,24 @@ +// This file is auto generated by [`cg`] from [`schema`]. +// +// **DO NOT EDIT THIS FILE**, +// +// Edit `cg` or `schema` instead. +// +// [cg]: https://github.com/teloxide/cg +// [`schema`]: https://github.com/WaffleLapkin/tg-methods-schema +use serde::Serialize; + +use crate::types::{ChatId, True}; + +impl_payload! { + /// Use this method to unban a previously banned channel chat in a supergroup or channel. The bot must be an administrator for this to work and must have the appropriate administrator rights. + #[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize)] + pub UnbanChatSenderChat (UnbanChatSenderChatSetters) => True { + required { + /// Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) + pub chat_id: ChatId [into], + /// Unique identifier of the target sender chat + pub sender_chat_id: i64, + } + } +} diff --git a/src/requests/requester.rs b/src/requests/requester.rs index c26660d1..342e1fb4 100644 --- a/src/requests/requester.rs +++ b/src/requests/requester.rs @@ -368,6 +368,24 @@ pub trait Requester { Ch: Into<ChatId>, Cu: Into<String>; + type BanChatSenderChat: Request<Payload = BanChatSenderChat, Err = Self::Err>; + + /// For Telegram documentation see [`BanChatSenderChat`]. + fn ban_chat_sender_chat<C>(&self, chat_id: C, sender_chat_id: i64) -> Self::BanChatSenderChat + where + C: Into<ChatId>; + + type UnbanChatSenderChat: Request<Payload = UnbanChatSenderChat, Err = Self::Err>; + + /// For Telegram documentation see [`UnbanChatSenderChat`]. + fn unban_chat_sender_chat<C>( + &self, + chat_id: C, + sender_chat_id: i64, + ) -> Self::UnbanChatSenderChat + where + C: Into<ChatId>; + type SetChatPermissions: Request<Payload = SetChatPermissions, Err = Self::Err>; /// For Telegram documentation see [`SetChatPermissions`]. @@ -867,7 +885,8 @@ macro_rules! forward_all { stop_message_live_location, stop_message_live_location_inline, send_venue, send_contact, send_poll, send_dice, send_chat_action, get_user_profile_photos, get_file, kick_chat_member, ban_chat_member, unban_chat_member, restrict_chat_member, - promote_chat_member, set_chat_administrator_custom_title, set_chat_permissions, + promote_chat_member, set_chat_administrator_custom_title, + ban_chat_sender_chat, unban_chat_sender_chat, set_chat_permissions, export_chat_invite_link, create_chat_invite_link, edit_chat_invite_link, revoke_chat_invite_link, set_chat_photo, delete_chat_photo, set_chat_title, set_chat_description, pin_chat_message, unpin_chat_message, unpin_all_chat_messages, @@ -963,7 +982,8 @@ where stop_message_live_location, stop_message_live_location_inline, send_venue, send_contact, send_poll, send_dice, send_chat_action, get_user_profile_photos, get_file, kick_chat_member, ban_chat_member, unban_chat_member, restrict_chat_member, - promote_chat_member, set_chat_administrator_custom_title, set_chat_permissions, + promote_chat_member, set_chat_administrator_custom_title, + ban_chat_sender_chat, unban_chat_sender_chat, set_chat_permissions, export_chat_invite_link, create_chat_invite_link, edit_chat_invite_link, revoke_chat_invite_link, set_chat_photo, delete_chat_photo, set_chat_title, set_chat_description, pin_chat_message, unpin_chat_message, unpin_all_chat_messages, diff --git a/src/types/chat.rs b/src/types/chat.rs index aaedc5d2..e46f06ae 100644 --- a/src/types/chat.rs +++ b/src/types/chat.rs @@ -1,6 +1,6 @@ use serde::{Deserialize, Serialize}; -use crate::types::{ChatLocation, ChatPermissions, ChatPhoto, Message}; +use crate::types::{ChatLocation, ChatPermissions, ChatPhoto, Message, True}; /// This object represents a chat. /// @@ -95,6 +95,13 @@ pub struct ChatPrivate { /// /// [`GetChat`]: crate::payloads::GetChat pub bio: Option<String>, + + /// `True`, if privacy settings of the other party in the private chat + /// allows to use tg://user?id=<user_id> links only in chats with the + /// user. Returned only in [`GetChat`]. + /// + /// [`GetChat`]: crate::payloads::GetChat + pub has_private_forwards: Option<True>, } #[serde_with_macros::skip_serializing_none] @@ -407,6 +414,18 @@ impl Chat { _ => None, } } + + /// `True`, if privacy settings of the other party in the private chat + /// allows to use tg://user?id=<user_id> links only in chats with the + /// user. Returned only in [`GetChat`]. + /// + /// [`GetChat`]: crate::payloads::GetChat + pub fn has_private_forwards(&self) -> Option<True> { + match &self.kind { + ChatKind::Private(this) => this.has_private_forwards, + _ => None, + } + } } #[cfg(test)] @@ -447,6 +466,7 @@ mod tests { first_name: Some("Anon".into()), last_name: None, bio: None, + has_private_forwards: None }), photo: None, pinned_message: None, diff --git a/src/types/inline_keyboard_button.rs b/src/types/inline_keyboard_button.rs index 9da2182c..06a70850 100644 --- a/src/types/inline_keyboard_button.rs +++ b/src/types/inline_keyboard_button.rs @@ -41,7 +41,13 @@ impl InlineKeyboardButton { #[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum InlineKeyboardButtonKind { - /// HTTP or tg:// url to be opened when button is pressed. + /// HTTP or `tg://` url to be opened when button is pressed. + /// + /// Links in the form of `tg://user?id=<user_id>` can be used to mention a + /// user by their ID without using a username, if this is allowed by + /// their privacy settings. This will only work in Telegram versions + /// released after December 7, 2021. Older clients will display _unsupported + /// message_. Url(reqwest::Url), /// An HTTP URL used to automatically authorize the user. Can be used as a diff --git a/src/types/message.rs b/src/types/message.rs index c9a4ed48..3cf6d156 100644 --- a/src/types/message.rs +++ b/src/types/message.rs @@ -89,6 +89,15 @@ pub struct MessageCommon { /// Inline keyboard attached to the message. `login_url` buttons are /// represented as ordinary `url` buttons. pub reply_markup: Option<InlineKeyboardMarkup>, + + /// `true`, if the message is a channel post that was automatically + /// forwarded to the connected discussion group. + #[serde(default)] + pub is_automatic_forward: bool, + + /// `true`, if the message can't be forwarded. + #[serde(default)] + pub has_protected_content: bool, } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] @@ -1026,6 +1035,26 @@ mod getters { _ => None, } } + + pub fn is_automatic_forward(&self) -> bool { + match &self.kind { + Common(MessageCommon { + is_automatic_forward, + .. + }) => *is_automatic_forward, + _ => false, + } + } + + pub fn has_protected_content(&self) -> bool { + match &self.kind { + Common(MessageCommon { + has_protected_content, + .. + }) => *has_protected_content, + _ => false, + } + } } } diff --git a/src/types/update.rs b/src/types/update.rs index 56311400..a4ef8817 100644 --- a/src/types/update.rs +++ b/src/types/update.rs @@ -193,6 +193,7 @@ mod test { first_name: Some(String::from("Waffle")), last_name: None, bio: None, + has_private_forwards: None, }), photo: None, pinned_message: None, @@ -218,6 +219,8 @@ mod test { reply_markup: None, sender_chat: None, author_signature: None, + is_automatic_forward: false, + has_protected_content: false, }), }), };