summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Perry <avaglir@gmail.com>2018-04-07 07:26:54 -0400
committerNathan Perry <avaglir@gmail.com>2018-04-07 07:26:54 -0400
commit45f92ee5394ee6edb10e0c9b0c668441d6df1928 (patch)
tree286bd80c0acb6e84fe93eae90766896912eb4c2e
parentfdf65962b9610ab0a7b8e91dc1a2d4973f44c169 (diff)
fix/simplify rng
-rw-r--r--src/commands/meme.rs59
-rw-r--r--src/db/mod.rs4
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);