diff --git a/src/handlers/commands/import.rs b/src/handlers/commands/import.rs index e5d73de..a201f85 100644 --- a/src/handlers/commands/import.rs +++ b/src/handlers/commands/import.rs @@ -79,16 +79,7 @@ async fn get_document( dialogue: MainDialogue, (): (), ) -> crate::Result<()> { - let document = match msg.document() { - Some(doc) => doc, - None => { - bot.send_message(msg.chat.id, "You didn't send a file") - .reply_markup(deletion_markup()) - .await?; - dialogue.exit().await?; - return Ok(()); - } - }; + let document = msg.document().unwrap(); match document.file_name { Some(ref name) if name.trim_end().ends_with(".json") => (), _ => { diff --git a/src/handlers/state/generic.rs b/src/handlers/state/generic.rs index a8ce012..67e73ac 100644 --- a/src/handlers/state/generic.rs +++ b/src/handlers/state/generic.rs @@ -25,16 +25,17 @@ where ) -> PinnedFuture<'a, crate::Result>, { let handler = next.lock().await.take(); + let previous = handler + .as_ref() + .and_then(|handler| handler.previous.as_ref()); + delete_optional(&bot, previous).await; if text == "/cancel" { - let previous = handler.and_then(|handler| handler.previous); - delete_optional(&bot, &previous).await; bot.send_message(msg.chat.id, "Successfully cancelled") .reply_markup(deletion_markup()) .await?; return Ok(()); } let handler = handler.ok_or(HandlerUsed)?; - delete_optional(&bot, &handler.previous).await; match check(&bot, &msg, &db, &text).await { Ok(true) => (), Ok(false) => { diff --git a/src/handlers/state/get_document.rs b/src/handlers/state/get_document.rs index 8141add..a2af268 100644 --- a/src/handlers/state/get_document.rs +++ b/src/handlers/state/get_document.rs @@ -1,6 +1,6 @@ use crate::{ errors::HandlerUsed, - handlers::{utils::delete_optional, MainDialogue, PackagedHandler}, + handlers::{markups::deletion_markup, utils::delete_optional, MainDialogue, PackagedHandler}, }; use sea_orm::prelude::*; use teloxide::{adaptors::Throttle, prelude::*}; @@ -13,7 +13,24 @@ pub async fn get_document( dialogue: MainDialogue, next: PackagedHandler<()>, ) -> crate::Result<()> { - let handler = next.lock().await.take().ok_or(HandlerUsed)?; - delete_optional(&bot, &handler.previous).await; + let handler = next.lock().await.take(); + let previous = handler + .as_ref() + .and_then(|handler| handler.previous.as_ref()); + delete_optional(&bot, previous).await; + if let Some("/cancel") = msg.text().map(str::trim_end) { + bot.send_message(msg.chat.id, "Successfully cancelled") + .reply_markup(deletion_markup()) + .await?; + return Ok(()); + } + let handler = handler.ok_or(HandlerUsed)?; + if msg.document().is_none() { + bot.send_message(msg.chat.id, "You didn't send a file") + .reply_markup(deletion_markup()) + .await?; + dialogue.exit().await?; + return Ok(()); + } (handler.handler)(bot, msg, db, dialogue, ()).await } diff --git a/src/handlers/utils.rs b/src/handlers/utils.rs index 2bb2c6d..86d6160 100644 --- a/src/handlers/utils.rs +++ b/src/handlers/utils.rs @@ -1,6 +1,6 @@ use crate::handlers::{Handler, MainDialogue, PackagedHandler}; use sea_orm::prelude::*; -use std::{future::Future, sync::Arc}; +use std::{borrow::Borrow, future::Future, sync::Arc}; use teloxide::{adaptors::Throttle, prelude::*}; use tokio::sync::Mutex; @@ -29,8 +29,9 @@ pub async fn delete_message(bot: Throttle, msg: Message) { /// Deletes the message if there is one ignoring the errors #[inline] -pub async fn delete_optional(bot: &Throttle, msg: &Option) { +pub async fn delete_optional(bot: &Throttle, msg: Option>) { if let Some(msg) = msg { + let msg: &Message = msg.borrow(); let _ = bot.delete_message(msg.chat.id, msg.id).await; } }