diff --git a/src/event/mod.rs b/src/event/mod.rs index f42fcee..97bae51 100644 --- a/src/event/mod.rs +++ b/src/event/mod.rs @@ -1,6 +1,5 @@ use {Channel, User}; -#[derive(Clone)] pub enum Event { Message { sender: User, channel: Option, content: String }, Join { channel: Channel }, diff --git a/src/lib.rs b/src/lib.rs index 2fa92d2..2912312 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -54,7 +54,7 @@ impl Tenquestionmarks { // Module event consumer threads. // tenquestionmarks propagates all events to each Module through these // channels. - let senders: Vec> = self.modules.values().map(|module| { + let senders: Vec>> = self.modules.values().map(|module| { let (sender, receiver) = mpsc::channel(); scope.spawn(move || module.consume_events(receiver)); sender @@ -88,12 +88,11 @@ impl Tenquestionmarks { } } -#[derive(Clone)] pub struct Channel { name: String, description: String, topic: String, - sender: Arc + sender: Box } impl Channel { @@ -102,10 +101,9 @@ impl Channel { } } -#[derive(Clone)] pub struct User { name: String, - sender: Arc + sender: Box } impl User { diff --git a/src/modules/discord.rs b/src/modules/discord.rs index f9a01ab..ddb2b08 100644 --- a/src/modules/discord.rs +++ b/src/modules/discord.rs @@ -54,7 +54,7 @@ impl MessageSender for DiscordMessageSender { } impl Module for DiscordModule { - fn produce_events<'a>(&'a self, sender: Sender) { + fn produce_events<'a>(&'a self, sender: Sender>) { let discord = Arc::new(Discord::from_bot_token(&self.token[..]).expect("Discord module: Login failed")); let (mut connection, _) = discord.connect().expect("Discord module: Connection failed"); @@ -66,7 +66,7 @@ impl Module for DiscordModule { Ok(Event::MessageCreate(message)) => { let author = User { name: message.author.name.clone(), - sender: Arc::new(DiscordMessageSender { + sender: Box::new(DiscordMessageSender { discord: discord.clone(), channel_id: message.channel_id }) @@ -76,13 +76,13 @@ impl Module for DiscordModule { name: String::from("channel"), description: String::from(""), topic: String::from(""), - sender: Arc::new(DiscordMessageSender { + sender: Box::new(DiscordMessageSender { discord: discord.clone(), channel_id: message.channel_id }) }; - match sender.send(event::Event::Message { sender: author, content: message.content, channel: Option::Some(channel) }) { + match sender.send(Arc::new(event::Event::Message { sender: author, content: message.content, channel: Option::Some(channel) })) { Err(err) => error!("Error sending message event: {:?}", err), Ok(_) => {} } diff --git a/src/modules/echo.rs b/src/modules/echo.rs index e63536c..9ccaf11 100644 --- a/src/modules/echo.rs +++ b/src/modules/echo.rs @@ -1,6 +1,7 @@ use modules::Module; use toml::Table; +use std::sync::Arc; use std::sync::mpsc::Receiver; use event::Event; @@ -21,17 +22,17 @@ impl EchoModule { } impl Module for EchoModule { - fn consume_events (&self, receiver: Receiver) { + fn consume_events (&self, receiver: Receiver>) { loop { match receiver.recv() { Ok(event) => { - match event { - Event::Message { content: message, channel, sender } => { + match *event { + Event::Message { content: ref message, ref channel, ref sender } => { debug!("Received message... {:?}", message); if message.starts_with(self.prefix.as_str()) { let substring = &message[self.prefix.chars().count()..]; - match channel { - Some(channel) => channel.send(substring), + match *channel { + Some(ref channel) => channel.send(substring), None => sender.send(substring) } } diff --git a/src/modules/mod.rs b/src/modules/mod.rs index 8fb153d..f297d08 100644 --- a/src/modules/mod.rs +++ b/src/modules/mod.rs @@ -9,10 +9,11 @@ pub mod loader; use Tenquestionmarks; use event::Event; +use std::sync::Arc; use std::sync::mpsc::{Sender, Receiver}; pub trait Module : Sync { fn register (&self, tenquestionmarks: &Tenquestionmarks) {} - fn consume_events (&self, receiver: Receiver) {} - fn produce_events<'a>(&'a self, sender: Sender) {} + fn consume_events (&self, receiver: Receiver>) {} + fn produce_events<'a>(&'a self, sender: Sender>) {} } diff --git a/src/modules/random.rs b/src/modules/random.rs index 83ee8aa..a6e1f89 100644 --- a/src/modules/random.rs +++ b/src/modules/random.rs @@ -1,6 +1,7 @@ use modules::Module; use toml::Table; +use std::sync::Arc; use std::sync::mpsc::Receiver; use event::Event; @@ -33,20 +34,20 @@ impl RandomModule { } impl Module for RandomModule { - fn consume_events (&self, receiver: Receiver) { + 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 } => { + match *event { + Event::Message { content: ref message, ref channel, ref sender } => { debug!("Received message... {:?}", message); 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), + match *channel { + Some(ref channel) => channel.send(response), None => sender.send(response) } } diff --git a/src/modules/stdin.rs b/src/modules/stdin.rs index 980cffd..11f65cf 100644 --- a/src/modules/stdin.rs +++ b/src/modules/stdin.rs @@ -30,20 +30,23 @@ impl StdinModule { } impl Module for StdinModule { - fn produce_events<'a>(&'a self, sender: Sender) { - let user = User { - name: String::from("Dave"), - sender: Arc::new(StdinMessageSender { - name: String::from("Dave") - }) - }; - + fn produce_events<'a>(&'a self, sender: Sender>) { loop { let mut input = String::new(); match io::stdin().read_line(&mut input) { Ok(n) => { - let message = Event::Message { sender: user.clone(), content: input, channel: None }; - match sender.send(message) { + let message = Event::Message { + sender: User { + name: String::from("Dave"), + sender: Box::new(StdinMessageSender { + name: String::from("Dave") + }) + }, + content: input, + channel: None + }; + + match sender.send(Arc::new(message)) { Err(err) => error!("Error sending message event: {:?}", err), Ok(_) => {} }