diff options
| author | Nathan Perry <avaglir@gmail.com> | 2018-04-05 23:20:40 -0400 |
|---|---|---|
| committer | Nathan Perry <avaglir@gmail.com> | 2018-04-05 23:20:40 -0400 |
| commit | d209da7a02887f433bfdd44f9b225179bdbb7b75 (patch) | |
| tree | 13bb0591bb704616364f424a64c7f64104e350f7 | |
| parent | ee1d099c6acdb38a173a7455804724f3a1b78836 (diff) | |
handle lookup failures
| -rw-r--r-- | src/commands/meme.rs | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/src/commands/meme.rs b/src/commands/meme.rs index 43362e1..89a979d 100644 --- a/src/commands/meme.rs +++ b/src/commands/meme.rs @@ -7,6 +7,7 @@ use super::*; use super::playback::CtxExt; use ::db::*; +use ::{Error, Result}; #[derive(Clone, Copy, Debug)] enum MemeType { @@ -27,8 +28,6 @@ static mut TTS_WEIGHTS: [Weighted<bool>; 2] = [ ]; command!(meme(ctx, msg, args) { - let ch = msg.channel_id; - if args.len() == 0 { rand_meme(ctx, msg)?; return Ok(()); @@ -39,38 +38,50 @@ fn rand_meme(ctx: &Context, message: &Message) -> Result<()> { let conn = connection()?; let should_audio = ctx.currently_playing() && ctx.users_listening()?; - let dist: WeightedChoice<'static, MemeType> = if should_audio { - WeightedChoice::new(unsafe { &mut MEME_WEIGHTS }) + let weights = if should_audio { + unsafe { &mut MEME_WEIGHTS } } else { - WeightedChoice::new(unsafe { &mut MEME_WEIGHTS[..2] }) + unsafe { &mut MEME_WEIGHTS[..2] } }; - match dist.sample(&mut thread_rng()) { - MemeType::Text => { - let mut text_meme = rand_text(&conn)?; + let dist = WeightedChoice::new(weights); + + let mut mem = match dist.sample(&mut thread_rng()) { + MemeType::Text => rand_text(&conn), + MemeType::Image => rand_image(&conn), + MemeType::Audio => rand_audio(&conn), + }.map_err(Error::from); + + mem = mem + .and_then(|mem| { + let mut mem = mem; let mut ctr = 0; - while !should_audio && text_meme.audio_id.is_some() { - text_meme = rand_text(&conn)?; + while !should_audio && mem.audio_id.is_some() { + mem = rand_text(&conn)?; ctr += 1; if ctr > 10 { - warn!("looped 10 times trying to find a non-audio text meme"); - return Ok(()); + send(message.channel_id, "yer listenin to somethin else", message.tts)?; + return Err("looped too many times trying to find a non-audio meme".into()); } } - send_meme(ctx, &text_meme, &conn, message)?; - }, - MemeType::Image => send_meme(ctx, &rand_image(&conn)?, &conn, message)?, - MemeType::Audio => send_meme(ctx, &rand_audio(&conn)?, &conn, message)?, + Ok(mem) + }); + + if let Err(e) = mem { + send(message.channel_id, "i don't know any :(", message.tts)?; + return Err(e); } - Ok(()) + send_meme(ctx, &mem?, &conn, message).map_err(Error::from) } fn send_meme(ctx: &Context, t: &Meme, conn: &PgConnection, msg: &Message) -> Result<()> { + debug!("sending meme: {:?}", t); + let image = t.image(conn); let audio = t.audio(conn); |
