77 lines
2.0 KiB
Rust
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),
|
|
}
|
|
}
|
|
}
|