From 49cb81ce176499622914d2d3ff5a0f31e0eb4f69 Mon Sep 17 00:00:00 2001 From: gennyble Date: Sat, 5 Apr 2025 06:31:09 -0500 Subject: add stats favicon --- stats/src/main.rs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'stats/src/main.rs') diff --git a/stats/src/main.rs b/stats/src/main.rs index 2e0c372..4b57834 100644 --- a/stats/src/main.rs +++ b/stats/src/main.rs @@ -1,5 +1,6 @@ +use std::{io::Write, time::Instant}; + use rusqlite::{Connection, params}; -use std::time::Instant; use time::{Duration, OffsetDateTime}; // Thank you, cat, for optimizing my query @@ -16,8 +17,23 @@ const TOP_TEN_ALL_TIME: &str = "\ "; const STYLE: &'static str = include_str!("style.css"); +const FAVICON: &'static [u8] = include_bytes!("favicon.gif"); fn main() { + let Some(path) = std::env::var("PATH_INFO").ok() else { + error_and_die(500, "no path provided"); + }; + + match path.as_ref() { + "/stats/favicon.gif" => { + println!("Content-Type: image/png\n"); + std::io::stdout().write_all(FAVICON).unwrap(); + std::process::exit(1); + } + "/stats" | "/stats/" => (), + _ => error_and_die(404, "not found"), + } + let db_path = std::env::var("CORGI_STATS_DB").ok(); let db = if let Some(path) = db_path { if let Ok(db) = Connection::open(path) { @@ -37,6 +53,7 @@ fn main() { WHERE requests.timestamp > ?1 \ GROUP BY requests.agent_id;"; + let start = Instant::now(); let mut prepared = db.prepare(query).unwrap(); let mut agents: Vec<(usize, String)> = prepared .query_map(params![fifteen_ago], |row| Ok((row.get(0)?, row.get(1)?))) @@ -53,6 +70,7 @@ fn main() { .map(|r| r.unwrap()) .collect(); let sum_highest_five = highest_five.iter().fold(0, |acc, (count, _)| acc + count); + let elapsed = start.elapsed(); println!("Content-Type: text/html\n"); println!(""); @@ -60,10 +78,12 @@ fn main() { println!("\n\ corgi stats\n\ \n\ + \n\ "); println!(""); println!("

Corgi Stats :)

"); + println!("

generated in {}ms

", elapsed.as_millis()); #[rustfmt::skip] println!("\n\ -- cgit 1.4.1-3-g733a5