From 9e1ffc001d4e04884f1ae0b9d66d9ab8d393d8e7 Mon Sep 17 00:00:00 2001 From: Yash Karandikar Date: Tue, 19 Jul 2022 19:26:46 -0500 Subject: [PATCH] Add support for the "i" flag --- Cargo.toml | 1 + src/commands/sed.rs | 13 ++++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) 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 386d77b..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,16 +27,21 @@ 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 (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 { - message.replace(find.as_str(), replace.as_str()) + re.replace_all(&message, replace.as_str()) } else { - message.replacen(find.as_str(), replace.as_str(), 1) + re.replace(&message, replace.as_str()) }; if foreign_author { Ok(format!(