aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/client/http/mod.rs36
-rw-r--r--src/client/http/ratelimiting.rs1
-rw-r--r--src/model/guild.rs41
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.