66 lines
2.4 KiB
Rust
Raw Normal View History

use modules::EventLoop;
use toml::value::Table;
2017-02-16 13:00:17 -06:00
use std::sync::Arc;
use std::sync::mpsc::Receiver;
use transformable_channels::mpsc::ExtSender;
2017-02-16 13:00:17 -06:00
use regex;
use regex::Regex;
use event::{Event, Envelope};
2017-02-16 13:00:17 -06:00
use rand;
pub struct RandomModule {
pattern: Regex,
2017-02-16 13:00:17 -06:00
responses: Vec<String>
}
impl RandomModule {
pub fn new (_: &Table, configuration: &Table) -> Box<EventLoop> {
let pattern = configuration.get("pattern")
.and_then(|value| value.as_str())
.map(String::from)
.or_else(|| configuration.get("prefix")
.and_then(|value| value.as_str())
.map(|value| format!("^{}", regex::escape(value))))
.and_then(|value| Regex::new(&value).ok())
.expect("Invalid value for pattern");
2017-02-16 13:00:17 -06:00
let responses = configuration.get("responses")
.and_then(|value| value.as_array())
2017-02-16 13:00:17 -06:00
.map(|value| value.to_vec())
.unwrap_or(vec![])
.into_iter()
.map(|value| { String::from(value.as_str().unwrap()) })
.collect();
Box::new(RandomModule {
pattern: pattern,
responses: responses
})
2017-02-16 13:00:17 -06:00
}
}
impl EventLoop for RandomModule {
fn run(&self, _: Box<ExtSender<Event>>, receiver: Receiver<Arc<Envelope>>) {
2017-02-16 13:00:17 -06:00
let mut rng = rand::thread_rng();
loop {
match receiver.recv() {
Ok(envelope) => {
if let Event::Message { ref message } = envelope.event {
debug!("Received message from module {:?}... {:?}", envelope.from, message.content);
if let Some(captures) = self.pattern.captures(&message.content) {
let mut response = String::new();
captures.expand(&rand::sample(&mut rng, &self.responses, 1)[0], &mut response);
message.reply(&response);
2017-02-16 13:00:17 -06:00
}
}
}
2017-02-17 02:38:15 -06:00
Err(error) => { error!("Error {:?}", error) }
2017-02-16 13:00:17 -06:00
}
}
}
}