use message time for leet check instead of current time
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
andreas 2022-08-01 22:06:45 +02:00
parent 787988d9c8
commit 2d62c4d4ec
Signed by: andreas
GPG Key ID: D97194E55873280A
2 changed files with 18 additions and 24 deletions

View File

@ -1,17 +1,17 @@
use chrono::{Local, NaiveTime}; use chrono::NaiveTime;
#[must_use]
pub fn text_is_leet(text: &str) -> bool { pub fn text_is_leet(text: &str) -> bool {
text.eq_ignore_ascii_case("leet") || text == "l33t" || text == "1337" text.eq_ignore_ascii_case("leet") || text == "l33t" || text == "1337"
} }
pub fn time_is_leet() -> bool { #[must_use]
let now = Local::now().time(); pub fn time_is_leet(time: NaiveTime) -> bool {
let leet = NaiveTime::from_hms(13,37,30); let leet = NaiveTime::from_hms(13,37,30);
let allowed_timegap = 30; let allowed_timegap = 30;
let distance = now - leet; let distance = time - leet;
distance.num_seconds().abs() <= allowed_timegap distance.num_seconds().abs() <= allowed_timegap
} }

View File

@ -1,7 +1,7 @@
mod lib; 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::AnyPool;
use sqlx::any::AnyPoolOptions; use sqlx::any::AnyPoolOptions;
use teloxide::{prelude::*, RequestError, dispatching::UpdateFilterExt, utils::command::BotCommands}; use teloxide::{prelude::*, RequestError, dispatching::UpdateFilterExt, utils::command::BotCommands};
@ -48,20 +48,18 @@ enum LeetError {
DbError(#[from] sqlx::Error) DbError(#[from] sqlx::Error)
} }
async fn check_leet(username: &str, pool: &AnyPool) -> Result<(), LeetError> { async fn check_leet(username: &str, sent_time: NaiveDateTime, pool: &AnyPool) -> Result<(), LeetError> {
if ! time_is_leet() { if ! time_is_leet(sent_time.time()) {
return Err(LeetError::NotLeet); 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") let latest_leet : Option<(i32, String, NaiveDateTime)> = sqlx::query_as("select * from leet_log where username = $1 order by log_time desc")
.bind(username) .bind(username)
.fetch_optional(pool) .fetch_optional(pool)
.await?; .await?;
if let Some(latest_leet) = latest_leet { 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 { if distance.num_hours() < 24 {
return Err(LeetError::AlreadyHitLeet); return Err(LeetError::AlreadyHitLeet);
@ -71,16 +69,10 @@ async fn check_leet(username: &str, pool: &AnyPool) -> Result<(), LeetError> {
Ok(()) Ok(())
} }
async fn log_leet(username: &str, pool: &AnyPool) -> Result<(), sqlx::Error> { async fn log_leet(username: &str, sent_time: NaiveDateTime, pool: &AnyPool) -> Result<(), sqlx::Error> {
let sql_now = match pool.any_kind() { sqlx::query("insert into leet_log (username, log_time) values ($1, $2)")
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)
.bind(username) .bind(username)
.bind(sent_time)
.execute(pool) .execute(pool)
.await?; .await?;
@ -124,7 +116,7 @@ enum MessageHandlerError {
NoScore, NoScore,
} }
fn filter_leet(message: Message) -> bool { fn filter_leet(message: &Message) -> bool {
let text = match message.text() { let text = match message.text() {
Some(t) => t, Some(t) => t,
None => { return false; } None => { return false; }
@ -140,7 +132,9 @@ async fn leet_message_handler(message: Message, bot: AutoSend<Bot>, pool: AnyPoo
.username.clone() .username.clone()
.ok_or(MessageHandlerError::NoUsername)?; .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 { if let Err(e) = leet_check {
match e { match e {
@ -154,7 +148,7 @@ async fn leet_message_handler(message: Message, bot: AutoSend<Bot>, pool: AnyPoo
return message_ok(); return message_ok();
} }
log_leet(&username, &pool).await?; log_leet(&username, message_sent_time, &pool).await?;
let scores = get_scores(&pool).await?; let scores = get_scores(&pool).await?;