simplified Handler.previous into the chat id and message id

This commit is contained in:
StNicolay 2023-07-16 00:37:41 +03:00
parent 1f016a3694
commit e25460a3d8
Signed by: StNicolay
GPG Key ID: 9693D04DCD962B0D
5 changed files with 33 additions and 22 deletions

View File

@ -26,13 +26,13 @@ where
return Err(HandlerUsed.into()); return Err(HandlerUsed.into());
} }
delete_optional(&bot, handler.previous.as_ref()).await; handler.previous.delete(&bot).await;
let text = match msg.text() { let text = match msg.text() {
Some(text) => text.trim(), Some(text) => text.trim(),
None => { None => {
let msg = bot.send_message(msg.chat.id, no_text_message).await?; let msg = bot.send_message(msg.chat.id, no_text_message).await?;
handler.previous = Some(msg); handler.previous = msg.into();
return Ok(()); return Ok(());
} }
}; };
@ -46,7 +46,7 @@ where
} }
if let Some(failure_message) = check(&bot, &msg, &db, text).await? { if let Some(failure_message) = check(&bot, &msg, &db, text).await? {
handler.previous = Some(failure_message); handler.previous = failure_message.into();
return Ok(()); return Ok(());
} }

View File

@ -35,7 +35,7 @@ pub async fn get_existing_name(
return Err(HandlerUsed.into()); return Err(HandlerUsed.into());
} }
delete_optional(&bot, handler.previous.as_ref()).await; handler.previous.delete(&bot).await;
let text = match msg.text() { let text = match msg.text() {
Some(text) => text.trim(), Some(text) => text.trim(),
@ -47,7 +47,7 @@ pub async fn get_existing_name(
) )
.reply_markup(account_markup(user_id, &db).await?) .reply_markup(account_markup(user_id, &db).await?)
.await?; .await?;
handler.previous = Some(msg); handler.previous = msg.into();
return Ok(()); return Ok(());
} }
}; };
@ -61,7 +61,7 @@ pub async fn get_existing_name(
} }
if let Some(failure_message) = check_name(&bot, &msg, &db, text, user_id).await? { if let Some(failure_message) = check_name(&bot, &msg, &db, text, user_id).await? {
handler.previous = Some(failure_message); handler.previous = failure_message.into();
return Ok(()); return Ok(());
} }

View File

@ -121,7 +121,7 @@ pub async fn get_user(
return Err(HandlerUsed.into()); return Err(HandlerUsed.into());
} }
delete_optional(&bot, handler.previous.as_ref()).await; handler.previous.delete(&bot).await;
if let Some("/cancel") = msg.text().map(str::trim) { if let Some("/cancel") = msg.text().map(str::trim) {
dialogue.exit().await?; dialogue.exit().await?;
@ -137,7 +137,7 @@ pub async fn get_user(
let msg = bot let msg = bot
.send_message(msg.chat.id, "You didn't send a file. Try again") .send_message(msg.chat.id, "You didn't send a file. Try again")
.await?; .await?;
handler.previous = Some(msg); handler.previous = msg.into();
return Ok(()); return Ok(());
} }
}; };
@ -151,7 +151,7 @@ pub async fn get_user(
"Invalid file name. You need to send a json file. Try again", "Invalid file name. You need to send a json file. Try again",
) )
.await?; .await?;
handler.previous = Some(msg); handler.previous = msg.into();
return Ok(()); return Ok(());
} }
} }
@ -170,14 +170,14 @@ pub async fn get_user(
Ok(Ok(user)) => user, Ok(Ok(user)) => user,
Ok(Err(error_text)) => { Ok(Err(error_text)) => {
let msg = bot.send_message(msg.chat.id, error_text).await?; let msg = bot.send_message(msg.chat.id, error_text).await?;
handler.previous = Some(msg); handler.previous = msg.into();
return Ok(()); return Ok(());
} }
Err(_) => { Err(_) => {
let msg = bot let msg = bot
.send_message(msg.chat.id, "Error parsing the json file. Try again") .send_message(msg.chat.id, "Error parsing the json file. Try again")
.await?; .await?;
handler.previous = Some(msg); handler.previous = msg.into();
return Ok(()); return Ok(());
} }
}; };

View File

@ -1,8 +1,27 @@
use crate::prelude::*; use crate::prelude::*;
use futures::future::BoxFuture; use futures::future::BoxFuture;
use std::{future::Future, sync::Arc}; use std::{borrow::Borrow, future::Future, sync::Arc};
use teloxide::types::MessageId;
use tokio::sync::Mutex; use tokio::sync::Mutex;
#[derive(Clone, Copy)]
pub struct MessageIds(pub ChatId, pub MessageId);
impl MessageIds {
#[inline]
pub async fn delete(&self, bot: &Throttle<Bot>) {
let _ = bot.delete_message(self.0, self.1).await;
}
}
impl<T: Borrow<Message>> From<T> for MessageIds {
#[inline]
fn from(value: T) -> Self {
let value: &Message = value.borrow();
Self(value.chat.id, value.id)
}
}
type DynHanlder<T> = Box< type DynHanlder<T> = Box<
dyn FnOnce( dyn FnOnce(
Throttle<Bot>, Throttle<Bot>,
@ -17,7 +36,7 @@ type DynHanlder<T> = Box<
pub struct Handler<T> { pub struct Handler<T> {
pub func: Option<DynHanlder<T>>, pub func: Option<DynHanlder<T>>,
pub previous: Option<Message>, pub previous: MessageIds,
} }
pub type PackagedHandler<T> = Arc<Mutex<Handler<T>>>; pub type PackagedHandler<T> = Arc<Mutex<Handler<T>>>;
@ -25,7 +44,7 @@ pub type PackagedHandler<T> = Arc<Mutex<Handler<T>>>;
impl<T> Handler<T> { impl<T> Handler<T> {
/// Convinience method to convert a simple async function and a previous message into PackagedHandler /// Convinience method to convert a simple async function and a previous message into PackagedHandler
#[inline] #[inline]
pub fn new<H, F>(f: H, previous: impl Into<Option<Message>>) -> PackagedHandler<T> pub fn new<H, F>(f: H, previous: impl Into<MessageIds>) -> PackagedHandler<T>
where where
H: FnOnce(Throttle<Bot>, Message, DatabaseConnection, MainDialogue, T) -> F H: FnOnce(Throttle<Bot>, Message, DatabaseConnection, MainDialogue, T) -> F
+ Send + Send

View File

@ -6,14 +6,6 @@ pub async fn delete_message(bot: Throttle<Bot>, msg: Message) {
let _ = bot.delete_message(msg.chat.id, msg.id).await; let _ = bot.delete_message(msg.chat.id, msg.id).await;
} }
/// Deletes the message if there is one ignoring the errors
#[inline]
pub async fn delete_optional(bot: &Throttle<Bot>, msg: Option<&Message>) {
if let Some(msg) = msg {
let _ = bot.delete_message(msg.chat.id, msg.id).await;
}
}
/// Returns true if the field is valid /// Returns true if the field is valid
#[inline] #[inline]
pub fn validate_field(field: &str) -> bool { pub fn validate_field(field: &str) -> bool {