diff options
| author | Zeyla Hellyer <[email protected]> | 2017-10-10 20:08:11 -0700 |
|---|---|---|
| committer | Zeyla Hellyer <[email protected]> | 2017-10-10 20:08:11 -0700 |
| commit | 93e0a4215c915b98cf433ac6d0bcfbc60f0168ec (patch) | |
| tree | 727111506d1f89cd8a511b8b79c102131222421f /src/model/guild | |
| parent | Resume on resumable session invalidations (diff) | |
| download | serenity-93e0a4215c915b98cf433ac6d0bcfbc60f0168ec.tar.xz serenity-93e0a4215c915b98cf433ac6d0bcfbc60f0168ec.zip | |
Switch to parking_lot::{Mutex, RwLock}
Switch to the `parking_lot` crate's implementations of
`std::sync::Mutex` and `std::sync::RwLock`, which are more efficient.
A writeup on why `parking_lot` is more efficient can be read here:
<https://github.com/Amanieu/parking_lot>
Upgrade path:
Modify `mutex.lock().unwrap()` usage to `mutex.lock()` (not needing to
unwrap or handle a result), and
`rwlock.read().unwrap()`/`rwlock.write().unwrap()` usage to
`rwlock.read()` and `rwlock.write()`.
For example, modify:
```rust
use serenity::CACHE;
println!("{}", CACHE.read().unwrap().user.id);
```
to:
```rust
use serenity::CACHE;
println!("{}", CACHE.read().user.id);
```
Diffstat (limited to 'src/model/guild')
| -rw-r--r-- | src/model/guild/emoji.rs | 4 | ||||
| -rw-r--r-- | src/model/guild/guild_id.rs | 4 | ||||
| -rw-r--r-- | src/model/guild/member.rs | 47 | ||||
| -rw-r--r-- | src/model/guild/mod.rs | 34 | ||||
| -rw-r--r-- | src/model/guild/role.rs | 8 |
5 files changed, 47 insertions, 50 deletions
diff --git a/src/model/guild/emoji.rs b/src/model/guild/emoji.rs index 4a2190f..7f332ae 100644 --- a/src/model/guild/emoji.rs +++ b/src/model/guild/emoji.rs @@ -151,8 +151,8 @@ impl Emoji { /// ``` #[cfg(feature = "cache")] pub fn find_guild_id(&self) -> Option<GuildId> { - for guild in CACHE.read().unwrap().guilds.values() { - let guild = guild.read().unwrap(); + for guild in CACHE.read().guilds.values() { + let guild = guild.read(); if guild.emojis.contains_key(&self.id) { return Some(guild.id); diff --git a/src/model/guild/guild_id.rs b/src/model/guild/guild_id.rs index 4b9a713..efda6a8 100644 --- a/src/model/guild/guild_id.rs +++ b/src/model/guild/guild_id.rs @@ -305,7 +305,7 @@ impl GuildId { /// Search the cache for the guild. #[cfg(feature = "cache")] - pub fn find(&self) -> Option<Arc<RwLock<Guild>>> { CACHE.read().unwrap().guild(*self) } + pub fn find(&self) -> Option<Arc<RwLock<Guild>>> { CACHE.read().guild(*self) } /// Requests the guild over REST. /// @@ -408,7 +408,7 @@ impl GuildId { /// [`utils::shard_id`]: ../utils/fn.shard_id.html #[cfg(all(feature = "cache", feature = "utils"))] #[inline] - pub fn shard_id(&self) -> u64 { ::utils::shard_id(self.0, CACHE.read().unwrap().shard_count) } + pub fn shard_id(&self) -> u64 { ::utils::shard_id(self.0, CACHE.read().shard_count) } /// Returns the Id of the shard associated with the guild. /// diff --git a/src/model/guild/member.rs b/src/model/guild/member.rs index 694de20..bca3ecb 100644 --- a/src/model/guild/member.rs +++ b/src/model/guild/member.rs @@ -88,7 +88,7 @@ impl Member { return Ok(()); } - match http::add_member_role(self.guild_id.0, self.user.read().unwrap().id.0, role_id.0) { + match http::add_member_role(self.guild_id.0, self.user.read().id.0, role_id.0) { Ok(()) => { self.roles.push(role_id); @@ -111,7 +111,7 @@ impl Member { let map = EditMember::default().roles(&self.roles).0; - match http::edit_member(self.guild_id.0, self.user.read().unwrap().id.0, &map) { + match http::edit_member(self.guild_id.0, self.user.read().id.0, &map) { Ok(()) => Ok(()), Err(why) => { self.roles.retain(|r| !role_ids.contains(r)); @@ -149,7 +149,7 @@ impl Member { http::ban_user( self.guild_id.0, - self.user.read().unwrap().id.0, + self.user.read().id.0, dmd, &*reason, ) @@ -158,9 +158,9 @@ impl Member { /// Determines the member's colour. #[cfg(all(feature = "cache", feature = "utils"))] pub fn colour(&self) -> Option<Colour> { - let cache = CACHE.read().unwrap(); + let cache = CACHE.read(); let guild = match cache.guilds.get(&self.guild_id) { - Some(guild) => guild.read().unwrap(), + Some(guild) => guild.read(), None => return None, }; @@ -187,10 +187,10 @@ impl Member { None => return None, }; - let reader = guild.read().unwrap(); + let reader = guild.read(); for (cid, channel) in &reader.channels { - if reader.permissions_for(*cid, self.user.read().unwrap().id).read_messages() { + if reader.permissions_for(*cid, self.user.read().id).read_messages() { return Some(channel.clone()); } } @@ -206,7 +206,7 @@ impl Member { self.nick .as_ref() .map(Cow::Borrowed) - .unwrap_or_else(|| Cow::Owned(self.user.read().unwrap().name.clone())) + .unwrap_or_else(|| Cow::Owned(self.user.read().name.clone())) } /// Returns the DiscordTag of a Member, taking possible nickname into account. @@ -215,7 +215,7 @@ impl Member { format!( "{}#{}", self.display_name(), - self.user.read().unwrap().discriminator + self.user.read().discriminator ) } @@ -231,7 +231,7 @@ impl Member { pub fn edit<F: FnOnce(EditMember) -> EditMember>(&self, f: F) -> Result<()> { let map = f(EditMember::default()).0; - http::edit_member(self.guild_id.0, self.user.read().unwrap().id.0, &map) + http::edit_member(self.guild_id.0, self.user.read().id.0, &map) } /// Kick the member from the guild. @@ -274,17 +274,16 @@ impl Member { let has_perms = CACHE .read() - .unwrap() .guilds .get(&self.guild_id) - .map(|guild| guild.read().unwrap().has_perms(req)); + .map(|guild| guild.read().has_perms(req)); if let Some(Ok(false)) = has_perms { return Err(Error::Model(ModelError::InvalidPermissions(req))); } } - self.guild_id.kick(self.user.read().unwrap().id) + self.guild_id.kick(self.user.read().id) } /// Returns the permissions for the member. @@ -314,18 +313,18 @@ impl Member { None => return Err(From::from(ModelError::GuildNotFound)), }; - let guild = guild.read().unwrap(); + let guild = guild.read(); - let default_channel = match guild.default_channel(self.user.read().unwrap().id) { + let default_channel = match guild.default_channel(self.user.read().id) { Some(dc) => dc, None => return Err(From::from(ModelError::ItemMissing)), }; - let default_channel_reader = default_channel.read().unwrap(); + let default_channel_reader = default_channel.read(); Ok( guild - .permissions_for(default_channel_reader.id, self.user.read().unwrap().id), + .permissions_for(default_channel_reader.id, self.user.read().id), ) } @@ -344,7 +343,7 @@ impl Member { return Ok(()); } - match http::remove_member_role(self.guild_id.0, self.user.read().unwrap().id.0, role_id.0) { + match http::remove_member_role(self.guild_id.0, self.user.read().id.0, role_id.0) { Ok(()) => { self.roles.retain(|r| r.0 != role_id.0); @@ -366,7 +365,7 @@ impl Member { let map = EditMember::default().roles(&self.roles).0; - match http::edit_member(self.guild_id.0, self.user.read().unwrap().id.0, &map) { + match http::edit_member(self.guild_id.0, self.user.read().id.0, &map) { Ok(()) => Ok(()), Err(why) => { self.roles.extend_from_slice(role_ids); @@ -385,19 +384,17 @@ impl Member { pub fn roles(&self) -> Option<Vec<Role>> { CACHE .read() - .unwrap() .guilds .values() .find(|guild| { - guild.read().unwrap().members.values().any(|m| { - m.user.read().unwrap().id == self.user.read().unwrap().id && + guild.read().members.values().any(|m| { + m.user.read().id == self.user.read().id && m.joined_at == self.joined_at }) }) .map(|guild| { guild .read() - .unwrap() .roles .values() .filter(|role| self.roles.contains(&role.id)) @@ -420,7 +417,7 @@ impl Member { /// [Ban Members]: permissions/constant.BAN_MEMBERS.html #[cfg(feature = "cache")] pub fn unban(&self) -> Result<()> { - http::remove_ban(self.guild_id.0, self.user.read().unwrap().id.0) + http::remove_ban(self.guild_id.0, self.user.read().id.0) } } @@ -436,6 +433,6 @@ impl Display for Member { /// // This is in the format of `<@USER_ID>`. fn fmt(&self, f: &mut Formatter) -> FmtResult { - Display::fmt(&self.user.read().unwrap().mention(), f) + Display::fmt(&self.user.read().mention(), f) } } diff --git a/src/model/guild/mod.rs b/src/model/guild/mod.rs index 73dfa73..ea6cb17 100644 --- a/src/model/guild/mod.rs +++ b/src/model/guild/mod.rs @@ -155,17 +155,17 @@ impl Guild { #[cfg(feature = "cache")] fn has_perms(&self, mut permissions: Permissions) -> Result<bool> { - let member = match self.members.get(&CACHE.read().unwrap().user.id) { + let member = match self.members.get(&CACHE.read().user.id) { Some(member) => member, None => return Err(Error::Model(ModelError::ItemMissing)), }; - let default_channel = match self.default_channel(member.user.read().unwrap().id) { + let default_channel = match self.default_channel(member.user.read().id) { Some(dc) => dc, None => return Err(Error::Model(ModelError::ItemMissing)), }; - let perms = self.permissions_for(default_channel.read().unwrap().id, member.user.read().unwrap().id); + let perms = self.permissions_for(default_channel.read().id, member.user.read().id); permissions.remove(perms); Ok(permissions.is_empty()) @@ -406,7 +406,7 @@ impl Guild { pub fn delete(&self) -> Result<PartialGuild> { #[cfg(feature = "cache")] { - if self.owner_id != CACHE.read().unwrap().user.id { + if self.owner_id != CACHE.read().user.id { let req = Permissions::MANAGE_GUILD; return Err(Error::Model(ModelError::InvalidPermissions(req))); @@ -723,9 +723,9 @@ impl Guild { self.members .values() .find(|member| { - let name_matches = member.user.read().unwrap().name == name; + let name_matches = member.user.read().name == name; let discrim_matches = match discrim { - Some(discrim) => member.user.read().unwrap().discriminator == discrim, + Some(discrim) => member.user.read().discriminator == discrim, None => true, }; @@ -744,7 +744,7 @@ impl Guild { /// - "zey", "zeyla", "zey mei" /// If 'case_sensitive' is false, the following are not found: /// - "Zey", "ZEYla", "zeY mei" - /// + /// /// [`Member`]: struct.Member.html pub fn members_starting_with(&self, prefix: &str, case_sensitive: bool) -> Vec<&Member> { self.members @@ -752,11 +752,11 @@ impl Guild { .filter(|member| if case_sensitive { - member.user.read().unwrap().name.starts_with(prefix) + member.user.read().name.starts_with(prefix) } else { - starts_with_case_insensitive(&member.user.read().unwrap().name, &prefix) + starts_with_case_insensitive(&member.user.read().name, &prefix) } - + || member.nick.as_ref() .map_or(false, |nick| @@ -773,7 +773,7 @@ impl Guild { /// - "zeyla", "meiyla", "yladenisyla" /// If 'case_sensitive' is false, the following are not found: /// - "zeYLa", "meiyLa", "LYAdenislyA" - /// + /// /// [`Member`]: struct.Member.html pub fn members_containing(&self, substring: &str, case_sensitive: bool) -> Vec<&Member> { self.members @@ -781,11 +781,11 @@ impl Guild { .filter(|member| if case_sensitive { - member.user.read().unwrap().name.contains(substring) + member.user.read().name.contains(substring) } else { - contains_case_insensitive(&member.user.read().unwrap().name, &substring) + contains_case_insensitive(&member.user.read().name, &substring) } - + || member.nick.as_ref() .map_or(false, |nick| @@ -849,7 +849,7 @@ impl Guild { } else { warn!( "(╯°□°)╯︵ ┻━┻ {} on {} has non-existent role {:?}", - member.user.read().unwrap().id, + member.user.read().id, self.id, role ); @@ -862,7 +862,7 @@ impl Guild { } if let Some(channel) = self.channels.get(&channel_id) { - let channel = channel.read().unwrap(); + let channel = channel.read(); // If this is a text channel, then throw out voice permissions. if channel.kind == ChannelType::Text { @@ -1102,7 +1102,7 @@ impl Guild { /// impl EventHandler for Handler { /// fn on_message(&self, _: Context, msg: Message) { /// if let Some(arc) = msg.guild_id().unwrap().find() { - /// if let Some(role) = arc.read().unwrap().role_by_name("role_name") { + /// if let Some(role) = arc.read().role_by_name("role_name") { /// println!("{:?}", role); /// } /// } diff --git a/src/model/guild/role.rs b/src/model/guild/role.rs index 7ac7019..3ed718e 100644 --- a/src/model/guild/role.rs +++ b/src/model/guild/role.rs @@ -106,8 +106,8 @@ impl Role { /// [`ModelError::GuildNotFound`]: enum.ModelError.html#variant.GuildNotFound #[cfg(feature = "cache")] pub fn find_guild(&self) -> Result<GuildId> { - for guild in CACHE.read().unwrap().guilds.values() { - let guild = guild.read().unwrap(); + for guild in CACHE.read().guilds.values() { + let guild = guild.read(); if guild.roles.contains_key(&RoleId(self.id.0)) { return Ok(guild.id); @@ -168,10 +168,10 @@ impl RoleId { /// Search the cache for the role. #[cfg(feature = "cache")] pub fn find(&self) -> Option<Role> { - let cache = CACHE.read().unwrap(); + let cache = CACHE.read(); for guild in cache.guilds.values() { - let guild = guild.read().unwrap(); + let guild = guild.read(); if !guild.roles.contains_key(self) { continue; |