use modules::EventLoop; use toml::value::Table; use std::sync::Arc; use std::sync::mpsc::Receiver; use transformable_channels::mpsc::ExtSender; use helpers::command::split_command; use event::{Event, Envelope}; use rand; pub struct RandomModule { prefix: String, responses: Vec } impl RandomModule { pub fn new (_: &Table, configuration: &Table) -> Box { let prefix = configuration.get("prefix") .and_then(|value| value.as_str()) .unwrap_or("?random"); let responses = configuration.get("responses") .and_then(|value| value.as_array()) .map(|value| value.to_vec()) .unwrap_or(vec![]) .into_iter() .map(|value| { String::from(value.as_str().unwrap()) }) .collect(); Box::new(RandomModule { prefix: String::from(prefix), responses: responses }) } } impl EventLoop for RandomModule { fn run(&self, _: Box>, receiver: Receiver>) { let mut rng = rand::thread_rng(); loop { match receiver.recv() { Ok(envelope) => { match envelope.event { Event::Message { ref message } => { debug!("Received message from module {:?}... {:?}", envelope.from, message.content); match split_command(&message.content) { Some((command, _)) => { if command == self.prefix { let response = &rand::sample(&mut rng, &self.responses, 1)[0][..]; message.reply(response); } }, _ => {} } } _ => () } } Err(error) => { error!("Error {:?}", error) } } } } }