mirror of
https://github.com/flibusta-apps/book_bot.git
synced 2025-12-06 15:35:35 +01:00
Refactor
This commit is contained in:
74
src/bots/approved_bot/modules/search/callback_data.rs
Normal file
74
src/bots/approved_bot/modules/search/callback_data.rs
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
use regex::Regex;
|
||||||
|
use strum_macros::EnumIter;
|
||||||
|
|
||||||
|
use crate::bots::approved_bot::modules::utils::GetPaginationCallbackData;
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(Clone, EnumIter)]
|
||||||
|
pub enum SearchCallbackData {
|
||||||
|
Book { page: u32 },
|
||||||
|
Authors { page: u32 },
|
||||||
|
Sequences { page: u32 },
|
||||||
|
Translators { page: u32 },
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ToString for SearchCallbackData {
|
||||||
|
fn to_string(&self) -> String {
|
||||||
|
match self {
|
||||||
|
SearchCallbackData::Book { page } => format!("sb_{page}"),
|
||||||
|
SearchCallbackData::Authors { page } => format!("sa_{page}"),
|
||||||
|
SearchCallbackData::Sequences { page } => format!("ss_{page}"),
|
||||||
|
SearchCallbackData::Translators { page } => format!("st_{page}"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for SearchCallbackData {
|
||||||
|
type Err = strum::ParseError;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
let re = Regex::new(r"^(?P<search_type>s[a|b|s|t])_(?P<page>\d+)$").unwrap();
|
||||||
|
|
||||||
|
let caps = re.captures(s);
|
||||||
|
let caps = match caps {
|
||||||
|
Some(v) => v,
|
||||||
|
None => return Err(strum::ParseError::VariantNotFound),
|
||||||
|
};
|
||||||
|
|
||||||
|
let search_type = &caps["search_type"];
|
||||||
|
let page: u32 = caps["page"].parse::<u32>().unwrap();
|
||||||
|
|
||||||
|
// Fix for migrate from old bot implementation
|
||||||
|
let page: u32 = std::cmp::max(1, page);
|
||||||
|
|
||||||
|
match search_type {
|
||||||
|
"sb" => Ok(SearchCallbackData::Book { page }),
|
||||||
|
"sa" => Ok(SearchCallbackData::Authors { page }),
|
||||||
|
"ss" => Ok(SearchCallbackData::Sequences { page }),
|
||||||
|
"st" => Ok(SearchCallbackData::Translators { page }),
|
||||||
|
_ => Err(strum::ParseError::VariantNotFound),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl GetPaginationCallbackData for SearchCallbackData {
|
||||||
|
fn get_pagination_callback_data(&self, target_page: u32) -> String {
|
||||||
|
match self {
|
||||||
|
SearchCallbackData::Book { .. } => {
|
||||||
|
SearchCallbackData::Book { page: target_page }
|
||||||
|
}
|
||||||
|
SearchCallbackData::Authors { .. } => {
|
||||||
|
SearchCallbackData::Authors { page: target_page }
|
||||||
|
}
|
||||||
|
SearchCallbackData::Sequences { .. } => {
|
||||||
|
SearchCallbackData::Sequences { page: target_page }
|
||||||
|
}
|
||||||
|
SearchCallbackData::Translators { .. } => {
|
||||||
|
SearchCallbackData::Translators { page: target_page }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.to_string()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,9 @@
|
|||||||
use core::fmt::Debug;
|
pub mod callback_data;
|
||||||
use std::str::FromStr;
|
|
||||||
|
|
||||||
|
use core::fmt::Debug;
|
||||||
use smartstring::alias::String as SmartString;
|
use smartstring::alias::String as SmartString;
|
||||||
|
|
||||||
use regex::Regex;
|
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
use strum_macros::EnumIter;
|
|
||||||
use teloxide::{
|
use teloxide::{
|
||||||
prelude::*,
|
prelude::*,
|
||||||
types::{InlineKeyboardButton, InlineKeyboardMarkup}, dispatching::dialogue::GetChatId, adaptors::{Throttle, CacheMe},
|
types::{InlineKeyboardButton, InlineKeyboardMarkup}, dispatching::dialogue::GetChatId, adaptors::{Throttle, CacheMe},
|
||||||
@@ -25,74 +23,10 @@ use crate::bots::{
|
|||||||
BotHandlerInternal,
|
BotHandlerInternal,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::utils::{generic_get_pagination_keyboard, GetPaginationCallbackData};
|
use self::callback_data::SearchCallbackData;
|
||||||
|
|
||||||
#[derive(Clone, EnumIter)]
|
use super::utils::generic_get_pagination_keyboard;
|
||||||
pub enum SearchCallbackData {
|
|
||||||
Book { page: u32 },
|
|
||||||
Authors { page: u32 },
|
|
||||||
Sequences { page: u32 },
|
|
||||||
Translators { page: u32 },
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ToString for SearchCallbackData {
|
|
||||||
fn to_string(&self) -> String {
|
|
||||||
match self {
|
|
||||||
SearchCallbackData::Book { page } => format!("sb_{page}"),
|
|
||||||
SearchCallbackData::Authors { page } => format!("sa_{page}"),
|
|
||||||
SearchCallbackData::Sequences { page } => format!("ss_{page}"),
|
|
||||||
SearchCallbackData::Translators { page } => format!("st_{page}"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FromStr for SearchCallbackData {
|
|
||||||
type Err = strum::ParseError;
|
|
||||||
|
|
||||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
||||||
let re = Regex::new(r"^(?P<search_type>s[a|b|s|t])_(?P<page>\d+)$").unwrap();
|
|
||||||
|
|
||||||
let caps = re.captures(s);
|
|
||||||
let caps = match caps {
|
|
||||||
Some(v) => v,
|
|
||||||
None => return Err(strum::ParseError::VariantNotFound),
|
|
||||||
};
|
|
||||||
|
|
||||||
let search_type = &caps["search_type"];
|
|
||||||
let page: u32 = caps["page"].parse::<u32>().unwrap();
|
|
||||||
|
|
||||||
// Fix for migrate from old bot implementation
|
|
||||||
let page: u32 = std::cmp::max(1, page);
|
|
||||||
|
|
||||||
match search_type {
|
|
||||||
"sb" => Ok(SearchCallbackData::Book { page }),
|
|
||||||
"sa" => Ok(SearchCallbackData::Authors { page }),
|
|
||||||
"ss" => Ok(SearchCallbackData::Sequences { page }),
|
|
||||||
"st" => Ok(SearchCallbackData::Translators { page }),
|
|
||||||
_ => Err(strum::ParseError::VariantNotFound),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl GetPaginationCallbackData for SearchCallbackData {
|
|
||||||
fn get_pagination_callback_data(&self, target_page: u32) -> String {
|
|
||||||
match self {
|
|
||||||
SearchCallbackData::Book { .. } => {
|
|
||||||
SearchCallbackData::Book { page: target_page }
|
|
||||||
}
|
|
||||||
SearchCallbackData::Authors { .. } => {
|
|
||||||
SearchCallbackData::Authors { page: target_page }
|
|
||||||
}
|
|
||||||
SearchCallbackData::Sequences { .. } => {
|
|
||||||
SearchCallbackData::Sequences { page: target_page }
|
|
||||||
}
|
|
||||||
SearchCallbackData::Translators { .. } => {
|
|
||||||
SearchCallbackData::Translators { page: target_page }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.to_string()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_query(cq: CallbackQuery) -> Option<String> {
|
fn get_query(cq: CallbackQuery) -> Option<String> {
|
||||||
cq.message
|
cq.message
|
||||||
@@ -109,6 +43,7 @@ fn get_query(cq: CallbackQuery) -> Option<String> {
|
|||||||
.unwrap_or(None)
|
.unwrap_or(None)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async fn generic_search_pagination_handler<T, P, Fut>(
|
async fn generic_search_pagination_handler<T, P, Fut>(
|
||||||
cq: CallbackQuery,
|
cq: CallbackQuery,
|
||||||
bot: CacheMe<Throttle<Bot>>,
|
bot: CacheMe<Throttle<Bot>>,
|
||||||
Reference in New Issue
Block a user