Skip to content

Commit

Permalink
Add smart filter option to server messages config.
Browse files Browse the repository at this point in the history
  • Loading branch information
andymandias committed Jan 22, 2024
1 parent 857ea66 commit a73d90a
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 34 deletions.
58 changes: 33 additions & 25 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 6 additions & 4 deletions config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -82,16 +82,18 @@ buffer:
input_visibility: Always

# Control different server messages.
# - exclude [boolean]: exclude the message from showing
# - exclude [All, None, !Smart seconds]:
# - Smart will show a server message if the user has sent a message
# in the given time interval (seconds) prior to the server message
# - user_format [Short, Full]: controls the username formatting
server_messages:
join:
exclude: true
exclude: All
username_format: Short
part:
exclude: false
exclude: None
quit:
exclude: false
exclude: None

# Channel buffer settings
channel:
Expand Down
2 changes: 1 addition & 1 deletion data/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ rand = "0.8.4"
rand_chacha = "0.3.0"
seahash = "4.1.0"
serde_json = "1.0"
serde_yaml = "0.8.23"
serde_yaml = "0.9.0"
thiserror = "1.0.30"
tokio = { version = "1.0", features = ["io-util"] }
tokio-stream = { version = "0.1", features = ["time"] }
Expand Down
10 changes: 9 additions & 1 deletion data/src/config/buffer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,14 @@ pub struct Buffer {
pub server_messages: ServerMessages,
}

#[derive(Debug, Copy, Clone, Default, Deserialize)]
pub enum Exclude {
#[default]
All,
None,
Smart(i64),
}

#[derive(Debug, Clone, Default, Deserialize)]
pub struct ServerMessages {
#[serde(default)]
Expand All @@ -44,7 +52,7 @@ impl ServerMessages {
#[derive(Debug, Copy, Clone, Default, Deserialize)]
pub struct ServerMessage {
#[serde(default)]
pub exclude: bool,
pub exclude: Exclude,
#[serde(default)]
pub username_format: UsernameFormat,
}
Expand Down
46 changes: 43 additions & 3 deletions data/src/history/manager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use futures::{future, Future, FutureExt};
use itertools::Itertools;
use tokio::time::Instant;

use crate::config::buffer::ServerMessages;
use crate::config::buffer::{Exclude, ServerMessages};
use crate::history::{self, History};
use crate::message::{self, Limit};
use crate::time::Posix;
Expand Down Expand Up @@ -439,13 +439,53 @@ impl Data {

let filtered = messages
.iter()
.filter(|message| {
.enumerate()
.filter(|(message_index, message)| {
if let message::Source::Server(Some(source)) = message.target.source() {
!server_messages.get(source).exclude
match server_messages.get(source).exclude {
Exclude::All => false,
Exclude::None => true,
Exclude::Smart(seconds) => 'search_previous_messages: {
for previous_message in
messages.iter().rev().skip(messages.len() - *message_index)
{
let duration_seconds = message
.server_time
.signed_duration_since(previous_message.server_time)
.num_seconds();

if duration_seconds <= seconds {
if let message::Source::User(previous_message_user) =
previous_message.target.source()
{
let substring = match source {
message::source::Server::Join => {
format!("⟶ {}", previous_message_user.nickname())
}
message::source::Server::Part => {
format!("⟵ {}", previous_message_user.nickname())
}
message::source::Server::Quit => {
format!("⟵ {}", previous_message_user.nickname())
}
};

if message.text.starts_with(&substring) {
break 'search_previous_messages true;
}
}
} else {
break 'search_previous_messages false;
}
}
false
}
}
} else {
true
}
})
.map(|(_, message)| message)
.collect::<Vec<_>>();

let total = filtered.len();
Expand Down

0 comments on commit a73d90a

Please sign in to comment.