aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Perry <avaglir@gmail.com>2019-03-10 03:04:06 -0400
committerNathan Perry <avaglir@gmail.com>2019-03-10 03:04:06 -0400
commit006c5e12bb2ad35512c0f510a8fd915ba813d42c (patch)
tree22d5d6c80c97848291a7ced23a3854b6b9398be4
parentc39a52e635e0f66c34e8ec013c76b4ffa0935fdc (diff)
improve user id parsing
-rw-r--r--src/game.rs38
1 files changed, 34 insertions, 4 deletions
diff --git a/src/game.rs b/src/game.rs
index e98683f..442c937 100644
--- a/src/game.rs
+++ b/src/game.rs
@@ -162,11 +162,37 @@ enum UserLookupError {
}
fn get_user_id<S: AsRef<str>>(g: &Guild, s: S) -> StdResult<UserId, UserLookupError> {
- let s = s.as_ref().trim_start_matches("@").to_owned();
- let mut possible = g.members_nick_containing(&s, false, false);
- possible.extend(g.members_username_containing(&s, false, false));
+ let s = s.as_ref().trim_start_matches("@").to_lowercase();
- let opts = possible.into_iter()
+ if let Some(info) = USER_INFO_MAP.get(&s) {
+ return Ok(UserId(info.discord_user_id));
+ }
+
+ let nicks = g.members_nick_containing(&s, false, false);
+
+ {
+ let exact_match = nicks
+ .iter()
+ .find(|m| m.user.read().name.to_lowercase() == s);
+
+ if let Some(m) = exact_match {
+ return Ok(m.user_id());
+ }
+ }
+
+ let usernames = g.members_username_containing(&s, false, false);
+
+ {
+ let exact_match = usernames
+ .iter()
+ .find(|m| m.user.read().name.to_lowercase() == s);
+
+ if let Some(m) = exact_match {
+ return Ok(m.user_id());
+ }
+ }
+
+ let opts = nicks.into_iter().chain(usernames.into_iter())
.map(|member| member.user_id())
.collect::<FnvHashSet<_>>();
@@ -207,6 +233,8 @@ fn game(_ctx: &mut Context, msg: &Message, args: Args, min_status: GameStatus) -
let possible = get_user_id(guild.borrow(), &u);
+ debug!("parsed userid {:?}", possible);
+
match possible {
Err(UserLookupError::NotFound) => {
let _ = send(msg.channel_id, &format!("didn't recognize {}", &u), msg.tts);
@@ -404,6 +432,8 @@ fn updategaem(_ctx: &mut Context, msg: &Message, mut args: Args) -> Result<()> {
get_user_id(guild.borrow(), arg_user.unwrap()).map_err(Error::from)?
};
+ debug!("parsed userid {:?}", user);
+
let username = match DISCORD_MAP.get(&user) {
Some(s) => s,
None => return send(msg.channel_id, "WHO THE FUCK ARE YE", msg.tts),