diff --git a/Cargo.lock b/Cargo.lock index d743b99..ceecc04 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -57,9 +57,9 @@ checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "anyhow" -version = "1.0.82" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" +checksum = "25bdb32cbbdce2b519a9cd7df3a678443100e265d5e25ca763b7572a5104f5f3" dependencies = [ "backtrace", ] @@ -175,9 +175,9 @@ checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" -version = "1.0.96" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "065a29261d53ba54260972629f9ca6bffa69bac13cd1fed61420f7fa68b9f8bd" +checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" [[package]] name = "cfg-if" @@ -578,7 +578,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.61", ] [[package]] @@ -623,9 +623,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -1174,9 +1174,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pbkdf2" @@ -1222,7 +1222,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.61", ] [[package]] @@ -1307,9 +1307,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.81" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" dependencies = [ "unicode-ident", ] @@ -1584,9 +1584,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "salsa20" @@ -1627,9 +1627,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" @@ -1648,7 +1648,7 @@ checksum = "856f046b9400cee3c8c94ed572ecdb752444c24528c035cd35882aad6f492bcb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.61", ] [[package]] @@ -2042,9 +2042,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.60" +version = "2.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +checksum = "c993ed8ccba56ae856363b1845da7266a7cb78e1d146c8a32d54b45a8b831fc9" dependencies = [ "proc-macro2", "quote", @@ -2174,22 +2174,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.59" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" +checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.59" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" +checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.61", ] [[package]] @@ -2244,7 +2244,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.61", ] [[package]] @@ -2307,7 +2307,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.61", ] [[package]] @@ -2525,7 +2525,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.61", "wasm-bindgen-shared", ] @@ -2559,7 +2559,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.61", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2782,22 +2782,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.33" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "087eca3c1eaf8c47b94d02790dd086cd594b912d2043d4de4bfdd466b3befb7c" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.33" +version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f4b6c273f496d8fd4eaf18853e6b448760225dc030ff2c485a786859aea6393" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.61", ] [[package]] diff --git a/src/cryptography/mod.rs b/src/cryptography.rs similarity index 100% rename from src/cryptography/mod.rs rename to src/cryptography.rs diff --git a/src/dispatching.rs b/src/dispatching.rs new file mode 100644 index 0000000..5bcff94 --- /dev/null +++ b/src/dispatching.rs @@ -0,0 +1,80 @@ +mod default; +mod delete_mesage_handler; +mod filter_user_info; +mod master_password_check; + +use crate::{ + callbacks::{self, CallbackCommand}, + commands::{self, Command}, + errors, locales, + prelude::*, + state::{self, State}, +}; +use teloxide::{ + adaptors::throttle::Limits, + dispatching::{dialogue::InMemStorage, filter_command, DefaultKey}, + dptree::{case, deps}, +}; + +pub fn get_dispatcher( + token: String, + db: Pool, +) -> Dispatcher, crate::Error, DefaultKey> { + let bot = Bot::new(token).throttle(Limits::default()); + + let command_handler = filter_command::() + .branch(case![Command::Start].endpoint(commands::start)) + .branch(case![Command::Help].endpoint(commands::help)) + .branch(case![Command::SetMasterPass].endpoint(commands::set_master_pass)) + .branch(case![Command::GenPassword].endpoint(commands::gen_password)) + .branch(case![Command::Cancel].endpoint(commands::cancel)) + // This branch filters out the users that don't have a master password set + .branch(master_password_check::get_handler()) + .branch(case![Command::Menu].endpoint(commands::menu)) + .branch(case![Command::AddAccount].endpoint(commands::add_account)) + .branch(case![Command::GetAccount].endpoint(commands::get_account)) + .branch(case![Command::GetAccounts].endpoint(commands::get_accounts)) + .branch(case![Command::Delete].endpoint(commands::delete)) + .branch(case![Command::DeleteAll].endpoint(commands::delete_all)) + .branch(case![Command::Export].endpoint(commands::export)) + .branch(case![Command::Import].endpoint(commands::import)) + .chain(case![Command::ChangeLanguage].endpoint(commands::change_language)); + + let message_handler = Update::filter_message() + .map_async(delete_mesage_handler::delete_message) + // Filters out the messages without user information + .branch(filter_user_info::get_handler()) + .branch(case![State::GetNewName(next)].endpoint(state::get_new_name)) + .branch(case![State::GetMasterPass(next)].endpoint(state::get_master_pass)) + .branch(case![State::GetNewMasterPass(next)].endpoint(state::get_new_master_pass)) + .branch(case![State::GetLogin(next)].endpoint(state::get_login)) + .branch(case![State::GetPassword(next)].endpoint(state::get_password)) + .branch(case![State::GetUser(next)].endpoint(state::get_user)) + .branch(command_handler) + .endpoint(default::default); + + let callback_handler = Update::filter_callback_query() + .filter_map(CallbackCommand::from_query) + .branch(case![CallbackCommand::DeleteMessage].endpoint(callbacks::delete_message)) + .branch(master_password_check::get_handler()) + .branch(case![CallbackCommand::GetMenu].endpoint(callbacks::get_menu)) + .branch(case![CallbackCommand::Get(hash)].endpoint(callbacks::get)) + .branch(case![CallbackCommand::Decrypt(hash)].endpoint(callbacks::decrypt)) + .branch( + case![CallbackCommand::DeleteAccount { name, is_command }].endpoint(callbacks::delete), + ) + .branch(case![CallbackCommand::Alter(hash, field)].endpoint(callbacks::alter)) + .chain(case![CallbackCommand::ChangeLocale(locale)].endpoint(callbacks::change_locale)); + + let handler = dptree::entry() + .map_async(locales::Locale::from_update) + .enter_dialogue::, State>() + .branch(message_handler) + .chain(callback_handler); + + Dispatcher::builder(bot, handler) + .dependencies(deps![db, InMemStorage::::new()]) + .error_handler(std::sync::Arc::from(errors::ErrorHandler)) + .enable_ctrlc_handler() + .build() +} diff --git a/src/default.rs b/src/dispatching/default.rs similarity index 100% rename from src/default.rs rename to src/dispatching/default.rs diff --git a/src/delete_mesage_handler.rs b/src/dispatching/delete_mesage_handler.rs similarity index 100% rename from src/delete_mesage_handler.rs rename to src/dispatching/delete_mesage_handler.rs diff --git a/src/filter_user_info.rs b/src/dispatching/filter_user_info.rs similarity index 90% rename from src/filter_user_info.rs rename to src/dispatching/filter_user_info.rs index 497bfa5..e959c62 100644 --- a/src/filter_user_info.rs +++ b/src/dispatching/filter_user_info.rs @@ -8,7 +8,6 @@ fn has_no_user_info(msg: Message) -> bool { } #[inline] -#[allow(clippy::significant_drop_tightening)] async fn notify_about_no_user_info( bot: Throttle, msg: Message, @@ -28,15 +27,17 @@ async fn notify_about_no_user_info( | State::GetNewMasterPass(handler) | State::GetLogin(handler) | State::GetPassword(handler) => { - let mut handler = handler.lock().await; handler + .lock() + .await .previous .alter_message(&bot, text, None, None) .await?; } State::GetUser(handler) => { - let mut handler = handler.lock().await; handler + .lock() + .await .previous .alter_message(&bot, text, None, None) .await?; diff --git a/src/master_password_check.rs b/src/dispatching/master_password_check.rs similarity index 100% rename from src/master_password_check.rs rename to src/dispatching/master_password_check.rs diff --git a/src/entity/mod.rs b/src/entity.rs similarity index 100% rename from src/entity/mod.rs rename to src/entity.rs diff --git a/src/main.rs b/src/main.rs index 80fb2a2..3cedf0f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,99 +1,18 @@ mod callbacks; mod commands; mod cryptography; -mod default; -mod delete_mesage_handler; +mod dispatching; mod entity; mod errors; -mod filter_user_info; mod locales; mod macros; mod markups; -mod master_password_check; mod models; mod prelude; mod state; use anyhow::{Error, Result}; -fn get_dispatcher( - token: String, - db: prelude::Pool, -) -> teloxide::prelude::Dispatcher< - teloxide::adaptors::Throttle, - crate::Error, - teloxide::dispatching::DefaultKey, -> { - use callbacks::CallbackCommand; - use commands::Command; - use state::State; - use teloxide::{ - adaptors::throttle::Limits, - dispatching::dialogue::InMemStorage, - dptree::{case, deps}, - filter_command, - prelude::*, - }; - - let bot = Bot::new(token).throttle(Limits::default()); - - let command_handler = filter_command::() - .branch(case![Command::Start].endpoint(commands::start)) - .branch(case![Command::Help].endpoint(commands::help)) - .branch(case![Command::SetMasterPass].endpoint(commands::set_master_pass)) - .branch(case![Command::GenPassword].endpoint(commands::gen_password)) - .branch(case![Command::Cancel].endpoint(commands::cancel)) - // This branch filters out the users that don't have a master password set - .branch(master_password_check::get_handler()) - .branch(case![Command::Menu].endpoint(commands::menu)) - .branch(case![Command::AddAccount].endpoint(commands::add_account)) - .branch(case![Command::GetAccount].endpoint(commands::get_account)) - .branch(case![Command::GetAccounts].endpoint(commands::get_accounts)) - .branch(case![Command::Delete].endpoint(commands::delete)) - .branch(case![Command::DeleteAll].endpoint(commands::delete_all)) - .branch(case![Command::Export].endpoint(commands::export)) - .branch(case![Command::Import].endpoint(commands::import)) - .branch(case![Command::ChangeLanguage].endpoint(commands::change_language)); - - let message_handler = Update::filter_message() - .map_async(delete_mesage_handler::delete_message) - // Filters out the messages without user information - .branch(filter_user_info::get_handler()) - .branch(case![State::GetNewName(next)].endpoint(state::get_new_name)) - .branch(case![State::GetMasterPass(next)].endpoint(state::get_master_pass)) - .branch(case![State::GetNewMasterPass(next)].endpoint(state::get_new_master_pass)) - .branch(case![State::GetLogin(next)].endpoint(state::get_login)) - .branch(case![State::GetPassword(next)].endpoint(state::get_password)) - .branch(case![State::GetUser(next)].endpoint(state::get_user)) - .branch(command_handler) - .endpoint(default::default); - - let callback_handler = Update::filter_callback_query() - .filter_map(CallbackCommand::from_query) - .branch(case![CallbackCommand::DeleteMessage].endpoint(callbacks::delete_message)) - .branch(master_password_check::get_handler()) - .branch(case![CallbackCommand::GetMenu].endpoint(callbacks::get_menu)) - .branch(case![CallbackCommand::Get(hash)].endpoint(callbacks::get)) - .branch(case![CallbackCommand::Decrypt(hash)].endpoint(callbacks::decrypt)) - .branch( - case![CallbackCommand::DeleteAccount { name, is_command }].endpoint(callbacks::delete), - ) - .branch(case![CallbackCommand::Alter(hash, field)].endpoint(callbacks::alter)) - .branch(case![CallbackCommand::ChangeLocale(locale)].endpoint(callbacks::change_locale)); - - let handler = dptree::entry() - .map_async(locales::Locale::from_update) - .enter_dialogue::, State>() - .branch(message_handler) - .branch(callback_handler); - - Dispatcher::builder(bot, handler) - .dependencies(deps![db, InMemStorage::::new()]) - .error_handler(std::sync::Arc::from(errors::ErrorHandler)) - .enable_ctrlc_handler() - .build() -} - #[tokio::main] async fn main() -> Result<()> { use std::env; @@ -109,6 +28,6 @@ async fn main() -> Result<()> { entity::migrate(&pool).await?; - get_dispatcher(token, pool).dispatch().await; + dispatching::get_dispatcher(token, pool).dispatch().await; Ok(()) }