diff options
| author | Zeyla Hellyer <[email protected]> | 2017-06-13 15:32:36 -0700 |
|---|---|---|
| committer | Zeyla Hellyer <[email protected]> | 2017-06-13 15:32:36 -0700 |
| commit | b4bd7714a155381cc16ece51acb0c4dc6cde96a2 (patch) | |
| tree | e96ed9a01f4a644769cc8460f8020367f66026d8 /src | |
| parent | Only set shard timeout after a READY is received (diff) | |
| download | serenity-b4bd7714a155381cc16ece51acb0c4dc6cde96a2.tar.xz serenity-b4bd7714a155381cc16ece51acb0c4dc6cde96a2.zip | |
Make Member::guild_id non-optional
All codepaths result in Some value, so it doesn't need to be optional.
Diffstat (limited to 'src')
| -rw-r--r-- | src/cache/mod.rs | 2 | ||||
| -rw-r--r-- | src/model/guild/member.rs | 77 | ||||
| -rw-r--r-- | src/model/guild/mod.rs | 9 |
3 files changed, 24 insertions, 64 deletions
diff --git a/src/cache/mod.rs b/src/cache/mod.rs index 90581c1..b286e20 100644 --- a/src/cache/mod.rs +++ b/src/cache/mod.rs @@ -959,7 +959,7 @@ impl Cache { if !found { guild.members.insert(event.user.id, Member { deaf: false, - guild_id: Some(event.guild_id), + guild_id: event.guild_id, joined_at: None, mute: false, nick: event.nick.clone(), diff --git a/src/model/guild/member.rs b/src/model/guild/member.rs index 0082643..69ba59f 100644 --- a/src/model/guild/member.rs +++ b/src/model/guild/member.rs @@ -22,7 +22,7 @@ pub struct Member { /// Indicator of whether the member can hear in voice channels. pub deaf: bool, /// The unique Id of the guild that the member is a part of. - pub guild_id: Option<GuildId>, + pub guild_id: GuildId, /// Timestamp representing the date when the member joined. pub joined_at: Option<DateTime<FixedOffset>>, /// Indicator of whether the member can speak in voice channels. @@ -55,9 +55,7 @@ impl Member { return Ok(()); } - let guild_id = self.find_guild()?; - - match http::add_member_role(guild_id.0, self.user.read().unwrap().id.0, role_id.0) { + match http::add_member_role(self.guild_id.0, self.user.read().unwrap().id.0, role_id.0) { Ok(()) => { self.roles.push(role_id); @@ -76,12 +74,11 @@ impl Member { /// [Manage Roles]: permissions/constant.MANAGE_ROLES.html #[cfg(feature="cache")] pub fn add_roles(&mut self, role_ids: &[RoleId]) -> Result<()> { - let guild_id = self.find_guild()?; self.roles.extend_from_slice(role_ids); let map = EditMember::default().roles(&self.roles).0; - match http::edit_member(guild_id.0, self.user.read().unwrap().id.0, &map) { + match http::edit_member(self.guild_id.0, self.user.read().unwrap().id.0, &map) { Ok(()) => Ok(()), Err(why) => { self.roles.retain(|r| !role_ids.contains(r)); @@ -106,19 +103,14 @@ impl Member { /// [Ban Members]: permissions/constant.BAN_MEMBERS.html #[cfg(feature="cache")] pub fn ban(&self, delete_message_days: u8) -> Result<()> { - http::ban_user(self.find_guild()?.0, self.user.read().unwrap().id.0, delete_message_days) + http::ban_user(self.guild_id.0, self.user.read().unwrap().id.0, delete_message_days) } /// Determines the member's colour. #[cfg(all(feature="cache", feature="utils"))] pub fn colour(&self) -> Option<Colour> { - let guild_id = match self.find_guild() { - Ok(guild_id) => guild_id, - Err(_) => return None, - }; - let cache = CACHE.read().unwrap(); - let guild = match cache.guilds.get(&guild_id) { + let guild = match cache.guilds.get(&self.guild_id) { Some(guild) => guild.read().unwrap(), None => return None, }; @@ -160,45 +152,17 @@ impl Member { /// [`EditMember`]: ../builder/struct.EditMember.html #[cfg(feature="cache")] pub fn edit<F: FnOnce(EditMember) -> EditMember>(&self, f: F) -> Result<()> { - let guild_id = self.find_guild()?; let map = f(EditMember::default()).0; - http::edit_member(guild_id.0, self.user.read().unwrap().id.0, &map) + http::edit_member(self.guild_id.0, self.user.read().unwrap().id.0, &map) } - /// Finds the Id of the [`Guild`] that the member is in. - /// - /// Returns the value of [`Member::guild_id`] if present. Otherwise searches - /// the [`Cache`] for the Id. - /// - /// # Errors + /// Returns the value of [`guild_id`]. /// - /// Returns a [`ModelError::GuildNotFound`] if the guild could not be - /// found. - /// - /// [`Cache`]: ../cache/struct.Cache.html - /// [`ModelError::GuildNotFound`]: enum.ModelError.html#variant.GuildNotFound - /// [`Guild`]: struct.Guild.html - /// [`Member::guild_id`]: struct.Member.html#structfield.guild_id - #[cfg(feature="cache")] + /// [`guild_id`]: #structfield.guild_id + #[deprecated(since="0.2.1", note="Use the `guild_id` structfield instead.")] pub fn find_guild(&self) -> Result<GuildId> { - if let Some(guild_id) = self.guild_id { - return Ok(guild_id); - } - - for guild in CACHE.read().unwrap().guilds.values() { - let guild = guild.read().unwrap(); - - let predicate = guild.members - .values() - .any(|m| m.joined_at == self.joined_at && m.user.read().unwrap().id == self.user.read().unwrap().id); - - if predicate { - return Ok(guild.id); - } - } - - Err(Error::Model(ModelError::GuildNotFound)) + return Ok(self.guild_id); } /// Kick the member from the guild. @@ -235,18 +199,15 @@ impl Member { /// [`ModelError::InvalidPermissions`]: enum.ModelError.html#variant.InvalidPermissions /// [Kick Members]: permissions/constant.KICK_MEMBERS.html pub fn kick(&self) -> Result<()> { - let guild_id; - #[cfg(feature="cache")] { - guild_id = self.find_guild()?; let req = permissions::KICK_MEMBERS; let has_perms = CACHE .read() .unwrap() .guilds - .get(&guild_id) + .get(&self.guild_id) .map(|guild| guild.read().unwrap().has_perms(req)); if let Some(Ok(false)) = has_perms { @@ -254,12 +215,7 @@ impl Member { } } - #[cfg(not(feature="cache"))] - { - guild_id = self.guild_id.ok_or_else(|| Error::Model(ModelError::GuildNotFound))?; - } - - guild_id.kick(self.user.read().unwrap().id) + self.guild_id.kick(self.user.read().unwrap().id) } /// Removes a [`Role`] from the member, editing its roles in-place if the @@ -277,9 +233,7 @@ impl Member { return Ok(()); } - let guild_id = self.find_guild()?; - - match http::remove_member_role(guild_id.0, self.user.read().unwrap().id.0, role_id.0) { + match http::remove_member_role(self.guild_id.0, self.user.read().unwrap().id.0, role_id.0) { Ok(()) => { self.roles.retain(|r| r.0 != role_id.0); @@ -297,12 +251,11 @@ impl Member { /// [Manage Roles]: permissions/constant.MANAGE_ROLES.html #[cfg(feature="cache")] pub fn remove_roles(&mut self, role_ids: &[RoleId]) -> Result<()> { - let guild_id = self.find_guild()?; self.roles.retain(|r| !role_ids.contains(r)); let map = EditMember::default().roles(&self.roles).0; - match http::edit_member(guild_id.0, self.user.read().unwrap().id.0, &map) { + match http::edit_member(self.guild_id.0, self.user.read().unwrap().id.0, &map) { Ok(()) => Ok(()), Err(why) => { self.roles.extend_from_slice(role_ids); @@ -352,7 +305,7 @@ impl Member { /// [Ban Members]: permissions/constant.BAN_MEMBERS.html #[cfg(feature="cache")] pub fn unban(&self) -> Result<()> { - http::remove_ban(self.find_guild()?.0, self.user.read().unwrap().id.0) + http::remove_ban(self.guild_id.0, self.user.read().unwrap().id.0) } } diff --git a/src/model/guild/mod.rs b/src/model/guild/mod.rs index a744b2c..fced129 100644 --- a/src/model/guild/mod.rs +++ b/src/model/guild/mod.rs @@ -1107,13 +1107,20 @@ impl<'de> Deserialize<'de> for Guild { if let Some(guild_id) = id { if let Some(array) = map.get_mut("channels").and_then(|x| x.as_array_mut()) { - for value in array { if let Some(channel) = value.as_object_mut() { channel.insert("guild_id".to_owned(), Value::Number(Number::from(guild_id))); } } } + + if let Some(array) = map.get_mut("members").and_then(|x| x.as_array_mut()) { + for value in array { + if let Some(member) = value.as_object_mut() { + member.insert("guild_id".to_owned(), Value::Number(Number::from(guild_id))); + } + } + } } let afk_channel_id = match map.remove("afk_channel_id") { |