diff options
| author | Nathan Perry <avaglir@gmail.com> | 2018-04-07 07:26:54 -0400 |
|---|---|---|
| committer | Nathan Perry <avaglir@gmail.com> | 2018-04-07 07:26:54 -0400 |
| commit | 45f92ee5394ee6edb10e0c9b0c668441d6df1928 (patch) | |
| tree | 286bd80c0acb6e84fe93eae90766896912eb4c2e | |
| parent | fdf65962b9610ab0a7b8e91dc1a2d4973f44c169 (diff) | |
fix/simplify rng
| -rw-r--r-- | src/commands/meme.rs | 59 | ||||
| -rw-r--r-- | src/db/mod.rs | 4 |
2 files changed, 19 insertions, 44 deletions
diff --git a/src/commands/meme.rs b/src/commands/meme.rs index b0f460f..f6f9abe 100644 --- a/src/commands/meme.rs +++ b/src/commands/meme.rs @@ -1,6 +1,6 @@ use std::time::Duration; -use rand::{thread_rng, distributions::{Weighted, WeightedChoice, Distribution}}; +use rand::{thread_rng, Rng}; use serenity::http::AttachmentType; use serenity::builder::CreateMessage; use serenity::framework::standard::Args; @@ -26,24 +26,6 @@ use super::playback::CtxExt; use ::db::*; use ::{Error, Result}; -#[derive(Clone, Copy, Debug)] -enum MemeType { - Text, - Image, - Audio, -} - -static mut MEME_WEIGHTS: [Weighted<MemeType>; 3] = [ - Weighted { weight: 1, item: MemeType::Text }, - Weighted { weight: 1, item: MemeType::Image }, - Weighted { weight: 1, item: MemeType::Audio }, -]; - -static mut TTS_WEIGHTS: [Weighted<bool>; 2] = [ - Weighted { weight: 4, item: false }, - Weighted { weight: 1, item: true } -]; - pub fn meme(ctx: &mut Context, msg: &Message, mut args: Args) -> Result<()> { if args.len_quoted() == 0 { return rand_meme(ctx, msg); @@ -199,24 +181,16 @@ fn rand_meme(ctx: &Context, message: &Message) -> Result<()> { let conn = connection()?; let should_audio = ctx.currently_playing() && ctx.users_listening()?; - let weights = if should_audio { - unsafe { &mut MEME_WEIGHTS } - } else { - unsafe { &mut MEME_WEIGHTS[..2] } - }; - - 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 modulus = if should_audio { 3 } else { 2 }; + let mut mem = match thread_rng().gen::<u32>() % modulus { + 0 => rand_text(&conn), + 1 => rand_image(&conn), + 2 => rand_audio(&conn), + _ => unreachable!(), + } + .or_else(|_| rand_text(&conn)) + .and_then(|mut mem| { let mut ctr = 0; while !should_audio && mem.audio_id.is_some() { mem = rand_text(&conn)?; @@ -231,9 +205,12 @@ fn rand_meme(ctx: &Context, message: &Message) -> Result<()> { Ok(mem) }); - if let Err(e) = mem { - send(message.channel_id, "i don't know any :(", message.tts)?; - return Err(e); + match mem { + Err(e) => { + send(message.channel_id, "i don't know any :(", message.tts)?; + return Err(e); + }, + _ => {}, } send_meme(ctx, &mem?, &conn, message).map_err(Error::from) @@ -246,11 +223,9 @@ fn send_meme(ctx: &Context, t: &Meme, conn: &PgConnection, msg: &Message) -> Res let image = t.image(conn); let audio = t.audio(conn); - let dist = WeightedChoice::new(unsafe { &mut TTS_WEIGHTS }); - let create_msg = |m: CreateMessage| { let ret = m - .tts(dist.sample(&mut thread_rng())); + .tts(thread_rng().gen::<u32>() % 25 == 0); match t.content { Some(ref text) => ret.content(text), diff --git a/src/db/mod.rs b/src/db/mod.rs index ac0e321..9dff1ca 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -22,7 +22,7 @@ pub fn connection() -> Result<PgConnection> { pub fn find_meme<T: AsRef<str>>(conn: &PgConnection, search: T) -> Result<Meme> {
use diesel::dsl::sql;
- use diesel::types::Text;
+ use diesel::sql_types::Text;
let search = search.as_ref();
let format_search = format!("%{}%", search);
@@ -37,7 +37,7 @@ pub fn find_meme<T: AsRef<str>>(conn: &PgConnection, search: T) -> Result<Meme> pub fn find_text<T: AsRef<str>>(conn: &PgConnection, search: T) -> Result<Meme> {
use diesel::dsl::sql;
- use diesel::types::Text;
+ use diesel::sql_types::Text;
let search = search.as_ref();
let format_search = format!("%{}%", search);
|
