diff --git a/src/bot/api.rs b/src/bot/api.rs index dae00bdb..7eec264c 100644 --- a/src/bot/api.rs +++ b/src/bot/api.rs @@ -1,6 +1,6 @@ use crate::bot::Bot; use crate::requests::{ - AnswerCallbackQuery, DeleteChatStickerSet, SetChatStickerSet, + AnswerCallbackQuery, DeleteChatStickerSet, GetChatMember, SetChatStickerSet, }; use crate::{ requests::{ @@ -306,4 +306,12 @@ impl Bot { { SetChatStickerSet::new(self, chat_id, sticker_set_name) } + + pub fn get_chat_member<C, I>(&self, chat_id: C, user_id: I) -> GetChatMember + where + C: Into<ChatId>, + I: Into<i32>, + { + GetChatMember::new(self, chat_id, user_id) + } } diff --git a/src/requests/get_chat_member.rs b/src/requests/get_chat_member.rs new file mode 100644 index 00000000..293db180 --- /dev/null +++ b/src/requests/get_chat_member.rs @@ -0,0 +1,71 @@ +use crate::bot::Bot; +use crate::network; +use crate::requests::{Request, ResponseResult}; +use crate::types::{ChatId, ChatMember}; +use async_trait::async_trait; + +/// Use this method to get information about a member of a chat. Returns a +/// ChatMember object on success. +#[derive(Debug, Clone, Serialize)] +pub struct GetChatMember<'a> { + #[serde(skip_serializing)] + bot: &'a Bot, + + /// Unique identifier for the target chat or username of the target + /// supergroup or channel (in the format @channelusername) + chat_id: ChatId, + + /// Unique identifier of the target user + user_id: i32, +} + +#[async_trait] +impl Request for GetChatMember<'_> { + type Output = ChatMember; + + async fn send_boxed(self) -> ResponseResult<Self::Output> { + self.send().await + } +} + +impl GetChatMember<'_> { + async fn send(&self) -> ResponseResult<ChatMember> { + network::request_json( + self.bot.client(), + self.bot.token(), + "getChatMember", + &self, + ) + .await + } +} + +impl<'a> GetChatMember<'a> { + pub(crate) fn new<C, I>(bot: &'a Bot, chat_id: C, user_id: I) -> Self + where + C: Into<ChatId>, + I: Into<i32>, + { + Self { + bot, + chat_id: chat_id.into(), + user_id: user_id.into(), + } + } + + pub fn chat_id<C>(mut self, value: C) -> Self + where + C: Into<ChatId>, + { + self.chat_id = value.into(); + self + } + + pub fn user_id<I>(mut self, value: I) -> Self + where + I: Into<i32>, + { + self.user_id = value.into(); + self + } +} diff --git a/src/requests/mod.rs b/src/requests/mod.rs index ef012de8..a6664eec 100644 --- a/src/requests/mod.rs +++ b/src/requests/mod.rs @@ -10,6 +10,7 @@ pub use delete_chat_sticker_set::*; pub use edit_message_live_location::*; pub use forward_message::*; pub use get_chat::*; +pub use get_chat_member::*; pub use get_file::*; pub use get_me::*; pub use get_updates::*; @@ -47,6 +48,7 @@ mod delete_chat_sticker_set; mod edit_message_live_location; mod forward_message; mod get_chat; +mod get_chat_member; mod get_file; mod get_me; mod get_updates;