summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Perry <avaglir@gmail.com>2018-04-05 23:20:40 -0400
committerNathan Perry <avaglir@gmail.com>2018-04-05 23:20:40 -0400
commitd209da7a02887f433bfdd44f9b225179bdbb7b75 (patch)
tree13bb0591bb704616364f424a64c7f64104e350f7
parentee1d099c6acdb38a173a7455804724f3a1b78836 (diff)
handle lookup failures
-rw-r--r--src/commands/meme.rs45
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);