diff --git a/Cargo.toml b/Cargo.toml index 82c8759..32dc26e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,8 @@ multimap = "0.4.0" notify = "4.0.0" irc = "0.13.5" thread_local = "0.3" -pvn = { git = "http://gitlab.monarch-pass.net/malacoda/pvn.git" } -echobox = { git = "http://gitlab.monarch-pass.net/malacoda/echobox.git" } -stc = { git = "http://gitlab.monarch-pass.net/malacoda/stc.git" } +pvn = { git = "https://gitlab.monarch-pass.net/malacoda/pvn.git" } +echobox = { git = "https://gitlab.monarch-pass.net/malacoda/echobox.git" } +stc = { git = "https://gitlab.monarch-pass.net/malacoda/stc.git" } +i-can-has-cat = { git = "https://gitlab.monarch-pass.net/malacoda/i-can-has-cat.git" } +wow-such-doge = { git = "https://gitlab.monarch-pass.net/malacoda/wow-such-doge.git" } diff --git a/src/lib.rs b/src/lib.rs index b633ac1..11eccf3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,6 +10,8 @@ extern crate regex; extern crate multimap; extern crate irc; extern crate thread_local; +extern crate i_can_has_cat; +extern crate wow_such_doge; #[macro_use] extern crate hlua; diff --git a/src/modules/cat.rs b/src/modules/cat.rs new file mode 100644 index 0000000..daa012f --- /dev/null +++ b/src/modules/cat.rs @@ -0,0 +1,62 @@ +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 i_can_has_cat::Cats; + +pub struct CatModule { + prefix: String +} + +impl CatModule { + pub fn new (_: &Table, configuration: &Table) -> Box { + let prefix = configuration.get("prefix") + .and_then(|value| value.as_str()) + .unwrap_or("?cat"); + + Box::new(CatModule { + prefix: String::from(prefix) + }) + } +} + +impl EventLoop for CatModule { + fn run(&self, _: Box>, receiver: Receiver>) { + let cats = Cats::new(); + + 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, argument)) => { + if command == self.prefix { + let cat = if !argument.is_empty() { + cats.random_image_of_category(argument) + } else { + cats.random_image() + }; + + if let Ok(cat) = cat { + message.reply(&cat.url); + } + } + }, + _ => {} + } + } + _ => () + } + } + Err(error) => { error!("Error {:?}", error) } + } + } + } +} diff --git a/src/modules/dog.rs b/src/modules/dog.rs new file mode 100644 index 0000000..2a15c0e --- /dev/null +++ b/src/modules/dog.rs @@ -0,0 +1,62 @@ +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 wow_such_doge::Dogs; + +pub struct DogModule { + prefix: String +} + +impl DogModule { + pub fn new (_: &Table, configuration: &Table) -> Box { + let prefix = configuration.get("prefix") + .and_then(|value| value.as_str()) + .unwrap_or("?dog"); + + Box::new(DogModule { + prefix: String::from(prefix) + }) + } +} + +impl EventLoop for DogModule { + fn run(&self, _: Box>, receiver: Receiver>) { + let dogs = Dogs::new(); + + 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, argument)) => { + if command == self.prefix { + let dog = if !argument.is_empty() { + dogs.random_image_by_breed(argument) + } else { + dogs.random_image() + }; + + if let Ok(dog) = dog { + message.reply(&dog); + } + } + }, + _ => {} + } + } + _ => () + } + } + Err(error) => { error!("Error {:?}", error) } + } + } + } +} diff --git a/src/modules/loader.rs b/src/modules/loader.rs index d92fe07..de29bf7 100644 --- a/src/modules/loader.rs +++ b/src/modules/loader.rs @@ -15,6 +15,8 @@ use modules::echobox::EchoboxModule; use modules::autolink::AutolinkModule; use modules::logger::LoggerModule; use modules::irc::IrcHandler; +use modules::dog::DogModule; +use modules::cat::CatModule; use std::sync::{Arc, Mutex}; @@ -35,6 +37,8 @@ impl ModuleLoader { types.insert("autolink", AutolinkModule::new as fn(&Table, &Table) -> Box); types.insert("logger", LoggerModule::new as fn(&Table, &Table) -> Box); types.insert("irc", IrcHandler::new as fn(&Table, &Table) -> Box); + types.insert("cat", CatModule::new as fn(&Table, &Table) -> Box); + types.insert("dog", DogModule::new as fn(&Table, &Table) -> Box); ModuleLoader { types: types } diff --git a/src/modules/mod.rs b/src/modules/mod.rs index a9d2315..7d67a4b 100644 --- a/src/modules/mod.rs +++ b/src/modules/mod.rs @@ -8,6 +8,8 @@ pub mod echobox; pub mod autolink; pub mod logger; pub mod irc; +pub mod cat; +pub mod dog; pub mod loader;