diff options
| -rw-r--r-- | src/client/http/mod.rs | 36 | ||||
| -rw-r--r-- | src/client/http/ratelimiting.rs | 1 | ||||
| -rw-r--r-- | src/model/guild.rs | 41 |
3 files changed, 73 insertions, 5 deletions
diff --git a/src/client/http/mod.rs b/src/client/http/mod.rs index ca21c44..66bbb8b 100644 --- a/src/client/http/mod.rs +++ b/src/client/http/mod.rs @@ -73,6 +73,24 @@ pub fn add_group_recipient(group_id: u64, user_id: u64) user_id)) } +/// Adds a single [`Role`] to a [`Member`] in a [`Guild`]. +/// +/// **Note**: Requires the [Manage Roles] permission and respect of role +/// hierarchy. +/// +/// [`Guild`]: ../../model/struct.Guild.html +/// [`Member`]: ../../model/struct.Member.html +/// [`Role`]: ../../model/struct.Role.html +/// [Manage Roles]: ../../model/permissions/constant.MANAGE_ROLES.html +pub fn add_member_role(guild_id: u64, user_id: u64, role_id: u64) -> Result<()> { + verify(204, request!(Route::GuildsIdMembersIdRolesId(guild_id), + put, + "/guilds/{}/members/{}/roles/{}", + guild_id, + user_id, + role_id)) +} + pub fn ban_user(guild_id: u64, user_id: u64, delete_message_days: u8) -> Result<()> { verify(204, request!(Route::GuildsIdBansUserId(guild_id), @@ -1095,6 +1113,24 @@ pub fn remove_ban(guild_id: u64, user_id: u64) -> Result<()> { user_id)) } +/// Removes a single [`Role`] from a [`Member`] in a [`Guild`]. +/// +/// **Note**: Requires the [Manage Roles] permission and respect of role +/// hierarchy. +/// +/// [`Guild`]: ../../model/struct.Guild.html +/// [`Member`]: ../../model/struct.Member.html +/// [`Role`]: ../../model/struct.Role.html +/// [Manage Roles]: ../../model/permissions/constant.MANAGE_ROLES.html +pub fn remove_member_role(guild_id: u64, user_id: u64, role_id: u64) -> Result<()> { + verify(204, request!(Route::GuildsIdMembersIdRolesId(guild_id), + delete, + "/guilds/{}/members/{}/roles/{}", + guild_id, + user_id, + role_id)) +} + pub fn start_guild_prune(guild_id: u64, map: Value) -> Result<GuildPrune> { let body = try!(serde_json::to_string(&map)); diff --git a/src/client/http/ratelimiting.rs b/src/client/http/ratelimiting.rs index f1a1713..00d6813 100644 --- a/src/client/http/ratelimiting.rs +++ b/src/client/http/ratelimiting.rs @@ -84,6 +84,7 @@ pub enum Route { GuildsIdIntegrationsIdSync(u64), GuildsIdInvites(u64), GuildsIdMembersId(u64), + GuildsIdMembersIdRolesId(u64), GuildsIdMembersMeNick(u64), GuildsIdPrune(u64), GuildsIdRegions(u64), diff --git a/src/model/guild.rs b/src/model/guild.rs index a350cae..557a851 100644 --- a/src/model/guild.rs +++ b/src/model/guild.rs @@ -766,8 +766,8 @@ impl LiveGuild { } impl Member { - /// Adds a [`Role`] to the member, editing its roles - /// in-place if the request was successful. + /// Adds a [`Role`] to the member, editing its roles in-place if the request + /// was successful. /// /// **Note**: Requires the [Manage Roles] permission. /// @@ -775,7 +775,22 @@ impl Member { /// [Manage Roles]: permissions/constant.MANAGE_ROLES.html #[cfg(feature = "methods")] pub fn add_role<R: Into<RoleId>>(&mut self, role_id: R) -> Result<()> { - self.add_roles(&[role_id.into()]) + let role_id = role_id.into(); + + if self.roles.contains(&role_id) { + return Ok(()); + } + + let guild_id = try!(self.find_guild()); + + match http::add_member_role(guild_id.0, self.user.id.0, role_id.0) { + Ok(()) => { + self.roles.push(role_id); + + Ok(()) + }, + Err(why) => Err(why), + } } /// Adds one or multiple [`Role`]s to the member, editing @@ -864,7 +879,8 @@ impl Member { .ok_or(Error::Client(ClientError::GuildNotFound)) } - /// Removes a [`Role`] from the member. + /// Removes a [`Role`] from the member, editing its roles in-place if the + /// request was successful. /// /// **Note**: Requires the [Manage Roles] permission. /// @@ -872,7 +888,22 @@ impl Member { /// [Manage Roles]: permissions/constant.MANAGE_ROLES.html #[cfg(feature = "methods")] pub fn remove_role<R: Into<RoleId>>(&mut self, role_id: R) -> Result<()> { - self.remove_roles(&[role_id.into()]) + let role_id = role_id.into(); + + if !self.roles.contains(&role_id) { + return Ok(()); + } + + let guild_id = try!(self.find_guild()); + + match http::remove_member_role(guild_id.0, self.user.id.0, role_id.0) { + Ok(()) => { + self.roles.retain(|r| r.0 != role_id.0); + + Ok(()) + }, + Err(why) => Err(why), + } } /// Removes one or multiple [`Role`]s from the member. |