diff --git a/src/groups/calls/moderation.rs b/src/groups/calls/moderation.rs index ddb63ac..59abd7d 100644 --- a/src/groups/calls/moderation.rs +++ b/src/groups/calls/moderation.rs @@ -70,12 +70,13 @@ pub fn escape_message(event: &MessageCreate) -> String { } #[derive(Debug)] -struct NormalizedMessage { +pub struct NormalizedMessage { /// The normalized message content. message: String, - /// Mappings from original indices to normalized indices, or None if it was removed. - mappings: HashMap<(usize, usize), Option<(usize, usize)>>, + /// Mappings from normalized start indices to original start indices (indices are grapheme + /// indices). + mappings: Vec, } pub fn normalize(message: String) -> NormalizedMessage { @@ -97,9 +98,7 @@ pub fn normalize(message: String) -> NormalizedMessage { .collect(); let mut normalized = String::with_capacity(message.len()); - let mut mappings = HashMap::new(); - - let mut last_i = 0; + let mut mappings = Vec::new(); for (i, mut ch) in message .grapheme_indices(true) @@ -111,18 +110,12 @@ pub fn normalize(message: String) -> NormalizedMessage { let unidecoded = unidecode(&ch); - let ui_start = normalized.len(); - let ui_end = ui_start + unidecoded.len(); - - if unidecoded.chars().all(|c| c.is_ascii_alphanumeric()) { - // If the character is alphanumeric, we can keep it. - normalized.push_str(&unidecoded); - mappings.insert((last_i, i), Some((ui_start, ui_end))); - } else { - mappings.insert((last_i, i), None); + for char in unidecoded.chars() { + if char.is_alphanumeric() { + normalized.push(char); + mappings.push(i); + } } - - last_i = i; } NormalizedMessage { @@ -170,10 +163,20 @@ pub fn analyze_message(message: &str) -> Vec<(Vec, Arc)> { results } -pub fn censor_message(original: &str, normalized: NormalizedMessage, analysis: &[(Vec, Arc)]) -> String { - let mut censored = String::with_capacity(original.len()); +pub fn censor_message( + original: &str, + normalized: NormalizedMessage, + analysis: &[(Vec, Arc)], +) -> String { + let mut censored = original.to_string(); - todo!(); + for (findings, rule) in analysis { + for finding in findings { + while let Some(start) = normalized.message.find(finding) { + let end = start + finding.len(); + } + } + } censored }