# HG changeset patch # User unc0rr # Date 1545950634 -3600 # Node ID 831ecafd74c64057b03fadfe6344bd226da6b5ce # Parent abe0a561005e27106c950d23877a889ebe463185 Start chat_sanitizer package inspired by chat bot on pokerth server diff -r abe0a561005e -r 831ecafd74c6 rust/chat_sanitizer/Cargo.toml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/chat_sanitizer/Cargo.toml Thu Dec 27 23:43:54 2018 +0100 @@ -0,0 +1,8 @@ +[package] +name = "chat_sanitizer" +version = "0.1.0" +authors = ["Andrey Korotaev "] +edition = "2018" + +[dependencies] +unicode_skeleton = "0.1" diff -r abe0a561005e -r 831ecafd74c6 rust/chat_sanitizer/src/bad_words.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/chat_sanitizer/src/bad_words.rs Thu Dec 27 23:43:54 2018 +0100 @@ -0,0 +1,54 @@ +use crate::{normalized_message, MessageChecker, Severity}; + +use std::marker::PhantomData; + +struct BadWordsChecker { + blacklist: Vec, + whitelist: Vec, + player_id_type: PhantomData, +} + +impl BadWordsChecker { + pub fn new(blacklist: &[&str], whitelist: &[&str]) -> Self { + Self { + blacklist: blacklist.iter().map(|s| normalized_message(*s)).collect(), + whitelist: whitelist.iter().map(|s| normalized_message(*s)).collect(), + player_id_type: PhantomData, + } + } +} + +impl MessageChecker for BadWordsChecker { + fn check(&self, player_id: T, message: &str) -> Severity { + let msg = normalized_message(message); + + // silly implementation, allows bad messages with a single good word + for badword in &self.blacklist { + if msg.contains(badword) { + if !self.whitelist.iter().any(|goodword| msg.contains(goodword)) { + return Severity::Warn; + } + } + } + + Severity::Pass + } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn it_works() { + let checker = BadWordsChecker::new(&["fsck", "poop"], &["fsck -y"]); + assert_eq!(checker.check(0, "group hug"), Severity::Pass); + assert_eq!(checker.check(0, "fpoopf"), Severity::Warn); + assert_eq!(checker.check(0, "PooP"), Severity::Warn); + + // this one fails + //assert_eq!(checker.check(0, "poop 'fsck -y' poop"), Severity::Warn); + + // ideally this one shouldn't fail + // assert_eq!(checker.check(0, "P00P"), Severity::Warn); + } +} diff -r abe0a561005e -r 831ecafd74c6 rust/chat_sanitizer/src/caps_abuse.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/chat_sanitizer/src/caps_abuse.rs Thu Dec 27 23:43:54 2018 +0100 @@ -0,0 +1,9 @@ +use crate::{MessageChecker, Severity}; + +struct CapsAbuseChecker {} + +impl MessageChecker for CapsAbuseChecker { + fn check(&self, player_id: T, message: &str) -> Severity { + Severity::Pass + } +} diff -r abe0a561005e -r 831ecafd74c6 rust/chat_sanitizer/src/flood.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/chat_sanitizer/src/flood.rs Thu Dec 27 23:43:54 2018 +0100 @@ -0,0 +1,9 @@ +use crate::{MessageChecker, Severity}; + +struct FloodChecker {} + +impl MessageChecker for FloodChecker { + fn check(&self, player_id: T, message: &str) -> Severity { + Severity::Pass + } +} diff -r abe0a561005e -r 831ecafd74c6 rust/chat_sanitizer/src/letter_repeat.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/chat_sanitizer/src/letter_repeat.rs Thu Dec 27 23:43:54 2018 +0100 @@ -0,0 +1,9 @@ +use crate::{MessageChecker, Severity}; + +struct LetterRepeatChecker {} + +impl MessageChecker for LetterRepeatChecker { + fn check(&self, player_id: T, message: &str) -> Severity { + Severity::Pass + } +} diff -r abe0a561005e -r 831ecafd74c6 rust/chat_sanitizer/src/lib.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/chat_sanitizer/src/lib.rs Thu Dec 27 23:43:54 2018 +0100 @@ -0,0 +1,25 @@ +pub mod bad_words; + +use unicode_skeleton::UnicodeSkeleton; + +#[derive(PartialEq, Debug)] +enum Severity { + Pass, + Warn, + Silence, + Ban, +} + +trait MessageChecker { + fn check(&self, player_id: T, message: &str) -> Severity; + fn fix(&self, player_id: T, message: &str) -> Option { + None + } +} + +fn normalized_message(s: &str) -> String { + s.chars() + .flat_map(|c| c.to_lowercase()) + .skeleton_chars() + .collect::() +} diff -r abe0a561005e -r 831ecafd74c6 rust/chat_sanitizer/src/part_repeat.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/chat_sanitizer/src/part_repeat.rs Thu Dec 27 23:43:54 2018 +0100 @@ -0,0 +1,9 @@ +use crate::{MessageChecker, Severity}; + +struct PartRepeatChecker {} + +impl MessageChecker for PartRepeatChecker { + fn check(&self, player_id: T, message: &str) -> Severity { + Severity::Pass + } +} diff -r abe0a561005e -r 831ecafd74c6 rust/chat_sanitizer/src/url.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/chat_sanitizer/src/url.rs Thu Dec 27 23:43:54 2018 +0100 @@ -0,0 +1,9 @@ +use crate::{MessageChecker, Severity}; + +struct URLChecker {} + +impl MessageChecker for URLChecker { + fn check(&self, player_id: T, message: &str) -> Severity { + Severity::Pass + } +}