diff --git a/src/api/guilds/guilds.rs b/src/api/guilds/guilds.rs index e59f3bc..e2fe66b 100644 --- a/src/api/guilds/guilds.rs +++ b/src/api/guilds/guilds.rs @@ -9,7 +9,7 @@ use crate::instance::ChorusUser; use crate::ratelimiter::ChorusRequest; use crate::types::{ Channel, ChannelCreateSchema, Guild, GuildBanCreateSchema, GuildCreateSchema, GuildMember, - GuildMemberSearchSchema, GuildModifySchema, GuildPreview, + GuildMemberSearchSchema, GuildModifySchema, GuildPreview, ModifyGuildMemberSchema, }; use crate::types::{GuildBan, Snowflake}; @@ -295,6 +295,36 @@ impl Guild { ); request.handle_request_as_result(user).await } + + /// Modifies attributes of a guild member. Returns the updated guild member object on success. + /// For required Permissions and an API reference, see: + /// + /// # Reference: + /// + pub async fn modify_member( + guild_id: Snowflake, + member_id: Snowflake, + schema: ModifyGuildMemberSchema, + audit_log_reason: Option, + user: &mut ChorusUser, + ) -> ChorusResult<()> { + let request = ChorusRequest::new( + http::Method::PATCH, + format!( + "{}/guilds/{}/members/{}", + user.belongs_to.borrow().urls.api, + guild_id, + member_id, + ) + .as_str(), + Some(to_string(&schema).unwrap()), + audit_log_reason.as_deref(), + None, + Some(user), + LimitType::Guild(guild_id), + ); + request.handle_request_as_result(user).await + } } impl Channel { diff --git a/src/types/schema/guild.rs b/src/types/schema/guild.rs index 34ced20..72fbdb3 100644 --- a/src/types/schema/guild.rs +++ b/src/types/schema/guild.rs @@ -1,3 +1,5 @@ +use bitflags::bitflags; +use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use crate::types::entities::Channel; @@ -106,3 +108,31 @@ impl Default for GuildMemberSearchSchema { } } } + +#[derive(Debug, Serialize, Deserialize)] +pub struct ModifyGuildMemberSchema { + pub nick: Option, + pub roles: Option>, + pub mute: Option, + pub deaf: Option, + pub channel_id: Option, + pub communication_disabled_until: Option>, + pub flags: Option, +} + +bitflags! { + #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, PartialOrd, Ord)] + /// Represents the flags of a Guild Member. + /// + /// # Reference: + /// See + pub struct GuildMemberFlags: u64 { + const DID_REJOIN = 1 << 0; + const COMPLETED_ONBOARDING = 1 << 1; + const BYPASSES_VERIFICATION = 1 << 2; + const STARTED_ONBOARDING = 1 << 3; + const GUEST = 1 << 3; + const AUTOMOD_QUARANTINED_NAME = 1 << 7; + const AUTOMOD_QUARANTINED_BIO = 1 << 8; + } +}