aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortahahawa <[email protected]>2017-12-24 10:39:11 -0500
committerZeyla Hellyer <[email protected]>2017-12-24 07:39:11 -0800
commita7b67df6d77f5acacf83710807b231866397d551 (patch)
tree4862489c26775ec9fe791bdf8bb2318458c22ac3
parentAdd `iter_quoted` (diff)
downloadserenity-a7b67df6d77f5acacf83710807b231866397d551.tar.xz
serenity-a7b67df6d77f5acacf83710807b231866397d551.zip
Fix Guild::member_named and add tests
Use rfind, in case there's more '#' in username than just the discriminator Split at pos+1 instead of pos and remove the trailing '#' in the split.0 (Name) Fix bug with parsing
-rw-r--r--src/model/guild/mod.rs23
-rw-r--r--tests/test_guild.rs103
2 files changed, 118 insertions, 8 deletions
diff --git a/src/model/guild/mod.rs b/src/model/guild/mod.rs
index c4c40b7..44a911c 100644
--- a/src/model/guild/mod.rs
+++ b/src/model/guild/mod.rs
@@ -737,15 +737,22 @@ impl Guild {
///
/// - **username**: "zey"
/// - **username and discriminator**: "zey#5479"
- /// - **nickname**: "zeyla" or "zeylas#nick"
///
/// [`Member`]: struct.Member.html
pub fn member_named(&self, name: &str) -> Option<&Member> {
- let (name, discrim) = if let Some(pos) = name.find('#') {
- let split = name.split_at(pos);
+ let (name, discrim) = if let Some(pos) = name.rfind('#') {
+ let split = name.split_at(pos + 1);
- match split.1.parse::<u16>() {
- Ok(discrim_int) => (split.0, Some(discrim_int)),
+ let split2 = (
+ match split.0.get(0..split.0.len() - 1) {
+ Some(s) => s,
+ None => "",
+ },
+ split.1,
+ );
+
+ match split2.1.parse::<u16>() {
+ Ok(discrim_int) => (split2.0, Some(discrim_int)),
Err(_) => (name, None),
}
} else {
@@ -764,9 +771,9 @@ impl Guild {
name_matches && discrim_matches
})
.or_else(|| {
- self.members.values().find(|member| {
- member.nick.as_ref().map_or(false, |nick| nick == name)
- })
+ self.members
+ .values()
+ .find(|member| member.nick.as_ref().map_or(false, |nick| nick == name))
})
}
diff --git a/tests/test_guild.rs b/tests/test_guild.rs
new file mode 100644
index 0000000..1045381
--- /dev/null
+++ b/tests/test_guild.rs
@@ -0,0 +1,103 @@
+#![cfg(feature = "model")]
+
+extern crate chrono;
+extern crate serenity;
+
+use chrono::prelude::*;
+use serenity::model::prelude::*;
+use serenity::prelude::*;
+use std::collections::*;
+use std::sync::Arc;
+
+fn gen_user() -> User {
+ User {
+ id: UserId(210),
+ avatar: Some("abc".to_string()),
+ bot: true,
+ discriminator: 1432,
+ name: "test".to_string(),
+ }
+}
+
+fn gen_member() -> Member {
+ let dt: DateTime<FixedOffset> = FixedOffset::east(5 * 3600)
+ .ymd(2016, 11, 08)
+ .and_hms(0, 0, 0);
+ let vec1 = Vec::new();
+ let u = Arc::new(RwLock::new(gen_user()));
+
+ Member {
+ deaf: false,
+ guild_id: GuildId(1),
+ joined_at: Some(dt),
+ mute: false,
+ nick: Some("aaaa".to_string()),
+ roles: vec1,
+ user: u,
+ }
+}
+
+fn gen() -> Guild {
+ let u = gen_user();
+ let m = gen_member();
+
+ let hm1 = HashMap::new();
+ let hm2 = HashMap::new();
+ let vec1 = Vec::new();
+ let dt: DateTime<FixedOffset> = FixedOffset::east(5 * 3600)
+ .ymd(2016, 11, 08)
+ .and_hms(0, 0, 0);
+ let mut hm3 = HashMap::new();
+ let hm4 = HashMap::new();
+ let hm5 = HashMap::new();
+ let hm6 = HashMap::new();
+
+ hm3.insert(u.id, m);
+
+ Guild {
+ afk_channel_id: Some(ChannelId(0)),
+ afk_timeout: 0,
+ channels: hm1,
+ default_message_notifications: DefaultMessageNotificationLevel::All,
+ emojis: hm2,
+ features: vec1,
+ icon: Some("/avatars/210/a_aaa.webp?size=1024".to_string()),
+ id: GuildId(1),
+ joined_at: dt,
+ large: false,
+ member_count: 1,
+ members: hm3,
+ mfa_level: MfaLevel::Elevated,
+ name: "Spaghetti".to_string(),
+ owner_id: UserId(210),
+ presences: hm4,
+ region: "NA".to_string(),
+ roles: hm5,
+ splash: Some("asdf".to_string()),
+ verification_level: VerificationLevel::None,
+ voice_states: hm6,
+ application_id: Some(ApplicationId(0)),
+ explicit_content_filter: ExplicitContentFilter::None,
+ system_channel_id: Some(ChannelId(0)),
+ }
+}
+
+
+#[test]
+fn member_named_username() {
+ let guild = gen();
+ let lhs = guild
+ .member_named("test#1432")
+ .unwrap()
+ .display_name();
+
+ assert_eq!(lhs, gen_member().display_name());
+}
+
+#[test]
+fn member_named_nickname() {
+ let guild = gen();
+ let lhs = guild.member_named("aaaa").unwrap().display_name();
+
+ assert_eq!(lhs, gen_member().display_name());
+}