From cddbc362a8f2c48a3fb5a828062454f65bbfc965 Mon Sep 17 00:00:00 2001 From: Guillermo Roche Date: Sun, 4 May 2025 18:27:53 +0200 Subject: [PATCH] Add filter for files --- polesDB | Bin 20480 -> 20480 bytes src/filter_files/action.rs | 18 +++++ src/filter_files/analyce_name.rs | 27 +++++++ src/filter_files/mod.rs | 2 + src/main.rs | 120 ++++++++++++++++--------------- 5 files changed, 111 insertions(+), 56 deletions(-) create mode 100644 src/filter_files/action.rs create mode 100644 src/filter_files/analyce_name.rs create mode 100644 src/filter_files/mod.rs diff --git a/polesDB b/polesDB index f964dfaca18c3b23483f9b55637a4f512a6db3ce..260056f6f3e73fc2c6dce1355d51e330537361c6 100644 GIT binary patch delta 79 zcmZozz}T>Wae_1>*F+g-RxSp;HqDJGVe*V@n|I5*2=FuWGB7YO^S3haU*})P-?~{) ipqyVwotaHhQ OuCoy!q7SpKKT;6N(-0>B diff --git a/src/filter_files/action.rs b/src/filter_files/action.rs new file mode 100644 index 0000000..1554fe5 --- /dev/null +++ b/src/filter_files/action.rs @@ -0,0 +1,18 @@ +use teloxide::{prelude::*, types::ChatPermissions}; + +use crate::telegram_utils; + +pub async fn take_actions(msg: Message, bot: Bot) -> anyhow::Result<()> { + _ = bot.delete_message(msg.chat.id, msg.id).await; + _ = bot.send_message(msg.chat.id, format!("Los mensajes con ficheros ejecutables no están permitidos\nAlerta para el usuario {}.\nSi consideras que ha sido un error ponte en contacto con un administrador", telegram_utils::get_alias(&msg))).await; + let user = match msg.from() { + Some(user) => user, + None => return Ok(()), + }; + let mut permissions = msg.chat.permissions().unwrap_or(ChatPermissions::empty()); + permissions.remove(ChatPermissions::SEND_OTHER_MESSAGES); + permissions.insert(ChatPermissions::SEND_MESSAGES); + let restrict = bot.restrict_chat_member(msg.chat.id, user.id, permissions); + _ = restrict.send().await; + Ok(()) +} diff --git a/src/filter_files/analyce_name.rs b/src/filter_files/analyce_name.rs new file mode 100644 index 0000000..9982e2c --- /dev/null +++ b/src/filter_files/analyce_name.rs @@ -0,0 +1,27 @@ +use teloxide::{prelude::*, types::Document}; + +static EXTENSIONS: [&str; 3] = ["exe", "deb", "rpm"]; + +pub fn check_file(msg: Message) -> bool { + match msg.document() { + Some(s) => match get_extension(s.clone()) { + Some(extension) => check_extension(extension), + None => false, + }, + None => false, + } +} + +fn get_extension(document: Document) -> Option { + match document.file_name { + Some(name) => match name.split(".").last() { + Some(extension) => Some(String::from(extension)), + None => None, + }, + None => None, + } +} + +fn check_extension(extension: String) -> bool { + EXTENSIONS.contains(&extension.as_str()) +} diff --git a/src/filter_files/mod.rs b/src/filter_files/mod.rs new file mode 100644 index 0000000..c917240 --- /dev/null +++ b/src/filter_files/mod.rs @@ -0,0 +1,2 @@ +pub mod action; +pub mod analyce_name; diff --git a/src/main.rs b/src/main.rs index e53c274..8728a98 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,24 +1,28 @@ -use teloxide::{prelude::*, utils::command::BotCommands}; -use std::sync::Arc; use chrono::Local; -mod check_permissions; -mod pole_dialogue; +use std::sync::Arc; +use teloxide::{prelude::*, utils::command::BotCommands}; mod ban_stiker; +mod check_permissions; mod database; +mod filter_files; +mod pole_dialogue; +mod rewrite_links; mod spoiler_mangas; mod telegram_utils; -mod rewrite_links; #[derive(BotCommands, Clone)] -#[command(rename_rule = "lowercase", description = "These commands are supported:")] +#[command( + rename_rule = "lowercase", + description = "These commands are supported:" +)] enum Command { #[command(description = "ban a stiker")] Torquemada, #[command(description = "display this text.")] Help, - #[command(description = "list pole points" )] + #[command(description = "list pole points")] Top, - #[command(description = "get the server time" )] + #[command(description = "get the server time")] Time, } @@ -27,7 +31,7 @@ async fn main() { run().await; } -async fn run(){ +async fn run() { //teloxide::enable_logging!(); pretty_env_logger::init(); log::info!("Starting bot"); @@ -38,74 +42,82 @@ async fn run(){ //Command::repl(bot.clone(), answer).await; let handler = Update::filter_message() .branch( - dptree::filter(move |msg: Message| !p1.compare(&msg.chat.id.to_string())) - .endpoint(|msg: Message, bot: Bot| async move { - if !msg.chat.is_private() { - println!("{}",msg.chat.id.0); - bot.leave_chat(msg.chat.id).await?; - } - Ok(()) + dptree::filter(move |msg: Message| !p1.compare(&msg.chat.id.to_string())).endpoint( + |msg: Message, bot: Bot| async move { + if !msg.chat.is_private() { + println!("{}", msg.chat.id.0); + bot.leave_chat(msg.chat.id).await?; } - ), - + Ok(()) + }, + ), ) .branch( - dptree::filter(|msg: Message| is_channel_user(msg)) - .endpoint(|msg: Message, bot: Bot| async move { - bot.delete_message(msg.chat.id, msg.id).await?; - Ok(()) - } - ), + dptree::filter(|msg: Message| is_channel_user(msg)).endpoint( + |msg: Message, bot: Bot| async move { + bot.delete_message(msg.chat.id, msg.id).await?; + Ok(()) + }, + ), ) .branch( Update::filter_message() .filter_command::() - .endpoint(|msg: Message, bot: Bot, command: Command | answer(bot, msg, command)), + .endpoint(|msg: Message, bot: Bot, command: Command| answer(bot, msg, command)), ) .branch( dptree::filter(|msg: Message| is_media(msg.clone()) && ban_stiker::check_media(msg)) .endpoint(|msg: Message, bot: Bot| async move { - bot.delete_message(msg.chat.id, msg.id).await?; - Ok(()) - } - ), + bot.delete_message(msg.chat.id, msg.id).await?; + Ok(()) + }), ) .branch( - dptree::filter(move |msg: Message| (is_photo(msg.clone()) && p2.compar_party(&msg.chat.id.to_string()))) - .endpoint(|msg: Message, bot: Bot| spoiler_mangas::check_image(msg, bot)), + dptree::filter(move |msg: Message| { + (is_photo(msg.clone()) && p2.compar_party(&msg.chat.id.to_string())) + }) + .endpoint(|msg: Message, bot: Bot| spoiler_mangas::check_image(msg, bot)), ) .branch( - dptree::filter(move |msg: Message| rewrite_links::check_contain_links::contain_links(msg.clone())) - .endpoint(|msg: Message, bot: Bot| rewrite_links::check_contain_links::fix_links(msg, bot)), + dptree::filter(move |msg: Message| filter_files::analyce_name::check_file(msg.clone())) + .endpoint(|msg: Message, bot: Bot| filter_files::action::take_actions(msg, bot)), + ) + .branch( + dptree::filter(move |msg: Message| { + rewrite_links::check_contain_links::contain_links(msg.clone()) + }) + .endpoint(|msg: Message, bot: Bot| { + rewrite_links::check_contain_links::fix_links(msg, bot) + }), ) .branch( dptree::filter(move |msg: Message| permissions.compar_party(&msg.chat.id.to_string())) .endpoint(|msg: Message, bot: Bot| pole_dialogue::exe_pole(msg, bot)), ); - Dispatcher::builder( - bot, - handler, - ) - .build() - .dispatch() - .await; + Dispatcher::builder(bot, handler).build().dispatch().await; } -async fn answer( - bot: Bot, - msg: Message, - command: Command, -) -> anyhow::Result<()> { +async fn answer(bot: Bot, msg: Message, command: Command) -> anyhow::Result<()> { match command { - Command::Torquemada => { - match ban_stiker::ban_media(msg.clone(), bot.clone()).await { - Ok(_o) => bot.send_message(msg.chat.id, "Otro fichero que se va a la hoguera").await?, - Err(e) => bot.send_message(msg.chat.id, e.to_string()).await?, + Command::Torquemada => match ban_stiker::ban_media(msg.clone(), bot.clone()).await { + Ok(_o) => { + bot.send_message(msg.chat.id, "Otro fichero que se va a la hoguera") + .await? } + Err(e) => bot.send_message(msg.chat.id, e.to_string()).await?, }, - Command::Help => bot.send_message(msg.chat.id, Command::descriptions().to_string()).await?, + Command::Help => { + bot.send_message(msg.chat.id, Command::descriptions().to_string()) + .await? + } Command::Top => pole_dialogue::get_top(msg, bot).await?, - Command::Time => bot.send_message(msg.chat.id, Local::now().format("%Y-%m-%d:%H:%M:%S").to_string()).await?, + Command::Time => { + bot.send_message( + msg.chat.id, + Local::now().format("%Y-%m-%d:%H:%M:%S").to_string(), + ) + .await? + } }; Ok(()) @@ -113,7 +125,6 @@ async fn answer( fn is_media(msg: Message) -> bool { is_stiker(msg.clone()) || is_gif(msg.clone()) || is_photo(msg.clone()) - } fn is_stiker(msg: Message) -> bool { @@ -121,7 +132,6 @@ fn is_stiker(msg: Message) -> bool { Some(s) => true, None => false, } - } fn is_gif(msg: Message) -> bool { @@ -129,7 +139,6 @@ fn is_gif(msg: Message) -> bool { Some(s) => true, None => false, } - } fn is_photo(msg: Message) -> bool { @@ -137,10 +146,9 @@ fn is_photo(msg: Message) -> bool { Some(s) => true, None => false, } - } -fn is_channel_user(msg: Message)->bool{ +fn is_channel_user(msg: Message) -> bool { match msg.from() { Some(u) => u.is_channel(), None => false,