Added new callback types
This commit is contained in:
@ -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)
|
||||
}
|
||||
|
@ -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),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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),
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user