aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLakelezz <[email protected]>2017-10-07 23:26:44 +0200
committerZeyla Hellyer <[email protected]>2017-10-09 15:48:18 -0700
commitf26dad86aea82070aab9cc081f50d0144ee4c778 (patch)
treeb5c8d96b718cf062a1228707cb3217f6632acde1 /src
parentAdd the lifetime again (diff)
downloadserenity-f26dad86aea82070aab9cc081f50d0144ee4c778.tar.xz
serenity-f26dad86aea82070aab9cc081f50d0144ee4c778.zip
Find `Member` via substrings, allow case-insensitivity on `members_containing` and `members_starting_with` (#184)
Diffstat (limited to 'src')
-rw-r--r--src/model/guild/mod.rs58
1 files changed, 54 insertions, 4 deletions
diff --git a/src/model/guild/mod.rs b/src/model/guild/mod.rs
index 918fb41..73dfa73 100644
--- a/src/model/guild/mod.rs
+++ b/src/model/guild/mod.rs
@@ -742,18 +742,58 @@ impl Guild {
///
/// If the prefix is "zey", following results are possible:
/// - "zey", "zeyla", "zey mei"
- /// But the following are not because case-sensitivity:
+ /// 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) -> Vec<&Member> {
+ pub fn members_starting_with(&self, prefix: &str, case_sensitive: bool) -> Vec<&Member> {
self.members
.values()
.filter(|member|
- member.user.read().unwrap().name.starts_with(prefix)
+
+ if case_sensitive {
+ member.user.read().unwrap().name.starts_with(prefix)
+ } else {
+ starts_with_case_insensitive(&member.user.read().unwrap().name, &prefix)
+ }
+
+ || member.nick.as_ref()
+ .map_or(false, |nick|
+
+ if case_sensitive {
+ nick.starts_with(prefix)
+ } else {
+ starts_with_case_insensitive(&nick, &prefix)
+ })).collect()
+ }
+
+ /// Retrieves all [`Member`] containing a given `String`.
+ ///
+ /// If the substring is "yla", following results are possible:
+ /// - "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
+ .values()
+ .filter(|member|
+
+ if case_sensitive {
+ member.user.read().unwrap().name.contains(substring)
+ } else {
+ contains_case_insensitive(&member.user.read().unwrap().name, &substring)
+ }
+
|| member.nick.as_ref()
.map_or(false, |nick|
- nick.starts_with(prefix))).collect()
+
+ if case_sensitive {
+ nick.starts_with(substring)
+ } else {
+ contains_case_insensitive(&nick, &substring)
+ })).collect()
}
/// Moves a member to a specific voice channel.
@@ -1220,6 +1260,16 @@ impl<'de> Deserialize<'de> for Guild {
}
}
+/// Checks if a `&str` contains another `&str`.
+fn contains_case_insensitive(to_look_at: &str, to_find: &str) -> bool {
+ to_look_at.to_lowercase().contains(to_find)
+}
+
+/// Checks if a `&str` starts with another `&str`.
+fn starts_with_case_insensitive(to_look_at: &str, to_find: &str) -> bool {
+ to_look_at.to_lowercase().starts_with(to_find)
+}
+
/// Information relating to a guild's widget embed.
#[derive(Clone, Copy, Debug, Deserialize)]
pub struct GuildEmbed {