diff --git a/src/api/guilds/member.rs b/src/api/guilds/member.rs index b301b99..a6ec7d7 100644 --- a/src/api/guilds/member.rs +++ b/src/api/guilds/member.rs @@ -1,8 +1,60 @@ use reqwest::Client; +use serde_json::from_str; -use crate::{instance::UserMeta, limit::LimitedRequester, types}; +use crate::{errors::ChorusLibError, instance::UserMeta, limit::LimitedRequester, types}; impl types::GuildMember { + /// Retrieves a guild member by their ID. + /// + /// # Arguments + /// + /// * `user` - A mutable reference to a [`UserMeta`] instance. + /// * `guild_id` - The ID of the guild. + /// * `member_id` - The ID of the member. + /// + /// # Returns + /// + /// A [`Result`] containing a [`GuildMember`] if the request succeeds, or a [`ChorusLibError`] if the request fails. + pub async fn get( + user: &mut UserMeta, + guild_id: &str, + member_id: &str, + ) -> Result { + let mut belongs_to = user.belongs_to.borrow_mut(); + let url = format!( + "{}/guilds/{}/members/{}/", + belongs_to.urls.get_api(), + guild_id, + member_id + ); + let request = Client::new().get(url).bearer_auth(user.token()); + let response = LimitedRequester::new() + .await + .send_request( + request, + crate::api::limits::LimitType::Guild, + &mut belongs_to.limits, + &mut user.limits, + ) + .await + .unwrap(); + let response_text = match response.text().await { + Ok(string) => string, + Err(e) => { + return Err(ChorusLibError::InvalidResponseError { + error: e.to_string(), + }) + } + }; + let member = from_str::(&response_text); + if member.is_err() { + return Err(ChorusLibError::InvalidResponseError { + error: member.err().unwrap().to_string(), + }); + } + Ok(member.unwrap()) + } + /// Adds a role to a guild member. /// /// # Arguments diff --git a/tests/member.rs b/tests/member.rs index f4b22fd..a19f5e0 100644 --- a/tests/member.rs +++ b/tests/member.rs @@ -7,7 +7,32 @@ async fn add_remove_role() { let role_id = &bundle.role.id.to_string(); let user_id = &bundle.user.object.id.to_string(); chorus::types::GuildMember::add_role(&mut bundle.user, guild_id, user_id, role_id).await; + let member = chorus::types::GuildMember::get(&mut bundle.user, &guild_id, &user_id) + .await + .unwrap(); + let mut role_found = false; + for role in member.roles.iter() { + if role == role_id { + println!("Role found: {:?}", role); + role_found = true; + } + } + if !role_found { + assert!(false) + } chorus::types::GuildMember::remove_role(&mut bundle.user, guild_id, user_id, role_id).await; - // TODO: Implement /guilds/{guild_id}/members/{member_id}/ GET route. + let member = chorus::types::GuildMember::get(&mut bundle.user, &guild_id, &user_id) + .await + .unwrap(); + for role in member.roles.iter() { + if role != role_id { + role_found = false; + } else { + assert!(false); + } + } + if role_found { + assert!(false) + } common::teardown(bundle).await }