Now altering messages where possible
This commit is contained in:
parent
426a4736ce
commit
5c14a77f29
8
Cargo.lock
generated
8
Cargo.lock
generated
@ -2118,18 +2118,18 @@ checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.176"
|
||||
version = "1.0.177"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc"
|
||||
checksum = "63ba2516aa6bf82e0b19ca8b50019d52df58455d3cf9bdaf6315225fdd0c560a"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.176"
|
||||
version = "1.0.177"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a4e7b8c5dc823e3b90651ff1d3808419cd14e5ad76de04feaf37da114e7a306f"
|
||||
checksum = "401797fe7833d72109fedec6bfcbe67c0eed9b99772f26eb8afd261f0abc6fd3"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
@ -8,22 +8,23 @@ async fn get_master_pass(
|
||||
msg: Message,
|
||||
db: DatabaseConnection,
|
||||
dialogue: MainDialogue,
|
||||
ids: MessageIds,
|
||||
mut ids: MessageIds,
|
||||
name: String,
|
||||
login: String,
|
||||
password: String,
|
||||
master_pass: String,
|
||||
) -> crate::Result<()> {
|
||||
ids.delete(&bot).await;
|
||||
let user_id = msg.from().ok_or(NoUserInfo)?.id.0;
|
||||
dialogue.exit().await?;
|
||||
|
||||
let user_id = msg.from().ok_or(NoUserInfo)?.id.0;
|
||||
|
||||
let account = spawn_blocking(move || {
|
||||
account::ActiveModel::from_unencrypted(user_id, name, &login, &password, &master_pass)
|
||||
})
|
||||
.await??;
|
||||
account.insert(&db).await?;
|
||||
bot.send_message(msg.chat.id, "Success")
|
||||
.reply_markup(deletion_markup())
|
||||
|
||||
ids.alter_message(&bot, "Success", deletion_markup(), None)
|
||||
.await?;
|
||||
Ok(())
|
||||
}
|
||||
|
@ -7,18 +7,23 @@ async fn get_master_pass(
|
||||
msg: Message,
|
||||
db: DatabaseConnection,
|
||||
dialogue: MainDialogue,
|
||||
ids: MessageIds,
|
||||
mut ids: MessageIds,
|
||||
name: String,
|
||||
_: String,
|
||||
) -> crate::Result<()> {
|
||||
ids.delete(&bot).await;
|
||||
dialogue.exit().await?;
|
||||
|
||||
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?;
|
||||
|
||||
ids.alter_message(
|
||||
&bot,
|
||||
"The account is successfully deleted",
|
||||
deletion_markup(),
|
||||
None,
|
||||
)
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -10,10 +10,9 @@ async fn get_master_pass(
|
||||
msg: Message,
|
||||
db: DatabaseConnection,
|
||||
dialogue: MainDialogue,
|
||||
ids: MessageIds,
|
||||
mut ids: MessageIds,
|
||||
_: String,
|
||||
) -> crate::Result<()> {
|
||||
ids.delete(&bot).await;
|
||||
dialogue.exit().await?;
|
||||
let user_id = msg.from().ok_or(NoUserInfo)?.id.0;
|
||||
let txn = db.begin().await?;
|
||||
@ -32,8 +31,7 @@ async fn get_master_pass(
|
||||
"Something went wrong. Try again later"
|
||||
}
|
||||
};
|
||||
bot.send_message(msg.chat.id, text)
|
||||
.reply_markup(deletion_markup())
|
||||
ids.alter_message(&bot, text, deletion_markup(), None)
|
||||
.await?;
|
||||
Ok(())
|
||||
}
|
||||
|
@ -26,6 +26,8 @@ async fn get_master_pass(
|
||||
ids: MessageIds,
|
||||
master_pass: String,
|
||||
) -> crate::Result<()> {
|
||||
dialogue.exit().await?;
|
||||
|
||||
ids.delete(&bot).await;
|
||||
let user_id = msg.from().ok_or(NoUserInfo)?.id.0;
|
||||
let mut accounts = Vec::new();
|
||||
@ -51,7 +53,6 @@ async fn get_master_pass(
|
||||
bot.send_document(msg.chat.id, file)
|
||||
.reply_markup(deletion_markup())
|
||||
.await?;
|
||||
dialogue.exit().await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -8,14 +8,14 @@ async fn get_master_pass(
|
||||
msg: Message,
|
||||
db: DatabaseConnection,
|
||||
dialogue: MainDialogue,
|
||||
ids: MessageIds,
|
||||
mut ids: MessageIds,
|
||||
name: String,
|
||||
master_pass: String,
|
||||
) -> crate::Result<()> {
|
||||
ids.delete(&bot).await;
|
||||
dialogue.exit().await?;
|
||||
|
||||
let user_id = msg.from().ok_or(NoUserInfo)?.id.0;
|
||||
|
||||
let account = match Account::get(user_id, &name, &db).await? {
|
||||
Some(account) => account,
|
||||
None => {
|
||||
@ -25,11 +25,11 @@ async fn get_master_pass(
|
||||
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)
|
||||
let text = format!("Name:\n`{name}`\nLogin:\n`{login}`\nPassword:\n`{password}`");
|
||||
|
||||
ids.alter_message(&bot, text, deletion_markup(), ParseMode::MarkdownV2)
|
||||
.await?;
|
||||
Ok(())
|
||||
}
|
||||
|
@ -31,11 +31,12 @@ async fn get_master_pass(
|
||||
msg: Message,
|
||||
db: DatabaseConnection,
|
||||
dialogue: MainDialogue,
|
||||
ids: MessageIds,
|
||||
mut ids: MessageIds,
|
||||
user: User,
|
||||
master_pass: String,
|
||||
) -> crate::Result<()> {
|
||||
ids.delete(&bot).await;
|
||||
dialogue.exit().await?;
|
||||
|
||||
let user_id = msg.from().ok_or(NoUserInfo)?.id.0;
|
||||
let mut failed = Vec::new();
|
||||
|
||||
@ -50,7 +51,7 @@ async fn get_master_pass(
|
||||
.await;
|
||||
}
|
||||
|
||||
let message = if failed.is_empty() {
|
||||
let text = if failed.is_empty() {
|
||||
"Success".to_owned()
|
||||
} else {
|
||||
format!(
|
||||
@ -58,10 +59,8 @@ async fn get_master_pass(
|
||||
failed.into_iter().format("\n")
|
||||
)
|
||||
};
|
||||
bot.send_message(msg.chat.id, message)
|
||||
.reply_markup(deletion_markup())
|
||||
ids.alter_message(&bot, text, deletion_markup(), None)
|
||||
.await?;
|
||||
dialogue.exit().await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -7,10 +7,9 @@ async fn get_master_pass(
|
||||
msg: Message,
|
||||
db: DatabaseConnection,
|
||||
dialogue: MainDialogue,
|
||||
ids: MessageIds,
|
||||
mut ids: MessageIds,
|
||||
master_pass: String,
|
||||
) -> crate::Result<()> {
|
||||
ids.delete(&bot).await;
|
||||
dialogue.exit().await?;
|
||||
|
||||
let user_id = msg.from().ok_or(NoUserInfo)?.id.0;
|
||||
@ -18,8 +17,7 @@ async fn get_master_pass(
|
||||
spawn_blocking(move || master_pass::ActiveModel::from_unencrypted(user_id, &master_pass))
|
||||
.await?;
|
||||
model.insert(&db).await?;
|
||||
bot.send_message(msg.chat.id, "Success")
|
||||
.reply_markup(deletion_markup())
|
||||
ids.alter_message(&bot, "Success", deletion_markup(), None)
|
||||
.await?;
|
||||
Ok(())
|
||||
}
|
||||
@ -44,7 +42,7 @@ pub async fn set_master_pass(
|
||||
|
||||
change_state!(
|
||||
dialogue,
|
||||
previous,
|
||||
&previous,
|
||||
(),
|
||||
State::GetNewMasterPass,
|
||||
get_master_pass
|
||||
|
@ -4,7 +4,7 @@ macro_rules! change_state {
|
||||
$dialogue
|
||||
.update($next_state(Handler::new(
|
||||
move |bot, msg, db, dialogue, ids, param| Box::pin($next_func(bot, msg, db, dialogue, ids, $($param,)* param)),
|
||||
&$previous,
|
||||
$previous,
|
||||
)))
|
||||
.await?;
|
||||
Ok(())
|
||||
@ -22,7 +22,7 @@ macro_rules! first_handler {
|
||||
) -> $crate::Result<()> {
|
||||
let previous = bot.send_message(msg.chat.id, $message).await?;
|
||||
|
||||
$crate::change_state!(dialogue, previous, (), $next_state, $next_func)
|
||||
$crate::change_state!(dialogue, &previous, (), $next_state, $next_func)
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -37,14 +37,12 @@ macro_rules! handler {
|
||||
msg: Message,
|
||||
_: DatabaseConnection,
|
||||
dialogue: MainDialogue,
|
||||
ids: MessageIds,
|
||||
mut ids: MessageIds,
|
||||
$($param: $type),*
|
||||
) -> $crate::Result<()> {
|
||||
ids.delete(&bot).await;
|
||||
ids.alter_message(&bot, $message, None, None).await?;
|
||||
|
||||
let previous = bot.send_message(msg.chat.id, $message).await?;
|
||||
|
||||
$crate::change_state!(dialogue, previous, ($($param),*), $next_state, $next_func)
|
||||
$crate::change_state!(dialogue, ids, ($($param),*), $next_state, $next_func)
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -72,7 +70,7 @@ macro_rules! ask_name_handler {
|
||||
.reply_markup(markup)
|
||||
.await?;
|
||||
|
||||
$crate::change_state!(dialogue, previous, (), State::GetExistingName, $next_func)
|
||||
$crate::change_state!(dialogue, &previous, (), State::GetExistingName, $next_func)
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -28,23 +28,28 @@ where
|
||||
let text = match msg.text() {
|
||||
Some(text) => text.trim(),
|
||||
None => {
|
||||
let msg = bot.send_message(msg.chat.id, no_text_message).await?;
|
||||
handler.previous = MessageIds::from(&msg);
|
||||
handler
|
||||
.previous
|
||||
.alter_message(&bot, no_text_message, None, None)
|
||||
.await?;
|
||||
return Ok(());
|
||||
}
|
||||
};
|
||||
|
||||
if text == "/cancel" {
|
||||
dialogue.exit().await?;
|
||||
bot.send_message(msg.chat.id, "Successfully cancelled")
|
||||
.reply_markup(deletion_markup())
|
||||
handler
|
||||
.previous
|
||||
.alter_message(&bot, "Successfully cancelled", deletion_markup(), None)
|
||||
.await?;
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
if let Some(text) = check(&msg, &db, text).await? {
|
||||
let failure_message = bot.send_message(msg.chat.id, text).await?;
|
||||
handler.previous = MessageIds::from(&failure_message);
|
||||
handler
|
||||
.previous
|
||||
.alter_message(&bot, text, None, None)
|
||||
.await?;
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
|
@ -33,8 +33,9 @@ pub async fn get_existing_name(
|
||||
|
||||
if text == "/cancel" {
|
||||
dialogue.exit().await?;
|
||||
bot.send_message(msg.chat.id, "Successfully cancelled")
|
||||
.reply_markup(deletion_markup())
|
||||
handler
|
||||
.previous
|
||||
.alter_message(&bot, "Successfully cancelled", deletion_markup(), None)
|
||||
.await?;
|
||||
return Ok(());
|
||||
}
|
||||
@ -48,12 +49,10 @@ pub async fn get_existing_name(
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let previous = handler.previous;
|
||||
let func = handler.func.take().unwrap();
|
||||
drop(handler);
|
||||
let text = text.to_owned();
|
||||
|
||||
if let Err(err) = func(bot, msg, db, dialogue.clone(), previous, text).await {
|
||||
if let Err(err) = func(bot, msg, db, dialogue.clone(), handler.previous, text).await {
|
||||
let _ = dialogue.exit().await;
|
||||
return Err(err);
|
||||
}
|
||||
|
@ -147,8 +147,9 @@ pub async fn get_user(
|
||||
|
||||
if let Some("/cancel") = msg.text().map(str::trim) {
|
||||
dialogue.exit().await?;
|
||||
bot.send_message(msg.chat.id, "Successfully cancelled")
|
||||
.reply_markup(deletion_markup())
|
||||
handler
|
||||
.previous
|
||||
.alter_message(&bot, "Successfully cancelled", deletion_markup(), None)
|
||||
.await?;
|
||||
return Ok(());
|
||||
}
|
||||
@ -156,8 +157,10 @@ pub async fn get_user(
|
||||
let file = match validate_document(msg.document()) {
|
||||
Ok(document) => &document.file,
|
||||
Err(text) => {
|
||||
let msg = bot.send_message(msg.chat.id, text).await?;
|
||||
handler.previous = MessageIds::from(&msg);
|
||||
handler
|
||||
.previous
|
||||
.alter_message(&bot, text, None, None)
|
||||
.await?;
|
||||
return Ok(());
|
||||
}
|
||||
};
|
||||
@ -175,15 +178,17 @@ pub async fn get_user(
|
||||
let user = match spawn_blocking(move || user_from_vec(data, existing_names)).await? {
|
||||
Ok(Ok(user)) => user,
|
||||
Ok(Err(error_text)) => {
|
||||
let msg = bot.send_message(msg.chat.id, error_text).await?;
|
||||
handler.previous = MessageIds::from(&msg);
|
||||
handler
|
||||
.previous
|
||||
.alter_message(&bot, error_text, None, None)
|
||||
.await?;
|
||||
return Ok(());
|
||||
}
|
||||
Err(_) => {
|
||||
let msg = bot
|
||||
.send_message(msg.chat.id, "Error parsing the json file. Try again")
|
||||
handler
|
||||
.previous
|
||||
.alter_message(&bot, "Error parsing the json file. Try again", None, None)
|
||||
.await?;
|
||||
handler.previous = MessageIds::from(&msg);
|
||||
return Ok(());
|
||||
}
|
||||
};
|
||||
|
@ -1,17 +1,62 @@
|
||||
use crate::prelude::*;
|
||||
use futures::future::BoxFuture;
|
||||
use std::sync::Arc;
|
||||
use teloxide::types::{InlineKeyboardMarkup, MessageId};
|
||||
use tokio::sync::Mutex;
|
||||
use std::{mem, sync::Arc};
|
||||
use teloxide::{
|
||||
requests::HasPayload,
|
||||
types::{InlineKeyboardMarkup, MessageId, ParseMode},
|
||||
RequestError,
|
||||
};
|
||||
use tokio::{join, sync::Mutex};
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
pub struct MessageIds(pub ChatId, pub MessageId);
|
||||
|
||||
impl MessageIds {
|
||||
#[inline]
|
||||
pub async fn delete(&self, bot: &Throttle<Bot>) {
|
||||
pub async fn delete(self, bot: &Throttle<Bot>) {
|
||||
let _ = bot.delete_message(self.0, self.1).await;
|
||||
}
|
||||
|
||||
/// Tries to alter the message or sends a new one
|
||||
///
|
||||
/// # Returns
|
||||
///
|
||||
/// Returns true if the message was edited successfully. Returns false otherwise
|
||||
#[inline]
|
||||
pub async fn alter_message(
|
||||
&mut self,
|
||||
bot: &Throttle<Bot>,
|
||||
text: impl Into<String>,
|
||||
markup: impl Into<Option<InlineKeyboardMarkup>>,
|
||||
parse_mode: impl Into<Option<ParseMode>> + Copy,
|
||||
) -> crate::Result<()> {
|
||||
let mut edit = bot.edit_message_text(self.0, self.1, text);
|
||||
edit.parse_mode = parse_mode.into();
|
||||
|
||||
let mut markup = markup.into();
|
||||
if let Some(markup) = markup {
|
||||
edit = edit.reply_markup(markup)
|
||||
}
|
||||
|
||||
match edit.send_ref().await {
|
||||
Ok(msg) => return Ok(()),
|
||||
Err(RequestError::Api(_)) => (),
|
||||
Err(err) => return Err(err.into()),
|
||||
};
|
||||
|
||||
let text = mem::take(&mut edit.text);
|
||||
markup = mem::take(&mut edit.reply_markup);
|
||||
|
||||
let mut send = bot.send_message(self.0, text);
|
||||
send.payload_mut().parse_mode = parse_mode.into();
|
||||
if let Some(markup) = markup {
|
||||
send = send.reply_markup(markup);
|
||||
}
|
||||
|
||||
let msg = join!(self.delete(bot), send.send()).1?;
|
||||
*self = Self::from(&msg);
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&Message> for MessageIds {
|
||||
|
Loading…
Reference in New Issue
Block a user