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::{DefaultKey, dialogue::InMemStorage, filter_command}, dptree::{case, deps}, }; pub fn get_dispatcher( token: String, db: Pool, ) -> Dispatcher, crate::Error, DefaultKey> { let client = teloxide::net::default_reqwest_settings() .https_only(true) .build() .expect("Failed to create reqwest Client"); let bot = Bot::with_client(token, client).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::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() }