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:
20
Cargo.lock
generated
20
Cargo.lock
generated
@@ -215,7 +215,7 @@ dependencies = [
|
|||||||
"tokio-stream",
|
"tokio-stream",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
"tower",
|
"tower",
|
||||||
"tower-http 0.4.3",
|
"tower-http 0.4.4",
|
||||||
"tracing",
|
"tracing",
|
||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
"url",
|
"url",
|
||||||
@@ -287,9 +287,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "chrono"
|
name = "chrono"
|
||||||
version = "0.4.27"
|
version = "0.4.28"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f56b4c72906975ca04becb8a30e102dfecddd0c06181e3e95ddc444be28881f8"
|
checksum = "95ed24df0632f708f5f6d8082675bef2596f7084dee3dd55f632290bf35bfe0f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"android-tzdata",
|
"android-tzdata",
|
||||||
"iana-time-zone",
|
"iana-time-zone",
|
||||||
@@ -1005,9 +1005,9 @@ checksum = "ed1202b2a6f884ae56f04cff409ab315c5ce26b5e58d7412e484f01fd52f52ef"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memchr"
|
name = "memchr"
|
||||||
version = "2.6.1"
|
version = "2.6.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f478948fd84d9f8e86967bf432640e46adfb5a4bd4f14ef7e864ab38220534ae"
|
checksum = "5486aed0026218e61b8a01d5fbd5a0a134649abb71a0e53b7bc088529dced86e"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memoffset"
|
name = "memoffset"
|
||||||
@@ -1555,9 +1555,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustix"
|
name = "rustix"
|
||||||
version = "0.38.10"
|
version = "0.38.11"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ed6248e1caa625eb708e266e06159f135e8c26f2bb7ceb72dc4b2766d0340964"
|
checksum = "c0c3dde1fc030af041adc40e79c0e7fbcf431dd24870053d187d7c66e4b87453"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.4.0",
|
"bitflags 2.4.0",
|
||||||
"errno",
|
"errno",
|
||||||
@@ -2062,7 +2062,7 @@ dependencies = [
|
|||||||
"cfg-if",
|
"cfg-if",
|
||||||
"fastrand 2.0.0",
|
"fastrand 2.0.0",
|
||||||
"redox_syscall",
|
"redox_syscall",
|
||||||
"rustix 0.38.10",
|
"rustix 0.38.11",
|
||||||
"windows-sys",
|
"windows-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -2263,9 +2263,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tower-http"
|
name = "tower-http"
|
||||||
version = "0.4.3"
|
version = "0.4.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "55ae70283aba8d2a8b411c695c437fe25b8b5e44e23e780662002fc72fb47a82"
|
checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.4.0",
|
"bitflags 2.4.0",
|
||||||
"bytes",
|
"bytes",
|
||||||
|
|||||||
61
src/bots/approved_bot/modules/book/callback_data.rs
Normal file
61
src/bots/approved_bot/modules/book/callback_data.rs
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
#[derive(Clone)]
|
||||||
|
pub enum BookCallbackData {
|
||||||
|
Author { id: u32, page: u32 },
|
||||||
|
Translator { id: u32, page: u32 },
|
||||||
|
Sequence { id: u32, page: u32 },
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for BookCallbackData {
|
||||||
|
type Err = strum::ParseError;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
let re = Regex::new(r"^b(?P<an_type>a|t|s)_(?P<id>\d+)_(?P<page>\d+)$").unwrap();
|
||||||
|
|
||||||
|
let caps = re.captures(s);
|
||||||
|
let caps = match caps {
|
||||||
|
Some(v) => v,
|
||||||
|
None => return Err(strum::ParseError::VariantNotFound),
|
||||||
|
};
|
||||||
|
|
||||||
|
let annotation_type = &caps["an_type"];
|
||||||
|
let id = caps["id"].parse::<u32>().unwrap();
|
||||||
|
let page = caps["page"].parse::<u32>().unwrap();
|
||||||
|
|
||||||
|
match annotation_type {
|
||||||
|
"a" => Ok(BookCallbackData::Author { id, page }),
|
||||||
|
"t" => Ok(BookCallbackData::Translator { id, page }),
|
||||||
|
"s" => Ok(BookCallbackData::Sequence { id, page }),
|
||||||
|
_ => Err(strum::ParseError::VariantNotFound),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ToString for BookCallbackData {
|
||||||
|
fn to_string(&self) -> String {
|
||||||
|
match self {
|
||||||
|
BookCallbackData::Author { id, page } => format!("ba_{id}_{page}"),
|
||||||
|
BookCallbackData::Translator { id, page } => format!("bt_{id}_{page}"),
|
||||||
|
BookCallbackData::Sequence { id, page } => format!("bs_{id}_{page}"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl GetPaginationCallbackData for BookCallbackData {
|
||||||
|
fn get_pagination_callback_data(&self, target_page: u32) -> String {
|
||||||
|
match self {
|
||||||
|
BookCallbackData::Author { id, .. } => BookCallbackData::Author {
|
||||||
|
id: *id,
|
||||||
|
page: target_page,
|
||||||
|
},
|
||||||
|
BookCallbackData::Translator { id, .. } => BookCallbackData::Translator {
|
||||||
|
id: *id,
|
||||||
|
page: target_page,
|
||||||
|
},
|
||||||
|
BookCallbackData::Sequence { id, .. } => BookCallbackData::Sequence {
|
||||||
|
id: *id,
|
||||||
|
page: target_page,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
.to_string()
|
||||||
|
}
|
||||||
|
}
|
||||||
36
src/bots/approved_bot/modules/book/commands.rs
Normal file
36
src/bots/approved_bot/modules/book/commands.rs
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
use regex::Regex;
|
||||||
|
|
||||||
|
use crate::bots::approved_bot::modules::utils::CommandParse;
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub enum BookCommand {
|
||||||
|
Author { id: u32 },
|
||||||
|
Translator { id: u32 },
|
||||||
|
Sequence { id: u32 },
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CommandParse<Self> for BookCommand {
|
||||||
|
fn parse(s: &str, bot_name: &str) -> Result<Self, strum::ParseError> {
|
||||||
|
let re = Regex::new(r"^/(?P<an_type>a|t|s)_(?P<id>\d+)$").unwrap();
|
||||||
|
|
||||||
|
let full_bot_name = format!("@{bot_name}");
|
||||||
|
let after_replace = s.replace(&full_bot_name, "");
|
||||||
|
|
||||||
|
let caps = re.captures(&after_replace);
|
||||||
|
let caps = match caps {
|
||||||
|
Some(v) => v,
|
||||||
|
None => return Err(strum::ParseError::VariantNotFound),
|
||||||
|
};
|
||||||
|
|
||||||
|
let annotation_type = &caps["an_type"];
|
||||||
|
let id: u32 = caps["id"].parse().unwrap();
|
||||||
|
|
||||||
|
match annotation_type {
|
||||||
|
"a" => Ok(BookCommand::Author { id }),
|
||||||
|
"t" => Ok(BookCommand::Translator { id }),
|
||||||
|
"s" => Ok(BookCommand::Sequence { id }),
|
||||||
|
_ => Err(strum::ParseError::VariantNotFound),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
pub mod commands;
|
||||||
|
pub mod callback_data;
|
||||||
|
|
||||||
use core::fmt::Debug;
|
use core::fmt::Debug;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
@@ -19,103 +22,12 @@ use crate::bots::approved_bot::{
|
|||||||
tools::filter_callback_query,
|
tools::filter_callback_query,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use self::commands::BookCommand;
|
||||||
|
|
||||||
use super::utils::{
|
use super::utils::{
|
||||||
filter_command, generic_get_pagination_keyboard, CommandParse, GetPaginationCallbackData,
|
filter_command, generic_get_pagination_keyboard, GetPaginationCallbackData,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Clone)]
|
|
||||||
pub enum BookCommand {
|
|
||||||
Author { id: u32 },
|
|
||||||
Translator { id: u32 },
|
|
||||||
Sequence { id: u32 },
|
|
||||||
}
|
|
||||||
|
|
||||||
impl CommandParse<Self> for BookCommand {
|
|
||||||
fn parse(s: &str, bot_name: &str) -> Result<Self, strum::ParseError> {
|
|
||||||
let re = Regex::new(r"^/(?P<an_type>a|t|s)_(?P<id>\d+)$").unwrap();
|
|
||||||
|
|
||||||
let full_bot_name = format!("@{bot_name}");
|
|
||||||
let after_replace = s.replace(&full_bot_name, "");
|
|
||||||
|
|
||||||
let caps = re.captures(&after_replace);
|
|
||||||
let caps = match caps {
|
|
||||||
Some(v) => v,
|
|
||||||
None => return Err(strum::ParseError::VariantNotFound),
|
|
||||||
};
|
|
||||||
|
|
||||||
let annotation_type = &caps["an_type"];
|
|
||||||
let id: u32 = caps["id"].parse().unwrap();
|
|
||||||
|
|
||||||
match annotation_type {
|
|
||||||
"a" => Ok(BookCommand::Author { id }),
|
|
||||||
"t" => Ok(BookCommand::Translator { id }),
|
|
||||||
"s" => Ok(BookCommand::Sequence { id }),
|
|
||||||
_ => Err(strum::ParseError::VariantNotFound),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone)]
|
|
||||||
pub enum BookCallbackData {
|
|
||||||
Author { id: u32, page: u32 },
|
|
||||||
Translator { id: u32, page: u32 },
|
|
||||||
Sequence { id: u32, page: u32 },
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FromStr for BookCallbackData {
|
|
||||||
type Err = strum::ParseError;
|
|
||||||
|
|
||||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
||||||
let re = Regex::new(r"^b(?P<an_type>a|t|s)_(?P<id>\d+)_(?P<page>\d+)$").unwrap();
|
|
||||||
|
|
||||||
let caps = re.captures(s);
|
|
||||||
let caps = match caps {
|
|
||||||
Some(v) => v,
|
|
||||||
None => return Err(strum::ParseError::VariantNotFound),
|
|
||||||
};
|
|
||||||
|
|
||||||
let annotation_type = &caps["an_type"];
|
|
||||||
let id = caps["id"].parse::<u32>().unwrap();
|
|
||||||
let page = caps["page"].parse::<u32>().unwrap();
|
|
||||||
|
|
||||||
match annotation_type {
|
|
||||||
"a" => Ok(BookCallbackData::Author { id, page }),
|
|
||||||
"t" => Ok(BookCallbackData::Translator { id, page }),
|
|
||||||
"s" => Ok(BookCallbackData::Sequence { id, page }),
|
|
||||||
_ => Err(strum::ParseError::VariantNotFound),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ToString for BookCallbackData {
|
|
||||||
fn to_string(&self) -> String {
|
|
||||||
match self {
|
|
||||||
BookCallbackData::Author { id, page } => format!("ba_{id}_{page}"),
|
|
||||||
BookCallbackData::Translator { id, page } => format!("bt_{id}_{page}"),
|
|
||||||
BookCallbackData::Sequence { id, page } => format!("bs_{id}_{page}"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl GetPaginationCallbackData for BookCallbackData {
|
|
||||||
fn get_pagination_callback_data(&self, target_page: u32) -> String {
|
|
||||||
match self {
|
|
||||||
BookCallbackData::Author { id, .. } => BookCallbackData::Author {
|
|
||||||
id: *id,
|
|
||||||
page: target_page,
|
|
||||||
},
|
|
||||||
BookCallbackData::Translator { id, .. } => BookCallbackData::Translator {
|
|
||||||
id: *id,
|
|
||||||
page: target_page,
|
|
||||||
},
|
|
||||||
BookCallbackData::Sequence { id, .. } => BookCallbackData::Sequence {
|
|
||||||
id: *id,
|
|
||||||
page: target_page,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
.to_string()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn send_book_handler<T, P, Fut>(
|
async fn send_book_handler<T, P, Fut>(
|
||||||
message: Message,
|
message: Message,
|
||||||
@@ -28,8 +28,15 @@ fn ignore_channel_messages() -> crate::bots::BotHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn ignore_chat_member_update() -> crate::bots::BotHandler {
|
fn ignore_chat_member_update() -> crate::bots::BotHandler {
|
||||||
Update::filter_chat_member()
|
dptree::entry()
|
||||||
.endpoint(|| async { Ok(()) })
|
.branch(
|
||||||
|
Update::filter_chat_member()
|
||||||
|
.endpoint(|| async { Ok(()) })
|
||||||
|
)
|
||||||
|
.branch(
|
||||||
|
Update::filter_my_chat_member()
|
||||||
|
.endpoint(|| async { Ok(()) })
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_bot_handler() -> (BotHandler, BotCommands) {
|
pub fn get_bot_handler() -> (BotHandler, BotCommands) {
|
||||||
|
|||||||
Reference in New Issue
Block a user