From 166805d1c218521b03b06b66e605e6ad47857c13 Mon Sep 17 00:00:00 2001 From: Adrian Malacoda Date: Thu, 16 Feb 2017 13:00:17 -0600 Subject: [PATCH] actually add random module --- src/modules/random.rs | 60 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/modules/random.rs diff --git a/src/modules/random.rs b/src/modules/random.rs new file mode 100644 index 0000000..c34d20b --- /dev/null +++ b/src/modules/random.rs @@ -0,0 +1,60 @@ +use modules::Module; +use toml::Table; + +use std::sync::mpsc::Receiver; +use event::Event; + +use rand; + +pub struct RandomModule { + prefix: String, + responses: Vec +} + +impl RandomModule { + pub fn new (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_slice()) + .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 Module for RandomModule { + fn consume_events (&self, receiver: Receiver) { + let mut rng = rand::thread_rng(); + + loop { + match receiver.recv() { + Ok(event) => { + match event { + Event::Message { content: message, channel, sender } => { + if message.starts_with(self.prefix.as_str()) { + let response = &rand::sample(&mut rng, &self.responses, 1)[0][..]; + + match channel { + Some(channel) => channel.send(response), + None => sender.send(response) + } + } + } + _ => () + } + } + Err(error) => { } + } + } + } +}