Skip to content

Commit

Permalink
Fix Guild::member_named and add tests
Browse files Browse the repository at this point in the history
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
  • Loading branch information
tahahawa authored and Zeyla Hellyer committed Dec 24, 2017
1 parent 032c5a7 commit a7b67df
Show file tree
Hide file tree
Showing 2 changed files with 118 additions and 8 deletions.
23 changes: 15 additions & 8 deletions src/model/guild/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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))
})
}

Expand Down
103 changes: 103 additions & 0 deletions tests/test_guild.rs
Original file line number Diff line number Diff line change
@@ -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());
}

0 comments on commit a7b67df

Please sign in to comment.