From a597151e2086e12814fea12abe1a4c31d0ca1f7f Mon Sep 17 00:00:00 2001 From: Nathan Perry Date: Sun, 3 Mar 2019 03:35:05 -0500 Subject: show invocations in stats --- src/commands/meme.rs | 18 +++++++++++++++++- src/db/mod.rs | 41 ++++++++++++++++++++++++++++++++++++++++- src/db/schema.rs | 1 + 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 { .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, + pub total_meme_invocations: usize, + pub audio_meme_invocations: usize, + pub random_meme_invocations: usize, } pub fn stats(conn: &PgConnection) -> Result { 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 { .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, -- cgit v1.3.1