70 lines
2.4 KiB
Rust
Raw Normal View History

use modules::{Module, 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 helpers::command::split_command;
use event::{Event, Envelope};
2017-02-16 13:00:17 -06:00
use rand;
pub struct RandomModule {
prefix: String,
responses: Vec<String>
}
impl RandomModule {
pub fn new (_: &Table, configuration: &Table) -> Module {
2017-02-16 13:00:17 -06:00
let prefix = configuration.get("prefix")
.and_then(|value| value.as_str())
.unwrap_or("?random");
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();
Module {
module_type: String::from("random"),
event_loop: Box::new(RandomModule {
prefix: String::from(prefix),
responses: responses
}),
config: configuration.clone()
}
2017-02-16 13:00:17 -06:00
}
}
impl EventLoop for RandomModule {
fn run(&self, _: Box<ExtSender<Envelope>>, receiver: Receiver<Arc<Envelope>>) {
2017-02-16 13:00:17 -06:00
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);
}
},
_ => {}
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
}
}
}
}