rust/chat_sanitizer/src/letter_repeat.rs
author Wuzzy <Wuzzy2@mail.ru>
Mon, 17 Jun 2019 20:27:34 +0200
changeset 15171 2765731b378b
parent 14505 ba29aa03db87
permissions -rw-r--r--
New formula to calculate drawn map sizes, now every FeatureSize leads to an unique size It works by using 4 hardcoded map sizes and the rest is simply interpolated. Size 1: 1024×512 Size 6: 2048×1024 Size 12: 4096×2048 (default, compatible with pre-1.0.0) Size 25: 8192×4096

use crate::{MessageChecker, Severity};

use itertools::Itertools;
use std::marker::PhantomData;

struct LetterRepeatChecker<T> {
    threshold: usize,
    player_id_type: PhantomData<T>,
}

impl<T> LetterRepeatChecker<T> {
    pub fn new(threshold: usize) -> Self {
        Self {
            threshold,
            player_id_type: PhantomData,
        }
    }
}

impl<T> MessageChecker<T> for LetterRepeatChecker<T> {
    fn check(&self, _player_id: T, message: &str) -> Severity {
        for (_key, group) in &message.chars().into_iter().group_by(|c| *c) {
            if group.count() >= self.threshold {
                return Severity::Warn;
            }
        }

        Severity::Pass
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn it_works() {
        let checker = LetterRepeatChecker::new(3);
        assert_eq!(checker.check(0, "Hello world!"), Severity::Pass);
        assert_eq!(checker.check(0, "ooops"), Severity::Warn);
        assert_eq!(
            checker.check(0, "жираф - длинношеее животное"),
            Severity::Warn
        );
    }
}