diff --git a/src/requests/mod.rs b/src/requests/mod.rs index 3eef8f34..04c2251b 100644 --- a/src/requests/mod.rs +++ b/src/requests/mod.rs @@ -14,7 +14,8 @@ pub use self::{ forward_message::ForwardMessage, get_chat::GetChat, get_file::GetFile, get_me::GetMe, get_updates::GetUpdates, get_user_profile_photos::GetUserProfilePhotos, - kick_chat_member::KickChatMember, restrict_chat_member::RestrictChatMember, + kick_chat_member::KickChatMember, pin_chat_message::PinChatMessage, + restrict_chat_member::RestrictChatMember, send_audio::SendAudio, send_chat_action::SendChatAction, send_contact::SendContact, send_location::SendLocation, send_media_group::SendMediaGroup, send_message::SendMessage, @@ -89,6 +90,7 @@ mod get_me; mod get_updates; mod get_user_profile_photos; mod kick_chat_member; +mod pin_chat_message; mod restrict_chat_member; mod send_audio; mod send_chat_action; diff --git a/src/requests/pin_chat_message.rs b/src/requests/pin_chat_message.rs new file mode 100644 index 00000000..f50110b2 --- /dev/null +++ b/src/requests/pin_chat_message.rs @@ -0,0 +1,47 @@ +use crate::requests::{ChatId, RequestContext, RequestFuture, ResponseResult, Request}; +use crate::network; + +/// Use this method to get up to date information about the chat +/// (current name of the user for one-on-one conversations, +/// current username of a user, group or channel, etc.). +/// Returns a Chat object on success. +#[derive(Debug, Clone, Serialize)] +pub struct PinChatMessage<'a> { + #[serde(skip_serializing)] + ctx: RequestContext<'a>, + /// Unique identifier for the target chat or username + /// of the target supergroup or channel (in the format @channelusername) + pub chat_id: ChatId, + pub message_id: i32, + pub disable_notification: Option +} + +impl<'a> PinChatMessage<'a> { + pub(crate) fn new( + ctx: RequestContext<'a>, chat_id: ChatId, message_id: i32 + ) -> Self { + Self { ctx, chat_id, message_id, disable_notification: None } + } + + pub fn disable_notification(mut self, val: T) -> Self + where T: Into + { + self.disable_notification = Some(val.into()); + self + } +} + +impl<'a> Request<'a> for PinChatMessage<'a> { + type ReturnValue = bool; // TODO: change to unit type True + + fn send(self) -> RequestFuture<'a, ResponseResult> { + Box::pin(async move { + network::request_json( + &self.ctx.client, + &self.ctx.token, + "pinChatMessage", + &self, + ).await + }) + } +} diff --git a/src/types/encrypted_passport_element.rs b/src/types/encrypted_passport_element.rs index 0a013bf1..61b1fa47 100644 --- a/src/types/encrypted_passport_element.rs +++ b/src/types/encrypted_passport_element.rs @@ -1,75 +1,67 @@ use super::passport_file::PassportFile; -#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone, Serialize)] +#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)] pub struct EncryptedPassportElement { - #[serde(rename = "type")] - pub element_type: ElementType, - pub data: String, - pub phone_number: String, - pub email: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub files: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub front_size: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub reverse_side: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub selfie: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub translation: Option>, + pub hash: String, + #[serde(flatten)] + pub kind: EncryptedPassportElementKind } -#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone, Serialize)] +#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)] #[serde(rename_all = "snake_case")] -pub enum ElementType { - PersonalData, - Passport, - DriverLicense, - IdentityCard, - Address, - UtilityBill, - BankStatement, - RentalAgreement, - PassportRegistration, - TemporaryRegistration, - PhoneNumber, - Email, -} - -#[cfg(test)] -mod tests { - use super::super::{ElementType, EncryptedPassportElement, PassportFile}; - #[test] - fn must_serialize_encrypted_passport_element_to_json() { - // given - let expected_json = r#" - { - "type":"passport_registration", - "data":"somedata", - "phone_number":"1313", - "email":"someemail", - "front_size":{"file_id":"someId","file_size":13,"file_date":13} - }"# - .replace("\n", "") - .replace(" ", ""); - - let passport_element = EncryptedPassportElement { - element_type: ElementType::PassportRegistration, - data: "somedata".to_string(), - phone_number: "1313".to_string(), - email: "someemail".to_string(), - files: None, - front_size: Some(PassportFile { - file_id: "someId".to_string(), - file_size: 13, - file_date: 13, - }), - reverse_side: None, - selfie: None, - translation: None, - }; - - let actual_json = serde_json::to_string(&passport_element).unwrap(); - assert_eq!(actual_json, expected_json) - } +pub enum EncryptedPassportElementKind { + PersonalDetails { + data: String + }, + Passport { + data: String, + front_side: PassportFile, + selfie: PassportFile, + translation: Option> + }, + DriverLicense { + data: String, + front_side: PassportFile, + reverse_side: PassportFile, + selfie: PassportFile, + translation: Option> + }, + IdentityCard { + data: String, + front_side: PassportFile, + reverse_side: PassportFile, + selfie: PassportFile, + translation: Option> + }, + InternalPassport { + data: String, + front_side: PassportFile, + selfie: PassportFile, + translation: Option> + }, + Address { + data: String + }, + UtilityBill { + files: Vec, + translation: Option> + }, + BankStatement { + files: Vec, + translation: Option> + }, + RentalAgreement { + files: Vec, + translation: Option> + }, + PassportRegistration { + files: Vec, + translation: Option> + }, + TemporaryRegistration { + files: Vec, + translation: Option> + }, + PhoneNumber { phone_number: String }, + Email { email: String } } diff --git a/src/types/message.rs b/src/types/message.rs index 905d79d4..2bc8a102 100644 --- a/src/types/message.rs +++ b/src/types/message.rs @@ -15,7 +15,7 @@ pub struct Message { } impl Message { - fn text(&self) -> Option<&str> { + pub fn text(&self) -> Option<&str> { if let MessageKind::Common { media_kind: MediaKind::Text { ref text, .. }, .. diff --git a/src/types/mod.rs b/src/types/mod.rs index 893d492f..2c1c221b 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -12,7 +12,7 @@ pub use self::{ contact::Contact, document::Document, encrypted_credintials::EncryptedCredentials, - encrypted_passport_element::{ElementType, EncryptedPassportElement}, + encrypted_passport_element::{EncryptedPassportElement, EncryptedPassportElementKind}, file::File, force_reply::ForceReply, game::Game, diff --git a/src/types/passport_data.rs b/src/types/passport_data.rs index 9c7ffc89..8ca8e20c 100644 --- a/src/types/passport_data.rs +++ b/src/types/passport_data.rs @@ -6,63 +6,3 @@ pub struct PassportData { pub data: Vec, pub credentials: EncryptedCredentials, } - -#[cfg(test)] -mod tests { - use super::super::{ElementType, PassportFile}; - use super::*; - - #[test] - fn must_serialize_passport_data_to_json() { - let expected_json = r#"{ - "data": - [ - { - "type":"passport_registration", - "data":"somedata", - "phone_number":"1313", - "email":"someemail", - "front_size": - { - "file_id":"someId", - "file_size":13, - "file_date":13 - } - } - ], - "credentials": - { - "data":"someData", - "hash":"1122", - "secret":"secret" - } - }"# - .replace("\n", "") - .replace(" ", ""); - let passport_data = PassportData { - data: vec![EncryptedPassportElement { - element_type: ElementType::PassportRegistration, - data: "somedata".to_string(), - phone_number: "1313".to_string(), - email: "someemail".to_string(), - files: None, - front_size: Some(PassportFile { - file_id: "someId".to_string(), - file_size: 13, - file_date: 13, - }), - reverse_side: None, - selfie: None, - translation: None, - }], - credentials: EncryptedCredentials { - data: "someData".to_string(), - hash: "1122".to_string(), - secret: "secret".to_string(), - }, - }; - - let actual_json = serde_json::to_string(&passport_data).unwrap(); - assert_eq!(actual_json, expected_json) - } -}