From 7b54ff687967dc6c2a0ac36c51edce70a27443d6 Mon Sep 17 00:00:00 2001 From: bitfl0wer Date: Fri, 25 Aug 2023 17:26:01 +0200 Subject: [PATCH] Add Get Guild Ban/s, add audit_log_reason to create_ban --- src/api/guilds/guilds.rs | 96 +++++++++++++++++++++++++++++++------- src/types/entities/user.rs | 2 +- src/types/schema/guild.rs | 8 ++++ tests/guilds.rs | 2 + 4 files changed, 89 insertions(+), 19 deletions(-) diff --git a/src/api/guilds/guilds.rs b/src/api/guilds/guilds.rs index 59936b4..2f0c531 100644 --- a/src/api/guilds/guilds.rs +++ b/src/api/guilds/guilds.rs @@ -8,9 +8,9 @@ use crate::errors::ChorusResult; use crate::instance::ChorusUser; use crate::ratelimiter::ChorusRequest; use crate::types::{ - Channel, ChannelCreateSchema, Guild, GuildBanCreateSchema, GuildCreateSchema, GuildMember, - GuildMemberSearchSchema, GuildModifySchema, GuildPreview, ModifyGuildMemberProfileSchema, - ModifyGuildMemberSchema, UserProfileMetadata, + Channel, ChannelCreateSchema, Guild, GuildBanCreateSchema, GuildBansQuery, GuildCreateSchema, + GuildMember, GuildMemberSearchSchema, GuildModifySchema, GuildPreview, + ModifyGuildMemberProfileSchema, ModifyGuildMemberSchema, UserProfileMetadata, }; use crate::types::{GuildBan, Snowflake}; @@ -146,24 +146,26 @@ impl Guild { pub async fn create_ban( guild_id: Snowflake, user_id: Snowflake, + audit_log_reason: Option, schema: GuildBanCreateSchema, user: &mut ChorusUser, ) -> ChorusResult { - let chorus_request = ChorusRequest { - request: Client::new() - .put(format!( - "{}/guilds/{}/bans/{}", - user.belongs_to.borrow().urls.api, - guild_id, - user_id - )) - .header("Authorization", user.token()) - .body(to_string(&schema).unwrap()), - limit_type: LimitType::Guild(guild_id), - }; - let response = chorus_request - .deserialize_response::(user) - .await?; + let request = ChorusRequest::new( + http::Method::PUT, + format!( + "{}/guilds/{}/bans/{}", + user.belongs_to.borrow().urls.api, + guild_id, + user_id + ) + .as_str(), + Some(to_string(&schema).unwrap()), + audit_log_reason.as_deref(), + None, + Some(user), + LimitType::Guild(guild_id), + ); + let response = request.deserialize_response::(user).await?; Ok(response) } @@ -381,6 +383,64 @@ impl Guild { .deserialize_response::(user) .await } + + /// Returns a list of ban objects for the guild. Requires the `BAN_MEMBERS` permission. + /// + /// # Reference: + /// See + pub async fn get_bans( + user: &mut ChorusUser, + guild_id: Snowflake, + query: Option, + ) -> ChorusResult> { + let url = format!( + "{}/guilds/{}/bans", + user.belongs_to.borrow_mut().urls.api, + guild_id, + ); + + let mut request = ChorusRequest::new( + http::Method::GET, + &url, + None, + None, + None, + Some(user), + LimitType::Guild(guild_id), + ); + if let Some(query) = query { + request.request = request.request.query(&to_string(&query).unwrap()); + } + request.deserialize_response::>(user).await + } + + /// Returns a ban object for the given user. Requires the `BAN_MEMBERS` permission. + /// + /// # Reference: + /// See + pub async fn get_ban( + user: &mut ChorusUser, + guild_id: Snowflake, + user_id: Snowflake, + ) -> ChorusResult { + let url = format!( + "{}/guilds/{}/bans/{}", + user.belongs_to.borrow_mut().urls.api, + guild_id, + user_id + ); + + let request = ChorusRequest::new( + http::Method::GET, + &url, + None, + None, + None, + Some(user), + LimitType::Guild(guild_id), + ); + request.deserialize_response::(user).await + } } impl Channel { diff --git a/src/types/entities/user.rs b/src/types/entities/user.rs index ed18d2d..64334ff 100644 --- a/src/types/entities/user.rs +++ b/src/types/entities/user.rs @@ -123,7 +123,7 @@ bitflags::bitflags! { } } -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, PartialOrd, Eq, Ord)] +#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, PartialOrd)] pub struct UserProfileMetadata { pub guild_id: Option, pub pronouns: String, diff --git a/src/types/schema/guild.rs b/src/types/schema/guild.rs index 51fe423..56c0f9e 100644 --- a/src/types/schema/guild.rs +++ b/src/types/schema/guild.rs @@ -155,3 +155,11 @@ pub struct ModifyGuildMemberProfileSchema { pub popout_animation_particle_type: Option, pub emoji_id: Option, } + +#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, PartialOrd, Eq, Ord)] +/// The limit argument is a number between 1 and 1000. +pub struct GuildBansQuery { + pub before: Option, + pub after: Option, + pub limit: Option, +} diff --git a/tests/guilds.rs b/tests/guilds.rs index 8ae6596..c87e68d 100644 --- a/tests/guilds.rs +++ b/tests/guilds.rs @@ -53,6 +53,7 @@ async fn guild_create_ban() { Guild::create_ban( guild.id, other_user_id, + None, GuildBanCreateSchema::default(), &mut bundle.user, ) @@ -61,6 +62,7 @@ async fn guild_create_ban() { assert!(Guild::create_ban( guild.id, other_user_id, + None, GuildBanCreateSchema::default(), &mut bundle.user, )