diff --git a/data/src/history/manager.rs b/data/src/history/manager.rs index 349dde7da..f9181cc95 100644 --- a/data/src/history/manager.rs +++ b/data/src/history/manager.rs @@ -443,10 +443,10 @@ impl Data { let filtered = messages .iter() .filter(|message| match message.target.source() { - crate::message::Source::Server(Some(message_source)) => { - let (message_source, nick) = server_messages.get(message_source); + crate::message::Source::Server(Some(source)) => { + let (source, nick) = server_messages.get(source); - match message_source.exclude { + match source.exclude { Exclude::All => false, Exclude::None => true, Exclude::Smart(seconds) => { @@ -456,6 +456,16 @@ impl Data { &seconds, most_recent_messages.get(&nick.to_owned().unwrap()), ) + } else if let Some(nickname) = + message.text.split(' ').collect::>().get(1) + { + let nick = Nick::from(*nickname); + + !smart_filter_message( + message, + &seconds, + most_recent_messages.get(&nick), + ) } else { true } diff --git a/data/src/message/source.rs b/data/src/message/source.rs index 8219016d4..74056c4c0 100644 --- a/data/src/message/source.rs +++ b/data/src/message/source.rs @@ -1,4 +1,5 @@ -use serde::{Deserialize, Serialize}; +use serde::de::Error; +use serde::{Deserialize, Deserializer, Serialize}; use crate::user::Nick; use crate::User; @@ -11,7 +12,7 @@ pub enum Source { Internal(Internal), } -#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize)] #[serde(rename_all = "lowercase")] pub enum Server { Join(Option), @@ -19,6 +20,42 @@ pub enum Server { Quit(Option), } +impl<'de> Deserialize<'de> for Server { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + #[derive(Debug, Deserialize)] + enum Mapping { + #[serde(rename = "join")] + JoinWithoutNick, + #[serde(rename = "join")] + Join(Option), + #[serde(rename = "part")] + PartWithoutNick, + #[serde(rename = "part")] + Part(Option), + #[serde(rename = "quit")] + QuitWithoutNick, + #[serde(rename = "quit")] + Quit(Option), + } + + if let Ok(mapping) = Mapping::deserialize(deserializer) { + match mapping { + Mapping::JoinWithoutNick => Ok(Server::Join(None)), + Mapping::Join(nick) => Ok(Server::Join(nick)), + Mapping::PartWithoutNick => Ok(Server::Part(None)), + Mapping::Part(nick) => Ok(Server::Part(nick)), + Mapping::QuitWithoutNick => Ok(Server::Quit(None)), + Mapping::Quit(nick) => Ok(Server::Quit(nick)), + } + } else { + Err(D::Error::custom("could not map to Server enum")) + } + } +} + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] pub enum Internal { Status(Status),