use crate::prelude::*; use std::sync::Arc; use teloxide::{ dispatching::{dialogue::GetChatId, DpHandlerDescription}, dptree::Handler, types::User, }; pub trait GetUserInfo: GetChatId + Clone + Send + Sync + 'static { fn user(&self) -> Option<&User>; } impl GetUserInfo for Message { fn user(&self) -> Option<&User> { self.from() } } impl GetUserInfo for CallbackQuery { fn user(&self) -> Option<&User> { Some(&self.from) } } /// A wierd filter that checks for the existance of a master password. /// /// # Returns /// /// Returns None if account exists, Some(None) if there's an account and Some(Some(String)) if an error occures. /// The String represents the error that occured #[inline] async fn master_pass_exists( msg: T, db: DatabaseConnection, ) -> Option>> { msg.chat_id()?; let user_id = match msg.user() { Some(user) => user.id.0, None => return Some(Some(Arc::new(NoUserInfo))), }; match MasterPass::exists(user_id, &db).await { Ok(true) => None, Ok(false) => Some(None), Err(err) => Some(Some(Arc::new(err))), } } #[inline] async fn notify_about_no_master_pass( bot: Throttle, result: Option>, msg: T, ) -> crate::Result<()> { if let Some(error) = result { return Err(error.into()); } bot.send_message( msg.chat_id().unwrap(), "No master password set. Use /set_master_pass to set it", ) .reply_markup(deletion_markup()) .await?; Ok(()) } /// Gets a handler that filters out the messages of users that don't have a master password set #[inline] pub fn get_handler( ) -> Handler<'static, DependencyMap, crate::Result<()>, DpHandlerDescription> { dptree::filter_map_async(master_pass_exists::).endpoint(notify_about_no_master_pass::) }