77 lines
2.0 KiB
Rust

//! 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<Self> {
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<Self, Self::Err> {
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),
}
}
}