Add filter for files

This commit is contained in:
Guillermo Roche 2025-05-04 18:27:53 +02:00
parent 2834f31982
commit cddbc362a8
Signed by: groche97
GPG Key ID: 041FB85BEEA4B9B0
5 changed files with 111 additions and 56 deletions

BIN
polesDB

Binary file not shown.

View File

@ -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(())
}

View File

@ -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<String> {
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())
}

2
src/filter_files/mod.rs Normal file
View File

@ -0,0 +1,2 @@
pub mod action;
pub mod analyce_name;

View File

@ -1,24 +1,28 @@
use teloxide::{prelude::*, utils::command::BotCommands};
use std::sync::Arc;
use chrono::Local; use chrono::Local;
mod check_permissions; use std::sync::Arc;
mod pole_dialogue; use teloxide::{prelude::*, utils::command::BotCommands};
mod ban_stiker; mod ban_stiker;
mod check_permissions;
mod database; mod database;
mod filter_files;
mod pole_dialogue;
mod rewrite_links;
mod spoiler_mangas; mod spoiler_mangas;
mod telegram_utils; mod telegram_utils;
mod rewrite_links;
#[derive(BotCommands, Clone)] #[derive(BotCommands, Clone)]
#[command(rename_rule = "lowercase", description = "These commands are supported:")] #[command(
rename_rule = "lowercase",
description = "These commands are supported:"
)]
enum Command { enum Command {
#[command(description = "ban a stiker")] #[command(description = "ban a stiker")]
Torquemada, Torquemada,
#[command(description = "display this text.")] #[command(description = "display this text.")]
Help, Help,
#[command(description = "list pole points" )] #[command(description = "list pole points")]
Top, Top,
#[command(description = "get the server time" )] #[command(description = "get the server time")]
Time, Time,
} }
@ -27,7 +31,7 @@ async fn main() {
run().await; run().await;
} }
async fn run(){ async fn run() {
//teloxide::enable_logging!(); //teloxide::enable_logging!();
pretty_env_logger::init(); pretty_env_logger::init();
log::info!("Starting bot"); log::info!("Starting bot");
@ -38,74 +42,82 @@ async fn run(){
//Command::repl(bot.clone(), answer).await; //Command::repl(bot.clone(), answer).await;
let handler = Update::filter_message() let handler = Update::filter_message()
.branch( .branch(
dptree::filter(move |msg: Message| !p1.compare(&msg.chat.id.to_string())) dptree::filter(move |msg: Message| !p1.compare(&msg.chat.id.to_string())).endpoint(
.endpoint(|msg: Message, bot: Bot| async move { |msg: Message, bot: Bot| async move {
if !msg.chat.is_private() { if !msg.chat.is_private() {
println!("{}",msg.chat.id.0); println!("{}", msg.chat.id.0);
bot.leave_chat(msg.chat.id).await?; bot.leave_chat(msg.chat.id).await?;
}
Ok(())
} }
), Ok(())
},
),
) )
.branch( .branch(
dptree::filter(|msg: Message| is_channel_user(msg)) dptree::filter(|msg: Message| is_channel_user(msg)).endpoint(
.endpoint(|msg: Message, bot: Bot| async move { |msg: Message, bot: Bot| async move {
bot.delete_message(msg.chat.id, msg.id).await?; bot.delete_message(msg.chat.id, msg.id).await?;
Ok(()) Ok(())
} },
), ),
) )
.branch( .branch(
Update::filter_message() Update::filter_message()
.filter_command::<Command>() .filter_command::<Command>()
.endpoint(|msg: Message, bot: Bot, command: Command | answer(bot, msg, command)), .endpoint(|msg: Message, bot: Bot, command: Command| answer(bot, msg, command)),
) )
.branch( .branch(
dptree::filter(|msg: Message| is_media(msg.clone()) && ban_stiker::check_media(msg)) dptree::filter(|msg: Message| is_media(msg.clone()) && ban_stiker::check_media(msg))
.endpoint(|msg: Message, bot: Bot| async move { .endpoint(|msg: Message, bot: Bot| async move {
bot.delete_message(msg.chat.id, msg.id).await?; bot.delete_message(msg.chat.id, msg.id).await?;
Ok(()) Ok(())
} }),
),
) )
.branch( .branch(
dptree::filter(move |msg: Message| (is_photo(msg.clone()) && p2.compar_party(&msg.chat.id.to_string()))) dptree::filter(move |msg: Message| {
.endpoint(|msg: Message, bot: Bot| spoiler_mangas::check_image(msg, bot)), (is_photo(msg.clone()) && p2.compar_party(&msg.chat.id.to_string()))
})
.endpoint(|msg: Message, bot: Bot| spoiler_mangas::check_image(msg, bot)),
) )
.branch( .branch(
dptree::filter(move |msg: Message| rewrite_links::check_contain_links::contain_links(msg.clone())) dptree::filter(move |msg: Message| filter_files::analyce_name::check_file(msg.clone()))
.endpoint(|msg: Message, bot: Bot| rewrite_links::check_contain_links::fix_links(msg, bot)), .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( .branch(
dptree::filter(move |msg: Message| permissions.compar_party(&msg.chat.id.to_string())) dptree::filter(move |msg: Message| permissions.compar_party(&msg.chat.id.to_string()))
.endpoint(|msg: Message, bot: Bot| pole_dialogue::exe_pole(msg, bot)), .endpoint(|msg: Message, bot: Bot| pole_dialogue::exe_pole(msg, bot)),
); );
Dispatcher::builder( Dispatcher::builder(bot, handler).build().dispatch().await;
bot,
handler,
)
.build()
.dispatch()
.await;
} }
async fn answer( async fn answer(bot: Bot, msg: Message, command: Command) -> anyhow::Result<()> {
bot: Bot,
msg: Message,
command: Command,
) -> anyhow::Result<()> {
match command { match command {
Command::Torquemada => { Command::Torquemada => match ban_stiker::ban_media(msg.clone(), bot.clone()).await {
match ban_stiker::ban_media(msg.clone(), bot.clone()).await { Ok(_o) => {
Ok(_o) => bot.send_message(msg.chat.id, "Otro fichero que se va a la hoguera").await?, bot.send_message(msg.chat.id, "Otro fichero que se va a la hoguera")
Err(e) => bot.send_message(msg.chat.id, e.to_string()).await?, .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::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(()) Ok(())
@ -113,7 +125,6 @@ async fn answer(
fn is_media(msg: Message) -> bool { fn is_media(msg: Message) -> bool {
is_stiker(msg.clone()) || is_gif(msg.clone()) || is_photo(msg.clone()) is_stiker(msg.clone()) || is_gif(msg.clone()) || is_photo(msg.clone())
} }
fn is_stiker(msg: Message) -> bool { fn is_stiker(msg: Message) -> bool {
@ -121,7 +132,6 @@ fn is_stiker(msg: Message) -> bool {
Some(s) => true, Some(s) => true,
None => false, None => false,
} }
} }
fn is_gif(msg: Message) -> bool { fn is_gif(msg: Message) -> bool {
@ -129,7 +139,6 @@ fn is_gif(msg: Message) -> bool {
Some(s) => true, Some(s) => true,
None => false, None => false,
} }
} }
fn is_photo(msg: Message) -> bool { fn is_photo(msg: Message) -> bool {
@ -137,10 +146,9 @@ fn is_photo(msg: Message) -> bool {
Some(s) => true, Some(s) => true,
None => false, None => false,
} }
} }
fn is_channel_user(msg: Message)->bool{ fn is_channel_user(msg: Message) -> bool {
match msg.from() { match msg.from() {
Some(u) => u.is_channel(), Some(u) => u.is_channel(),
None => false, None => false,