aboutsummaryrefslogtreecommitdiff
path: root/src/game.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/game.rs')
-rw-r--r--src/game.rs98
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,