use message time for leet check instead of current time
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
787988d9c8
commit
419335f78f
10
src/lib.rs
10
src/lib.rs
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
30
src/main.rs
30
src/main.rs
@ -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?;
|
||||||
|
|
||||||
@ -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?;
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user