From 65fb93510f7f35ddd1322949723ad9021aff9b5d Mon Sep 17 00:00:00 2001 From: Pavel Kirilin <win10@list.ru> Date: Fri, 24 Feb 2023 09:11:14 +0000 Subject: [PATCH] Added update types filtering. --- src/bot/filters/message_fitlers.rs | 28 ++++++++++++++++++++++++++++ src/bot/main.rs | 14 ++++++++++---- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/bot/filters/message_fitlers.rs b/src/bot/filters/message_fitlers.rs index 6533d4a..e947d4e 100644 --- a/src/bot/filters/message_fitlers.rs +++ b/src/bot/filters/message_fitlers.rs @@ -18,6 +18,14 @@ pub enum TextMatchMethod { IMatches, } +#[allow(dead_code)] +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +pub enum UpdateType { + New, + Edited, + Deleted, +} + /// This filter is used to filter out /// that marked as silent. #[derive(Clone)] @@ -40,6 +48,10 @@ pub struct TextFilter<'a>(pub &'a [&'a str], pub TextMatchMethod); #[derive(Clone)] pub struct RegexFilter(pub Regex); +/// Filters using provided regex. +#[derive(Clone)] +pub struct UpdateTypeFilter<'a>(pub &'a [UpdateType]); + impl Filter for ExcludedChatsFilter { fn filter(&self, update: &Update) -> anyhow::Result<bool> { let a = match update { @@ -102,3 +114,19 @@ impl Filter for RegexFilter { Ok(self.0.is_match(message.text())) } } + +impl<'a> Filter for UpdateTypeFilter<'a> { + fn filter(&self, update: &Update) -> anyhow::Result<bool> { + for update_type in self.0 { + match (update_type, update) { + (UpdateType::New, Update::NewMessage(_)) + | (UpdateType::Edited, Update::MessageEdited(_)) + | (UpdateType::Deleted, Update::MessageDeleted(_)) => { + return Ok(true); + } + _ => continue, + } + } + Ok(false) + } +} diff --git a/src/bot/main.rs b/src/bot/main.rs index 5ddd382..5241355 100644 --- a/src/bot/main.rs +++ b/src/bot/main.rs @@ -12,7 +12,7 @@ use super::{ filtered_handler::FilteredHandler, message_fitlers::{ ExcludedChatsFilter, MessageDirection, MessageDirectionFilter, RegexFilter, - SilentFilter, TextFilter, TextMatchMethod, + SilentFilter, TextFilter, TextMatchMethod, UpdateType, UpdateTypeFilter, }, }, handlers::{ @@ -98,9 +98,10 @@ async fn run(args: BotConfig, client: Client) -> anyhow::Result<()> { FilteredHandler::new(Help).add_filter(TextFilter(&[".h"], TextMatchMethod::IMatches)), // Greeting my fellow humans. FilteredHandler::new(Greeter) - .add_filter(ExcludedChatsFilter(vec![me.id()])) - .add_filter(SilentFilter) + .add_filter(UpdateTypeFilter(&[UpdateType::New])) .add_filter(MessageDirectionFilter(MessageDirection::Incoming)) + .add_filter(SilentFilter) + .add_filter(ExcludedChatsFilter(vec![me.id()])) .add_filter(TextFilter(&["привет"], TextMatchMethod::IStartsWith)) .add_filter(ExcludedChatsFilter(args.excluded_chats)), // Getting chat id. @@ -108,26 +109,31 @@ async fn run(args: BotConfig, client: Client) -> anyhow::Result<()> { .add_filter(TextFilter(&[".cid"], TextMatchMethod::IMatches)), // Make Ð±Ð»Ñ fun again. FilteredHandler::new(Blyaficator) + .add_filter(UpdateTypeFilter(&[UpdateType::New])) .add_filter(SilentFilter) .add_filter(TextFilter(&[".bl"], TextMatchMethod::IStartsWith)), // Handler for converting currecies. FilteredHandler::new(CurrencyConverter::new()?) + .add_filter(UpdateTypeFilter(&[UpdateType::New])) .add_filter(SilentFilter) .add_filter(ExcludedChatsFilter(args.currency_excluded_chats)) .add_filter(CurrencyTextFilter), // Simlpe rotator. FilteredHandler::new(Rotator) + .add_filter(UpdateTypeFilter(&[UpdateType::New])) .add_filter(SilentFilter) .add_filter(TextFilter(&[".rl"], TextMatchMethod::IStartsWith)), // Weather forecast. FilteredHandler::new(WeatherForecaster::new()?) + .add_filter(UpdateTypeFilter(&[UpdateType::New])) .add_filter(SilentFilter) .add_filter(TextFilter(&[".w"], TextMatchMethod::IStartsWith)), // Smiley repeator. FilteredHandler::new(Repeator) - .add_filter(ExcludedChatsFilter(vec![me.id()])) + .add_filter(UpdateTypeFilter(&[UpdateType::New])) .add_filter(MessageDirectionFilter(MessageDirection::Incoming)) .add_filter(SilentFilter) + .add_filter(ExcludedChatsFilter(vec![me.id()])) .add_filter(RegexFilter(Regex::new("^[)0]+$")?)), ]; -- GitLab