diff --git a/src/lib.rs b/src/lib.rs index aeae3ce..3739fe5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,17 +1,17 @@ -use chrono::{Local, NaiveTime}; - +use chrono::NaiveTime; +#[must_use] pub fn text_is_leet(text: &str) -> bool { text.eq_ignore_ascii_case("leet") || text == "l33t" || text == "1337" } -pub fn time_is_leet() -> bool { - let now = Local::now().time(); +#[must_use] +pub fn time_is_leet(time: NaiveTime) -> bool { let leet = NaiveTime::from_hms(13,37,30); let allowed_timegap = 30; - let distance = now - leet; + let distance = time - leet; distance.num_seconds().abs() <= allowed_timegap } diff --git a/src/main.rs b/src/main.rs index 31ee819..762d184 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ mod lib; -use crate::lib::*; +use crate::lib::{text_is_leet, time_is_leet}; -use chrono::{NaiveDateTime, Local}; +use chrono::NaiveDateTime; use sqlx::AnyPool; use sqlx::any::AnyPoolOptions; use teloxide::{prelude::*, RequestError, dispatching::UpdateFilterExt, utils::command::BotCommands}; @@ -48,20 +48,18 @@ enum LeetError { DbError(#[from] sqlx::Error) } -async fn check_leet(username: &str, pool: &AnyPool) -> Result<(), LeetError> { - if ! time_is_leet() { +async fn check_leet(username: &str, sent_time: NaiveDateTime, pool: &AnyPool) -> Result<(), LeetError> { + if ! time_is_leet(sent_time.time()) { return Err(LeetError::NotLeet); } - let now = Local::now().naive_local(); - let latest_leet : Option<(i32, String, NaiveDateTime)> = sqlx::query_as("select * from leet_log where username = $1 order by log_time desc") .bind(username) .fetch_optional(pool) .await?; if let Some(latest_leet) = latest_leet { - let distance = now - latest_leet.2; + let distance = sent_time - latest_leet.2; if distance.num_hours() < 24 { return Err(LeetError::AlreadyHitLeet); @@ -71,16 +69,10 @@ async fn check_leet(username: &str, pool: &AnyPool) -> Result<(), LeetError> { Ok(()) } -async fn log_leet(username: &str, pool: &AnyPool) -> Result<(), sqlx::Error> { - let sql_now = match pool.any_kind() { - sqlx::any::AnyKind::Postgres => "now()", - sqlx::any::AnyKind::Sqlite => "datetime()" - }; - - let query_sql = format!("insert into leet_log (username, log_time) values ($1, {})", sql_now); - - sqlx::query(&query_sql) +async fn log_leet(username: &str, sent_time: NaiveDateTime, pool: &AnyPool) -> Result<(), sqlx::Error> { + sqlx::query("insert into leet_log (username, log_time) values ($1, $2)") .bind(username) + .bind(sent_time) .execute(pool) .await?; @@ -124,7 +116,7 @@ enum MessageHandlerError { NoScore, } -fn filter_leet(message: Message) -> bool { +fn filter_leet(message: &Message) -> bool { let text = match message.text() { Some(t) => t, None => { return false; } @@ -140,7 +132,9 @@ async fn leet_message_handler(message: Message, bot: AutoSend, pool: AnyPoo .username.clone() .ok_or(MessageHandlerError::NoUsername)?; - let leet_check = check_leet(&username, &pool).await; + let message_sent_time = message.date.naive_local(); + + let leet_check = check_leet(&username, message_sent_time, &pool).await; if let Err(e) = leet_check { match e { @@ -154,7 +148,7 @@ async fn leet_message_handler(message: Message, bot: AutoSend, pool: AnyPoo return message_ok(); } - log_leet(&username, &pool).await?; + log_leet(&username, message_sent_time, &pool).await?; let scores = get_scores(&pool).await?;