diff options
Diffstat (limited to 'src/game.rs')
| -rw-r--r-- | src/game.rs | 98 |
1 files changed, 59 insertions, 39 deletions
diff --git a/src/game.rs b/src/game.rs index d3b0785..4011a5d 100644 --- a/src/game.rs +++ b/src/game.rs @@ -45,6 +45,7 @@ use serenity::{ }, prelude::*, }; +use tap::Pipe; use url::Url; use crate::{ @@ -88,7 +89,7 @@ lazy_static! { let default_path = PathBuf::from_str("user_id_mapping").unwrap(); let mapping_path = CONFIG.user_id_mapping.as_ref().unwrap_or(&default_path); - fs::read_to_string(mapping_path).unwrap() + fs::read_to_string(mapping_path).unwrap_or("{}".to_owned()) }; static ref USER_INFO_MAP: FnvHashMap<String, ProfileInfo> = { let v: Vec<UserInfo> = serde_json::from_str(&USER_MAP_STR).unwrap(); @@ -146,11 +147,11 @@ impl FromStr for GameStatus { fn from_str(s: &str) -> Result<Self> { use std::char; - if s.starts_with("y") { + if s.starts_with('y') { Ok(GameStatus::Installed) } else if s.starts_with("n/i") { Ok(GameStatus::NotInstalled) - } else if s.starts_with("n") { + } else if s.starts_with('n') { Ok(GameStatus::NotOwned) } else if s.chars().all(char::is_whitespace) { Ok(GameStatus::Unknown) @@ -182,7 +183,7 @@ pub enum UserLookupError { } pub fn get_user_id<S: AsRef<str>>(g: &Guild, s: S) -> StdResult<UserId, UserLookupError> { - let s = s.as_ref().trim_start_matches("@").to_lowercase(); + let s = s.as_ref().trim_start_matches('@').to_lowercase(); if let Some(info) = USER_INFO_MAP.get(&s) { return Ok(UserId::new(info.discord_user_id)); @@ -210,7 +211,7 @@ pub fn get_user_id<S: AsRef<str>>(g: &Guild, s: S) -> StdResult<UserId, UserLook let opts = nicks .into_iter() - .chain(usernames.into_iter()) + .chain(usernames) .map(|(member, _)| member.user.id) .collect::<FnvHashSet<_>>(); @@ -236,7 +237,6 @@ async fn _game( let users = { let guild = msg.channel_id.to_channel(&ctx).await?.guild().ok_or(anyhow!("couldn't find guild"))?; - let guild = guild.guild(&ctx).ok_or_else(|| anyhow!("couldn't find guild"))?; let user_args: Vec<String> = if args.rest().is_empty() { Vec::new() @@ -244,49 +244,69 @@ async fn _game( args.quoted().iter::<String>().collect::<StdResult<Vec<_>, ArgError<Infallible>>>()? }; + use serenity::futures::StreamExt; + let mut users = user_args .into_iter() + .pipe(serenity::futures::stream::iter) .filter_map(|u| { - use std::borrow::Borrow; + let guild = &guild; + async move { + use std::borrow::Borrow; - let possible = get_user_id(guild.borrow(), &u); + let possible = { + let Ok(guild) = + guild.guild(&ctx).ok_or_else(|| anyhow!("couldn't find guild")) + else { + error!("failed retrieving guild"); + return None; + }; - debug!("parsed userid {:?}", possible); + get_user_id(guild.borrow(), &u) + }; - match possible { - Err(UserLookupError::NotFound) => { - let _ = util::send( - ctx, - msg.channel_id, - &format!("didn't recognize {}", &u), - msg.tts, - ); - None - }, - Ok(x) => Some(x), - Err(UserLookupError::Ambiguous(x)) => { - let _ = util::send( - ctx, - msg.channel_id, - &format!("too many matches ({}) for {}", x, &u), - msg.tts, - ); - None - }, + debug!("parsed userid {:?}", possible); + + match possible { + Err(UserLookupError::NotFound) => { + let _ = util::send( + ctx, + msg.channel_id, + &format!("didn't recognize {}", &u), + msg.tts, + ) + .await; + None + }, + Ok(x) => Some(x), + Err(UserLookupError::Ambiguous(x)) => { + let _ = util::send( + ctx, + msg.channel_id, + &format!("too many matches ({}) for {}", x, &u), + msg.tts, + ) + .await; + None + }, + } } }) - .filter_map(|uid| { + .filter_map(|uid| async move { let res = DISCORD_MAP.get(&uid).map(|s| s.to_lowercase()); - if let None = res { - let _ = info!("user {} is not recognized", uid); + if res.is_none() { + info!("user {} is not recognized", uid); } res }) - .collect::<FnvHashSet<_>>(); + .collect::<FnvHashSet<_>>() + .await; + + if users.is_empty() { + let guild = guild.guild(&ctx).ok_or_else(|| anyhow!("couldn't find guild"))?; - if users.len() == 0 { let pairs = guild .voice_states .iter() @@ -311,9 +331,9 @@ async fn _game( users }; - let inferred = users.len() == 0; + let inferred = users.is_empty(); - if inferred && users.len() < 2 || !inferred && users.len() < 1 { + if inferred && users.len() < 2 || !inferred && users.is_empty() { info!("too few known users to make game comparison"); util::send(ctx, msg.channel_id, "yer too lonely", msg.tts).await?; return Ok(()); @@ -375,7 +395,7 @@ async fn _game( .collect::<Vec<_>>(); let mut games_in_common = { - let game_map = user_games.values().nth(0).unwrap(); + let game_map = user_games.values().next().unwrap(); statuses.iter().fold(iter::empty().collect::<FnvHashSet<_>>(), |acc, s| { acc.union(&game_map[s]).cloned().collect() @@ -444,7 +464,7 @@ pub async fn updategaem(ctx: &Context, msg: &Message, mut args: Args) -> Command let arg_user = args.single_quoted::<String>(); let user = if arg_user.is_err() { - msg.author.id.clone() + msg.author.id } else { use std::borrow::Borrow; @@ -566,7 +586,7 @@ pub async fn updategaem(ctx: &Context, msg: &Message, mut args: Args) -> Command }) .join("\n"); - if found_games.len() > 0 { + if !found_games.is_empty() { util::send( ctx, msg.channel_id, |
