Added new callback types

This commit is contained in:
2023-07-25 17:44:12 +03:00
parent c682fd310b
commit 64a5435dc3
8 changed files with 168 additions and 70 deletions

View File

@ -2,7 +2,7 @@ use crate::prelude::*;
use teloxide::{dispatching::DpHandlerDescription, dptree::Handler};
/// Deletes the message from the callback
async fn run(bot: Throttle<Bot>, q: CallbackQuery) -> crate::Result<()> {
pub async fn delete_message(bot: Throttle<Bot>, q: CallbackQuery) -> crate::Result<()> {
if let Some(msg) = q.message {
if bot.delete_message(msg.chat.id, msg.id).await.is_err() {
bot.send_message(msg.chat.id, "Error deleting the message")
@ -13,14 +13,3 @@ async fn run(bot: Throttle<Bot>, q: CallbackQuery) -> crate::Result<()> {
bot.answer_callback_query(q.id).await?;
Ok(())
}
/// Filters the delete_message callbacks
fn filter(q: CallbackQuery) -> bool {
matches!(q.data.as_deref(), Some("delete_message"))
}
/// Gets a handler for deleting the message
#[inline]
pub fn get_handler() -> Handler<'static, DependencyMap, crate::Result<()>, DpHandlerDescription> {
dptree::filter(filter).endpoint(run)
}

View File

@ -1,3 +1,76 @@
//! This module consists of endpoints to handle callbacks
pub mod delete_message;
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),
}
}
}

View File

@ -5,3 +5,13 @@ pub struct NoUserInfo;
#[derive(thiserror::Error, Debug)]
#[error("Handler was already used")]
pub struct HandlerUsed;
#[derive(thiserror::Error, Debug)]
pub enum InvalidCommand {
#[error("Invalid params")]
InvalidParams,
#[error("Not enough bytes in the name's hash")]
OutputTooShort,
#[error("Error decoding the values: {0}")]
NameDecodingError(#[from] base64::DecodeSliceError),
}

View File

@ -1,3 +1,5 @@
#![allow(unused)]
mod callbacks;
mod commands;
mod default;
@ -18,6 +20,8 @@ use sea_orm::Database;
use std::env;
use teloxide::{adaptors::throttle::Limits, dispatching::dialogue::InMemStorage, filter_command};
use crate::callbacks::CallbackCommand;
fn get_dispatcher(
token: String,
db: DatabaseConnection,
@ -55,8 +59,9 @@ fn get_dispatcher(
.branch(command_handler)
.endpoint(default::default);
let callback_handler =
Update::filter_callback_query().chain(callbacks::delete_message::get_handler());
let callback_handler = Update::filter_callback_query()
.filter_map(CallbackCommand::from_query)
.branch(case![CallbackCommand::DeleteMessage].endpoint(callbacks::delete_message));
let handler = dptree::entry()
.branch(message_handler)

View File

@ -1,4 +1,8 @@
use crate::prelude::*;
use base64::{engine::general_purpose::STANDARD as B64_ENGINE, Engine as _};
use futures::future;
use itertools::Itertools;
use sha2::{Digest, Sha256};
use teloxide::types::{InlineKeyboardButton, InlineKeyboardMarkup, KeyboardButton, KeyboardMarkup};
/// Creates a markup of all user's account names