aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Perry <avaglir@gmail.com>2019-03-03 03:35:05 -0500
committerNathan Perry <avaglir@gmail.com>2019-03-03 03:35:05 -0500
commita597151e2086e12814fea12abe1a4c31d0ca1f7f (patch)
tree72d49618f89e0ae7c0816efb62222201273cd3ae
parente277e52cbec7bd178337019df7840691845d683d (diff)
show invocations in stats
-rw-r--r--src/commands/meme.rs18
-rw-r--r--src/db/mod.rs41
-rw-r--r--src/db/schema.rs1
3 files changed, 58 insertions, 2 deletions
diff --git a/src/commands/meme.rs b/src/commands/meme.rs
index 58b7d63..42a4051 100644
--- a/src/commands/meme.rs
+++ b/src/commands/meme.rs
@@ -295,17 +295,33 @@ 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)?;
let s = format!(
- "{} memes total\n{} memes with audio ({:0.1}%)\n{} memes with images ({:0.1}%)",
+ 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/db/mod.rs b/src/db/mod.rs
index 840bb07..b3861d2 100644
--- a/src/db/mod.rs
+++ b/src/db/mod.rs
@@ -3,6 +3,10 @@ use std::{
env,
};
+use chrono::{
+ DateTime,
+ Utc,
+};
use diesel::{
NotFound,
prelude::*,
@@ -154,15 +158,20 @@ pub fn rand_audio_meme(conn: &PgConnection) -> Result<Meme> {
.map_err(Error::from)
}
-#[derive(Debug, Copy, Clone, Default)]
+#[derive(Debug, Copy, Clone)]
pub struct Stats {
pub memes_overall: usize,
pub audio_memes: usize,
pub image_memes: usize,
+ pub started_recording: DateTime<Utc>,
+ pub total_meme_invocations: usize,
+ pub audio_meme_invocations: usize,
+ pub random_meme_invocations: usize,
}
pub fn stats(conn: &PgConnection) -> Result<Stats> {
use diesel::dsl::{count_star, count};
+ use chrono::NaiveDateTime;
let total_count: i64 = memes::table
.select(count_star())
@@ -181,9 +190,39 @@ pub fn stats(conn: &PgConnection) -> Result<Stats> {
.first(conn)
.map_err(Error::from)?;
+ let started_recording: NaiveDateTime = invocation_records::table
+ .select(invocation_records::time)
+ .order(invocation_records::time)
+ .first(conn)
+ .map_err(Error::from)?;
+
+ let started_recording = DateTime::from_utc(started_recording, Utc{});
+
+ let total_meme_invocations: i64 = invocation_records::table
+ .select(count_star())
+ .first(conn)
+ .map_err(Error::from)?;
+
+ let audio_meme_invocations: i64 = invocation_records::table
+ .inner_join(memes::table)
+ .select(count_star())
+ .filter(memes::audio_id.is_not_null())
+ .first(conn)
+ .map_err(Error::from)?;
+
+ let random_meme_invocations: i64 = invocation_records::table
+ .select(count_star())
+ .filter(invocation_records::random.eq(true))
+ .first(conn)
+ .map_err(Error::from)?;
+
Ok(Stats {
memes_overall: total_count as usize,
image_memes: image_count as usize,
audio_memes: audio_count as usize,
+ started_recording,
+ total_meme_invocations: total_meme_invocations as usize,
+ audio_meme_invocations: audio_meme_invocations as usize,
+ random_meme_invocations: random_meme_invocations as usize,
})
}
diff --git a/src/db/schema.rs b/src/db/schema.rs
index 1ab5fa1..01ec1d0 100644
--- a/src/db/schema.rs
+++ b/src/db/schema.rs
@@ -73,6 +73,7 @@ joinable!(memes -> audio (audio_id));
joinable!(memes -> images (image_id));
joinable!(memes -> metadata (metadata_id));
joinable!(tombstones -> metadata (metadata_id));
+joinable!(invocation_records -> memes (meme_id));
allow_tables_to_appear_in_same_query!(
audio,