//! This module consists of endpoints to handle callbacks mod delete_message; pub use delete_message::delete_message; use crate::errors::InvalidCommand; use base64::{engine::general_purpose::STANDARD_NO_PAD as B64_ENGINE, Engine as _}; use std::str::FromStr; use teloxide::types::{CallbackQuery, Message}; type NameHash = [u8; 32]; #[derive(Clone, Copy)] pub enum AlterableField { Name, Login, Pass, } #[derive(Clone, Copy)] pub enum CallbackCommand { DeleteMessage, Get(NameHash), GetMenu, GetAccounts, Decrypt(NameHash), Hide(NameHash), Alter(NameHash, AlterableField), DeleteAccount(NameHash), } impl CallbackCommand { pub fn from_query(q: CallbackQuery) -> Option { q.message.as_ref()?; q.data.and_then(|text| text.parse().ok()) } } impl FromStr for CallbackCommand { type Err = crate::errors::InvalidCommand; fn from_str(s: &str) -> Result { use AlterableField::*; use CallbackCommand::*; match s { "delete_message" => return Ok(DeleteMessage), "get_menu" => return Ok(GetMenu), "get_accounts" => return Ok(GetAccounts), _ => (), }; let mut substrings = s.split(' '); let (command, name) = match (substrings.next(), substrings.next(), substrings.next()) { (Some(command), Some(name), None) => (command, name), _ => return Err(InvalidCommand::InvalidParams), }; let mut name_arr = [0; 32]; if B64_ENGINE.decode_slice(name, &mut name_arr)? != 32 { return Err(InvalidCommand::OutputTooShort); }; match command { "get" => Ok(Get(name_arr)), "decrypt" => Ok(Decrypt(name_arr)), "hide" => Ok(Hide(name_arr)), "an" => Ok(Alter(name_arr, Name)), "al" => Ok(Alter(name_arr, Login)), "ap" => Ok(Alter(name_arr, Pass)), "delete" => Ok(DeleteAccount(name_arr)), _ => Err(InvalidCommand::InvalidParams), } } }