aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Perry <avaglir@gmail.com>2019-03-29 16:02:03 -0400
committerNathan Perry <avaglir@gmail.com>2019-03-29 16:02:03 -0400
commit8f80e611a328aca025fb334882748b0d4cc2a5a5 (patch)
tree08a0f09a50f3db3a95c230bd2416756dc42fde6b
parentd066d8892fcb04a4a2854f6d5455851620eb8d62 (diff)
clean up meme module and allow history size to be adjusted
-rw-r--r--src/commands/meme/history.rs174
-rw-r--r--src/commands/meme/mod.rs (renamed from src/commands/meme.rs)149
2 files changed, 176 insertions, 147 deletions
diff --git a/src/commands/meme/history.rs b/src/commands/meme/history.rs
new file mode 100644
index 0000000..051040f
--- /dev/null
+++ b/src/commands/meme/history.rs
@@ -0,0 +1,174 @@
+use diesel::{
+ NotFound,
+ result::Error as DieselError,
+};
+use serenity::{
+ framework::standard::Args,
+ model::channel::Message,
+ prelude::*,
+};
+use timeago::{
+ Formatter,
+ TimeUnit,
+};
+
+use crate::{
+ commands::send,
+ db::{
+ connection,
+ InvocationRecord,
+ Meme,
+ Metadata,
+ },
+ must_env_lookup,
+ Result,
+};
+
+lazy_static! {
+ static ref TIME_FORMATTER: Formatter = {
+ let mut f = Formatter::new();
+ f.min_unit(TimeUnit::Minutes);
+ f.num_items(2);
+
+ f
+ };
+}
+
+pub fn wat(_: &mut Context, msg: &Message, _: Args) -> Result<()> {
+ let conn = connection()?;
+
+ let record = match InvocationRecord::last(&conn) {
+ Ok(x) => x,
+ Err(e) => {
+ if let Some(NotFound) = e.downcast_ref::<DieselError>() {
+ info!("found no memes in history");
+ return send(msg.channel_id, "no one has ever memed before", msg.tts);
+ }
+
+ send(msg.channel_id, "BAD MEME BAD MEME", msg.tts)?;
+ return Err(e);
+ },
+ };
+
+ let meme = Meme::find(&conn, record.meme_id);
+
+ match meme {
+ Ok(ref meme) => {
+ let metadata = Metadata::find(&conn, meme.metadata_id)?;
+ let author = crate::TARGET_GUILD_ID.member(metadata.created_by as u64)?;
+
+ send(msg.channel_id,
+ &format!("that was \"{}\" by {} ({})",
+ meme.title, author.mention(), metadata.created.date()), msg.tts)?
+ },
+ Err(e) => {
+ if let Some(NotFound) = e.downcast_ref::<DieselError>() {
+ info!("last meme not found in database");
+ return send(msg.channel_id, "heuueueeeeh?", msg.tts);
+ }
+
+ send(msg.channel_id, "do i look like i know what a jpeg is", msg.tts)?;
+ return Err(e);
+ },
+ };
+
+ meme.map(|_| {})
+}
+
+pub fn history(_: &mut Context, msg: &Message, mut args: Args) -> Result<()> {
+ use itertools::Itertools;
+
+ lazy_static! {
+ static ref MAX_HIST: usize = must_env_lookup("MAX_HIST");
+ static ref DEFAULT_HIST: usize = must_env_lookup("DEFAULT_HIST");
+ }
+
+ let conn = connection()?;
+
+ let n = args.single_quoted::<usize>().unwrap_or(*DEFAULT_HIST);
+
+ if n > *MAX_HIST {
+ debug!("user requested more than MAX_HIST ({}) items from history", *MAX_HIST);
+ send(msg.channel_id, "YER PUSHIN ME OVER THE FUCKIN LINE", true)?;
+ }
+
+ let n = n.min(*MAX_HIST);
+
+ let records = InvocationRecord::last_n(&conn, n)?;
+
+ if records.len() == 0 {
+ info!("no memes in history");
+ return send(msg.channel_id, "i don't remember anything :(", msg.tts);
+ }
+
+ info!("reporting meme history (len {})", n);
+ let resp = records
+ .into_iter()
+ .enumerate()
+ .rev()
+ .map(|(i, rec)| {
+ use chrono;
+
+ let dt = chrono::DateTime::from_utc(rec.time, chrono::Utc{});
+ let ago = TIME_FORMATTER.convert((chrono::Utc::now() - dt).to_std().unwrap());
+
+ let rand = if rec.random { "R, " } else { "" };
+ Meme::find(&conn, rec.meme_id)
+ .and_then(|meme| {
+ Metadata::find(&conn, meme.metadata_id).map(|metadata| (metadata, meme))
+ })
+ .map(|(metadata, meme)| {
+ let author_name = crate::TARGET_GUILD_ID.member(metadata.created_by as u64).map(|m| m.display_name().into_owned()).unwrap_or("???".to_owned());
+ let invoker_name = crate::TARGET_GUILD_ID.member(rec.user_id as u64).map(|m| m.display_name().into_owned()).unwrap_or("???".to_owned());
+ format!("{}. [{}{}] \"{}\" by {} ({}). invoked by {}.", i + 1, rand, ago, meme.title, author_name, metadata.created.date(), invoker_name)
+ })
+ .unwrap_or_else(|e| {
+ if let Some(variant) = e.downcast_ref::<DieselError>() {
+ if *variant != NotFound {
+ error!("error encountered loading meme history: {}", e);
+ }
+ }
+
+ let invoker_name = crate::TARGET_GUILD_ID.member(rec.user_id as u64).map(|m| m.display_name().into_owned()).unwrap_or("???".to_owned());
+ format!("{}. [{}{}] not found. invoked by {}.", i + 1, rand, ago, invoker_name)
+ })
+ })
+ .join("\n");
+
+ send(msg.channel_id, &resp, false)
+}
+
+pub fn stats(_: &mut Context, msg: &Message, _: Args) -> Result<()> {
+ use db;
+ use chrono;
+
+ let conn = connection()?;
+ let stats = db::stats(&conn)?;
+
+ debug!("reporting stats");
+
+ let s = format!(
+ r#"
+{} memes total
+{} memes with audio ({:0.1}%)
+{} memes with images ({:0.1}%)
+
+started recording meme invocations on {} ({})
+{} total meme invocations recorded
+{} of which were random ({:0.1}%)
+and {} were audio ({:0.1}%)"#,
+ stats.memes_overall,
+ stats.audio_memes,
+ (stats.audio_memes as f64) / (stats.memes_overall as f64) * 100.,
+ stats.image_memes,
+ (stats.image_memes as f64) / (stats.memes_overall as f64) * 100.,
+ stats.started_recording.date(),
+ TIME_FORMATTER.convert((chrono::Utc::now() - stats.started_recording).to_std().unwrap()),
+ stats.total_meme_invocations,
+ stats.random_meme_invocations,
+ (stats.random_meme_invocations as f64) / (stats.total_meme_invocations as f64) * 100.,
+ stats.audio_meme_invocations,
+ (stats.audio_meme_invocations as f64) / (stats.total_meme_invocations as f64) * 100.,
+ );
+ send(msg.channel_id, s, msg.tts)
+}
diff --git a/src/commands/meme.rs b/src/commands/meme/mod.rs
index 5dbd831..d257605 100644
--- a/src/commands/meme.rs
+++ b/src/commands/meme/mod.rs
@@ -20,10 +20,6 @@ use serenity::{
model::channel::Message,
prelude::*,
};
-use timeago::{
- Formatter,
- TimeUnit,
-};
use url::Url;
use crate::{
@@ -44,15 +40,9 @@ use crate::{
Result,
};
-lazy_static! {
- static ref TIME_FORMATTER: Formatter = {
- let mut f = Formatter::new();
- f.min_unit(TimeUnit::Minutes);
- f.num_items(2);
+pub use self::history::*;
- f
- };
-}
+mod history;
#[inline]
pub fn meme(ctx: &mut Context, msg: &Message, args: Args) -> Result<()> {
@@ -103,107 +93,6 @@ fn _meme(ctx: &mut Context, msg: &Message, args: Args, audio_playback: AudioPlay
send_meme(ctx, &mem, &conn, msg)
}
-pub fn wat(_: &mut Context, msg: &Message, _: Args) -> Result<()> {
- let conn = connection()?;
-
- let record = match InvocationRecord::last(&conn) {
- Ok(x) => x,
- Err(e) => {
- if let Some(NotFound) = e.downcast_ref::<DieselError>() {
- info!("found no memes in history");
- return send(msg.channel_id, "no one has ever memed before", msg.tts);
- }
-
- send(msg.channel_id, "BAD MEME BAD MEME", msg.tts)?;
- return Err(e);
- },
- };
-
- let meme = Meme::find(&conn, record.meme_id);
-
- match meme {
- Ok(ref meme) => {
- let metadata = Metadata::find(&conn, meme.metadata_id)?;
- let author = crate::TARGET_GUILD_ID.member(metadata.created_by as u64)?;
-
- send(msg.channel_id,
- &format!("that was \"{}\" by {} ({})",
- meme.title, author.mention(), metadata.created.date()), msg.tts)?
- },
- Err(e) => {
- if let Some(NotFound) = e.downcast_ref::<DieselError>() {
- info!("last meme not found in database");
- return send(msg.channel_id, "heuueueeeeh?", msg.tts);
- }
-
- send(msg.channel_id, "do i look like i know what a jpeg is", msg.tts)?;
- return Err(e);
- },
- };
-
- meme.map(|_| {})
-}
-
-pub fn history(_: &mut Context, msg: &Message, mut args: Args) -> Result<()> {
- use itertools::Itertools;
-
- const MAX_HIST: usize = 8;
- const DEFAULT_HIST: usize = 3;
-
- let conn = connection()?;
-
- let n = args.single_quoted::<usize>().unwrap_or(DEFAULT_HIST);
-
- if n > MAX_HIST {
- debug!("user requested more than MAX_HIST ({}) items from history", MAX_HIST);
- send(msg.channel_id, "YER PUSHIN ME OVER THE FUCKIN LINE", true)?;
- }
-
- let n = n.min(MAX_HIST);
-
- let records = InvocationRecord::last_n(&conn, n)?;
-
- if records.len() == 0 {
- info!("no memes in history");
- return send(msg.channel_id, "i don't remember anything :(", msg.tts);
- }
-
- info!("reporting meme history (len {})", n);
- let resp = records
- .into_iter()
- .enumerate()
- .rev()
- .map(|(i, rec)| {
- use chrono;
-
- let dt = chrono::DateTime::from_utc(rec.time, chrono::Utc{});
- let ago = TIME_FORMATTER.convert((chrono::Utc::now() - dt).to_std().unwrap());
-
- let rand = if rec.random { "R, " } else { "" };
- Meme::find(&conn, rec.meme_id)
- .and_then(|meme| {
- Metadata::find(&conn, meme.metadata_id).map(|metadata| (metadata, meme))
- })
- .map(|(metadata, meme)| {
- let author_name = crate::TARGET_GUILD_ID.member(metadata.created_by as u64).map(|m| m.display_name().into_owned()).unwrap_or("???".to_owned());
- let invoker_name = crate::TARGET_GUILD_ID.member(rec.user_id as u64).map(|m| m.display_name().into_owned()).unwrap_or("???".to_owned());
- format!("{}. [{}{}] \"{}\" by {} ({}). invoked by {}.", i + 1, rand, ago, meme.title, author_name, metadata.created.date(), invoker_name)
- })
- .unwrap_or_else(|e| {
- if let Some(variant) = e.downcast_ref::<DieselError>() {
- if *variant != NotFound {
- error!("error encountered loading meme history: {}", e);
- }
- }
-
- let invoker_name = crate::TARGET_GUILD_ID.member(rec.user_id as u64).map(|m| m.display_name().into_owned()).unwrap_or("???".to_owned());
- format!("{}. [{}{}] not found. invoked by {}.", i + 1, rand, ago, invoker_name)
- })
- })
- .join("\n");
-
- send(msg.channel_id, &resp, false)
-}
pub fn addmeme(_: &mut Context, msg: &Message, args: Args) -> Result<()> {
let mut args = Args::new(args.rest(), &[" ".to_owned(), "\n".to_owned(), "\t".to_owned()]);
@@ -368,40 +257,6 @@ pub fn delmeme(_: &mut Context, msg: &Message, mut args: Args) -> Result<()> {
}
}
-pub fn stats(_: &mut Context, msg: &Message, _: Args) -> Result<()> {
- use db;
- use chrono;
-
- let conn = connection()?;
- let stats = db::stats(&conn)?;
-
- debug!("reporting stats");
-
- let s = format!(
- r#"
-{} memes total
-{} memes with audio ({:0.1}%)
-{} memes with images ({:0.1}%)
-
-started recording meme invocations on {} ({})
-{} total meme invocations recorded
-{} of which were random ({:0.1}%)
-and {} were audio ({:0.1}%)"#,
- stats.memes_overall,
- stats.audio_memes,
- (stats.audio_memes as f64) / (stats.memes_overall as f64) * 100.,
- stats.image_memes,
- (stats.image_memes as f64) / (stats.memes_overall as f64) * 100.,
- stats.started_recording.date(),
- TIME_FORMATTER.convert((chrono::Utc::now() - stats.started_recording).to_std().unwrap()),
- stats.total_meme_invocations,
- stats.random_meme_invocations,
- (stats.random_meme_invocations as f64) / (stats.total_meme_invocations as f64) * 100.,
- stats.audio_meme_invocations,
- (stats.audio_meme_invocations as f64) / (stats.total_meme_invocations as f64) * 100.,
- );
- send(msg.channel_id, s, msg.tts)
-}
fn rand_meme(ctx: &Context, message: &Message, audio_playback: AudioPlayback) -> Result<()> {
let conn = connection()?;