diff --git a/Cargo.toml b/Cargo.toml index 362f975..5d0e85e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,6 +25,7 @@ rusqlite = { version = "0.28", features = ["bundled"] } futures-util = "0.3" irc = { version = "0.15", default-features = false, features = ["tls-rust"] } async-trait = "0.1" +regex = "1.6.0" [features] # debug IRC commands diff --git a/src/commands/sed.rs b/src/commands/sed.rs index ab124f8..943d6cc 100644 --- a/src/commands/sed.rs +++ b/src/commands/sed.rs @@ -1,6 +1,8 @@ use crate::bot::{Context, Trigger}; use async_trait::async_trait; +use fancy_regex::escape; use fancy_regex::Captures; +use regex::RegexBuilder; pub struct Sed; @@ -25,9 +27,22 @@ impl Trigger for Sed { return Ok("No previous messages found.".into()); }; if let (Some(find), Some(replace)) = (captures.name("r"), captures.name("w")) { - // TODO: karx plz add flags - //let flags = matches.name("f").map(|m| m.as_str()); - let result = message.replace(find.as_str(), replace.as_str()); + let (global, ignore_case) = captures + .name("f") + .map(|m| m.as_str()) + .map(|s| (s.contains('g'), s.contains('i'))) + .unwrap_or_default(); + + let escaped = escape(find.as_str()); + let re = RegexBuilder::new(&escaped) + .case_insensitive(ignore_case) + .build() + .unwrap(); // Of course it's valid, we just escaped special chars + let result = if global { + re.replace_all(&message, replace.as_str()) + } else { + re.replace(&message, replace.as_str()) + }; if foreign_author { Ok(format!( "(edited by {}) <{}> {}",