Added button for deleting the resulting message

This commit is contained in:
StNicolay 2023-05-06 21:02:32 +03:00
parent 4a0760d711
commit c264623510
Signed by: StNicolay
GPG Key ID: 9693D04DCD962B0D
16 changed files with 104 additions and 30 deletions

View File

@ -0,0 +1,18 @@
use teloxide::{adaptors::Throttle, prelude::*};
pub async fn run(bot: Throttle<Bot>, q: CallbackQuery) -> crate::Result<()> {
match q.message {
Some(msg) => {
bot.delete_message(msg.chat.id, msg.id).await?;
Ok(())
}
None => Ok(()),
}
}
pub fn filter(q: CallbackQuery) -> bool {
match q.data.as_deref() {
Some("delete_message") => true,
_ => false,
}
}

View File

@ -0,0 +1 @@
pub mod delete_message;

View File

@ -1,6 +1,8 @@
use crate::entity::{account, prelude::Account};
use crate::errors::NoUserInfo;
use crate::handlers::{utils::package_handler, MainDialogue, State};
use crate::{
entity::{account, prelude::Account},
errors::NoUserInfo,
handlers::{markups::deletion_markup, utils::package_handler, MainDialogue, State},
};
use sea_orm::prelude::*;
use teloxide::{adaptors::Throttle, prelude::*};
use tokio::task::spawn_blocking;
@ -24,7 +26,9 @@ async fn get_master_pass(
})
.await??;
account.insert(&db).await?;
bot.send_message(msg.chat.id, "Success").await?;
bot.send_message(msg.chat.id, "Success")
.reply_markup(deletion_markup())
.await?;
Ok(())
}
@ -95,6 +99,7 @@ async fn get_account_name(
let user_id = msg.from().ok_or(NoUserInfo)?.id.0;
if Account::exists(user_id, &name, &db).await? {
bot.send_message(msg.chat.id, "Account alreay exists")
.reply_markup(deletion_markup())
.await?;
return Ok(());
}

View File

@ -1,6 +1,9 @@
use crate::handlers::markups::deletion_markup;
use teloxide::{adaptors::Throttle, prelude::*};
pub async fn default(bot: Throttle<Bot>, msg: Message) -> crate::Result<()> {
bot.send_message(msg.chat.id, "Unknown command").await?;
bot.send_message(msg.chat.id, "Unknown command")
.reply_markup(deletion_markup())
.await?;
Ok(())
}

View File

@ -1,7 +1,11 @@
use crate::{
entity::prelude::Account,
errors::NoUserInfo,
handlers::{markups, utils::package_handler, MainDialogue, State},
handlers::{
markups::{self, deletion_markup},
utils::package_handler,
MainDialogue, State,
},
};
use sea_orm::prelude::*;
use teloxide::{adaptors::Throttle, prelude::*};
@ -19,6 +23,7 @@ async fn get_master_pass(
let user_id = msg.from().ok_or(NoUserInfo)?.id.0;
Account::delete_by_id((user_id, name)).exec(&db).await?;
bot.send_message(msg.chat.id, "The account is successfully deleted")
.reply_markup(deletion_markup())
.await?;
Ok(())
}
@ -35,6 +40,7 @@ async fn get_account_name(
let user_id = msg.from().ok_or(NoUserInfo)?.id.0;
if !Account::exists(user_id, &name, &db).await? {
bot.send_message(msg.chat.id, "Account doesn't exists")
.reply_markup(deletion_markup())
.await?;
return Ok(());
}

View File

@ -1,7 +1,7 @@
use crate::{
entity::{account, prelude::*},
errors::NoUserInfo,
handlers::{utils::package_handler, MainDialogue, State},
handlers::{markups::deletion_markup, utils::package_handler, MainDialogue, State},
};
use sea_orm::prelude::*;
use teloxide::{adaptors::Throttle, prelude::*};
@ -22,6 +22,7 @@ async fn get_master_pass(
.await?;
MasterPass::delete_by_id(user_id).exec(&db).await?;
bot.send_message(msg.chat.id, "Everything was deleted")
.reply_markup(deletion_markup())
.await?;
Ok(())
}

View File

@ -1,7 +1,7 @@
use crate::{
entity::prelude::Account,
errors::NoUserInfo,
handlers::{utils::package_handler, MainDialogue, State},
handlers::{markups::deletion_markup, utils::package_handler, MainDialogue, State},
models::{DecryptedAccount, User},
};
use futures::TryStreamExt;
@ -45,7 +45,9 @@ async fn get_master_pass(
accounts.sort_unstable_by(|this, other| this.name.cmp(&other.name));
let json = to_string_pretty(&User { accounts })?;
let file = InputFile::memory(json).file_name("accounts.json");
bot.send_document(msg.chat.id, file).await?;
bot.send_document(msg.chat.id, file)
.reply_markup(deletion_markup())
.await?;
dialogue.exit().await?;
Ok(())
}

View File

@ -1,7 +1,11 @@
use crate::{
entity::prelude::Account,
errors::NoUserInfo,
handlers::{markups, utils::package_handler, MainDialogue, State},
handlers::{
markups::{self, deletion_markup},
utils::package_handler,
MainDialogue, State,
},
};
use sea_orm::prelude::*;
use teloxide::{adaptors::Throttle, prelude::*, types::ParseMode};
@ -22,13 +26,16 @@ async fn get_master_pass(
let account = match Account::get(user_id, &name, &db).await? {
Some(account) => account,
None => {
bot.send_message(msg.chat.id, "Account not found").await?;
bot.send_message(msg.chat.id, "Account not found")
.reply_markup(deletion_markup())
.await?;
return Ok(());
}
};
let (login, password) = spawn_blocking(move || account.decrypt(&master_pass)).await??;
let message = format!("Name:\n`{name}`\nLogin:\n`{login}`\nPassword:\n`{password}`");
bot.send_message(msg.chat.id, message)
.reply_markup(deletion_markup())
.parse_mode(ParseMode::MarkdownV2)
.await?;
Ok(())
@ -46,6 +53,7 @@ async fn get_account_name(
let user_id = msg.from().ok_or(NoUserInfo)?.id.0;
if !Account::exists(user_id, &name, &db).await? {
bot.send_message(msg.chat.id, "Account doesn't exists")
.reply_markup(deletion_markup())
.await?;
return Ok(());
}

View File

@ -1,4 +1,4 @@
use crate::{entity::prelude::Account, errors::NoUserInfo};
use crate::{entity::prelude::Account, errors::NoUserInfo, handlers::markups::deletion_markup};
use futures::TryStreamExt;
use sea_orm::prelude::*;
use teloxide::{adaptors::Throttle, prelude::*, types::ParseMode};
@ -13,7 +13,9 @@ pub async fn get_accounts(
let mut result = match account_names.try_next().await? {
Some(name) => format!("Accounts:\n`{name}`"),
None => {
bot.send_message(msg.chat.id, "No accounts found").await?;
bot.send_message(msg.chat.id, "No accounts found")
.reply_markup(deletion_markup())
.await?;
return Ok(());
}
};
@ -25,6 +27,7 @@ pub async fn get_accounts(
.await?;
bot.send_message(msg.chat.id, result)
.parse_mode(ParseMode::MarkdownV2)
.reply_markup(deletion_markup())
.await?;
Ok(())
}

View File

@ -1,8 +1,9 @@
use crate::handlers::Command;
use crate::handlers::{markups::deletion_markup, Command};
use teloxide::{adaptors::Throttle, prelude::*, utils::command::BotCommands};
pub async fn help(bot: Throttle<Bot>, msg: Message) -> crate::Result<()> {
bot.send_message(msg.chat.id, Command::descriptions().to_string())
.reply_markup(deletion_markup())
.await?;
Ok(())
}

View File

@ -1,6 +1,6 @@
use crate::{
errors::NoUserInfo,
handlers::{utils::package_handler, MainDialogue, State},
handlers::{markups::deletion_markup, utils::package_handler, MainDialogue, State},
models::{DecryptedAccount, User},
};
use futures::{stream, StreamExt, TryStreamExt};
@ -46,15 +46,17 @@ async fn get_master_pass(
Ok(accounts) => accounts.into_inner(),
Err(_) => unreachable!(),
};
if failed.is_empty() {
bot.send_message(msg.chat.id, "Success").await?;
let message = if failed.is_empty() {
"Success".to_owned()
} else {
let text = format!(
format!(
"Failed to create the following accounts:\n{}",
failed.into_iter().format("\n")
);
bot.send_message(msg.chat.id, text).await?;
}
)
};
bot.send_message(msg.chat.id, message)
.reply_markup(deletion_markup())
.await?;
dialogue.exit().await?;
Ok(())
}
@ -71,6 +73,7 @@ async fn get_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(());
@ -79,7 +82,9 @@ async fn get_document(
match document.file_name {
Some(ref name) if name.trim().ends_with(".json") => (),
_ => {
bot.send_message(msg.chat.id, "Invalid file name").await?;
bot.send_message(msg.chat.id, "Invalid file name")
.reply_markup(deletion_markup())
.await?;
dialogue.exit().await?;
return Ok(());
}
@ -96,13 +101,14 @@ async fn get_document(
Ok(user) => user.accounts,
Err(_) => {
bot.send_message(msg.chat.id, "Error parsing the json file")
.reply_markup(deletion_markup())
.await?;
dialogue.exit().await?;
return Ok(());
}
};
let previous = bot
.send_message(msg.chat.id, "Send a new master password")
.send_message(msg.chat.id, "Send master password")
.await?;
dialogue
.update(State::GetMasterPass(package_handler(

View File

@ -1,7 +1,7 @@
use crate::{
entity::{master_pass, prelude::*},
errors::NoUserInfo,
handlers::{utils::package_handler, MainDialogue, State},
handlers::{markups::deletion_markup, utils::package_handler, MainDialogue, State},
};
use sea_orm::prelude::*;
use teloxide::{adaptors::Throttle, prelude::*};
@ -23,7 +23,9 @@ async fn get_master_pass(
})
.await??;
model.insert(&db).await?;
bot.send_message(msg.chat.id, "Success").await?;
bot.send_message(msg.chat.id, "Success")
.reply_markup(deletion_markup())
.await?;
Ok(())
}
@ -36,6 +38,7 @@ pub async fn set_master_pass(
let user_id = msg.from().ok_or(NoUserInfo)?.id.0;
if MasterPass::exists(user_id, &db).await? {
bot.send_message(msg.chat.id, "Master password already exists")
.reply_markup(deletion_markup())
.await?;
return Ok(());
}

View File

@ -1,7 +1,7 @@
use crate::entity::prelude::Account;
use futures::TryStreamExt;
use sea_orm::prelude::*;
use teloxide::types::{KeyboardButton, KeyboardMarkup};
use teloxide::types::{InlineKeyboardButton, InlineKeyboardMarkup, KeyboardButton, KeyboardMarkup};
#[inline]
pub async fn account_markup(
@ -19,3 +19,9 @@ pub async fn account_markup(
.one_time_keyboard(true);
Ok(markup)
}
#[inline]
pub fn deletion_markup() -> InlineKeyboardMarkup {
let button = InlineKeyboardButton::callback("Delete message", "delete_message");
InlineKeyboardMarkup::new([[button]])
}

View File

@ -1,3 +1,4 @@
mod callbacks;
mod commands;
mod markups;
mod state;
@ -96,7 +97,15 @@ pub fn get_dispatcher(
.branch(command_handler)
.branch(endpoint(commands::default));
Dispatcher::builder(bot, message_handler)
let callback_handler = Update::filter_callback_query()
.filter(callbacks::delete_message::filter)
.endpoint(callbacks::delete_message::run);
let handler = dptree::entry()
.branch(message_handler)
.branch(callback_handler);
Dispatcher::builder(bot, handler)
.dependencies(deps![db, InMemStorage::<State>::new()])
.enable_ctrlc_handler()
.build()

View File

@ -1,8 +1,7 @@
use crate::{errors::HandlerUsed, handlers::markups::deletion_markup, PinnedFuture};
use sea_orm::prelude::*;
use teloxide::{adaptors::Throttle, prelude::*};
use crate::{errors::HandlerUsed, PinnedFuture};
pub async fn generic<F>(
bot: Throttle<Bot>,
text: String,
@ -23,6 +22,7 @@ where
if text == "/cancel" {
dialogue.exit().await?;
bot.send_message(msg.chat.id, "Successfully cancelled")
.reply_markup(deletion_markup())
.await?;
return Ok(());
}

View File

@ -1,7 +1,7 @@
use crate::{
entity::prelude::MasterPass,
errors::{NoMessageText, NoUserInfo},
handlers::{MainDialogue, PackagedHandler},
handlers::{markups::deletion_markup, MainDialogue, PackagedHandler},
};
use sea_orm::prelude::*;
use teloxide::{adaptors::Throttle, prelude::*};
@ -19,11 +19,13 @@ pub async fn check_master_pass<'a>(
Ok(Some(true)) => Ok(true),
Ok(Some(false)) => {
bot.send_message(msg.chat.id, "Wrong master password")
.reply_markup(deletion_markup())
.await?;
Ok(false)
}
Ok(None) => {
bot.send_message(msg.chat.id, "No master password set")
.reply_markup(deletion_markup())
.await?;
Ok(false)
}