diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/plugin.rs | 39 | ||||
| -rw-r--r-- | src/plugins/currency.rs | 5 | ||||
| -rw-r--r-- | src/plugins/emoji.rs | 4 | ||||
| -rw-r--r-- | src/plugins/help.rs | 4 |
4 files changed, 25 insertions, 27 deletions
diff --git a/src/plugin.rs b/src/plugin.rs index e0a4ce2..d1f849a 100644 --- a/src/plugin.rs +++ b/src/plugin.rs @@ -1,15 +1,15 @@ use std::fmt; use std::collections::HashMap; use std::thread::spawn; -use std::sync::{Arc, Mutex}; +use std::sync::Arc; use irc::client::prelude::*; use irc::error::Error as IrcError; pub trait Plugin: PluginName + Send + Sync + fmt::Debug { fn is_allowed(&self, server: &IrcServer, message: &Message) -> bool; - fn execute(&mut self, server: &IrcServer, message: &Message) -> Result<(), IrcError>; - fn command(&mut self, server: &IrcServer, command: PluginCommand) -> Result<(), IrcError>; + fn execute(&self, server: &IrcServer, message: &Message) -> Result<(), IrcError>; + fn command(&self, server: &IrcServer, command: PluginCommand) -> Result<(), IrcError>; } pub trait PluginName: Send + Sync + fmt::Debug { @@ -65,19 +65,9 @@ impl PluginCommand { } } -// Lock the mutex and ignore if it is poisoned -macro_rules! lock_plugin { - ($e:expr) => { - match $e.lock() { - Ok(plugin) => plugin, - Err(poisoned) => poisoned.into_inner(), - } - } -} - #[derive(Clone, Debug)] pub struct ThreadedPlugins { - plugins: HashMap<String, Arc<Mutex<Plugin>>>, + plugins: HashMap<String, Arc<Plugin>>, } impl ThreadedPlugins { @@ -87,7 +77,7 @@ impl ThreadedPlugins { pub fn add<T: Plugin + 'static>(&mut self, plugin: T) { let name = plugin.name().to_lowercase(); - let safe_plugin = Arc::new(Mutex::new(plugin)); + let safe_plugin = Arc::new(plugin); self.plugins.insert(name, safe_plugin); } @@ -96,7 +86,11 @@ impl ThreadedPlugins { for (name, plugin) in self.plugins.clone() { // Send the message to the plugin if the plugin needs it - if lock_plugin!(plugin).is_allowed(server, &message) { + if plugin.is_allowed(server, &message) { + + debug!("Executing {} with {}", + name, + message.to_string().replace("\r\n", "")); // Clone everything before the move // The server uses an Arc internally too @@ -106,7 +100,7 @@ impl ThreadedPlugins { // Execute the plugin in another thread spawn(move || { - if let Err(e) = lock_plugin!(plugin).execute(&server, &message) { + if let Err(e) = plugin.execute(&server, &message) { error!("Error in {} - {}", name, e); }; }); @@ -114,7 +108,10 @@ impl ThreadedPlugins { } } - pub fn handle_command(&mut self, server: &IrcServer, mut command: PluginCommand) -> Result<(), IrcError> { + pub fn handle_command(&mut self, + server: &IrcServer, + mut command: PluginCommand) + -> Result<(), IrcError> { if !command.tokens.iter().any(|s| !s.is_empty()) { let help = format!("Use \"{} help\" to get help", server.current_nickname()); @@ -127,11 +124,13 @@ impl ThreadedPlugins { // The first token contains the name of the plugin let name = command.tokens.remove(0); + debug!("Sending command \"{:?}\" to {}", command, name); + // Clone for the move - the server uses an Arc internally let server = server.clone(); let plugin = Arc::clone(plugin); spawn(move || { - if let Err(e) = lock_plugin!(plugin).command(&server, command) { + if let Err(e) = plugin.command(&server, command) { error!("Error in {} command - {}", name, e); }; }); @@ -153,7 +152,7 @@ impl fmt::Display for ThreadedPlugins { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let plugin_names = self.plugins .iter() - .map(|(_, p)| lock_plugin!(p).name().to_string()) + .map(|(_, p)| p.name().to_string()) .collect::<Vec<String>>(); write!(f, "{}", plugin_names.join(", ")) } diff --git a/src/plugins/currency.rs b/src/plugins/currency.rs index 78ae593..d6cf928 100644 --- a/src/plugins/currency.rs +++ b/src/plugins/currency.rs @@ -1,7 +1,6 @@ extern crate reqwest; extern crate serde; extern crate serde_json; -extern crate regex; use std::io::Read; use std::num::ParseFloatError; @@ -131,11 +130,11 @@ impl Plugin for Currency { false } - fn execute(&mut self, _: &IrcServer, _: &Message) -> Result<(), IrcError> { + fn execute(&self, _: &IrcServer, _: &Message) -> Result<(), IrcError> { panic!("Currency does not implement the execute function!") } - fn command(&mut self, server: &IrcServer, mut command: PluginCommand) -> Result<(), IrcError> { + fn command(&self, server: &IrcServer, mut command: PluginCommand) -> Result<(), IrcError> { if command.tokens.is_empty() { return self.invalid_command(server, &command); diff --git a/src/plugins/emoji.rs b/src/plugins/emoji.rs index 09d5c27..1bb714c 100644 --- a/src/plugins/emoji.rs +++ b/src/plugins/emoji.rs @@ -105,7 +105,7 @@ impl Plugin for Emoji { } } - fn execute(&mut self, server: &IrcServer, message: &Message) -> Result<(), IrcError> { + fn execute(&self, server: &IrcServer, message: &Message) -> Result<(), IrcError> { match message.command { Command::PRIVMSG(_, ref content) => { self.emoji(server, content, message.response_target().unwrap()) @@ -114,7 +114,7 @@ impl Plugin for Emoji { } } - fn command(&mut self, server: &IrcServer, command: PluginCommand) -> Result<(), IrcError> { + fn command(&self, server: &IrcServer, command: PluginCommand) -> Result<(), IrcError> { server.send_notice(&command.source, "This Plugin does not implement any commands.") } diff --git a/src/plugins/help.rs b/src/plugins/help.rs index c4ddcd4..8f3fb4d 100644 --- a/src/plugins/help.rs +++ b/src/plugins/help.rs @@ -21,11 +21,11 @@ impl Plugin for Help { false } - fn execute(&mut self, _: &IrcServer, _: &Message) -> Result<(), IrcError> { + fn execute(&self, _: &IrcServer, _: &Message) -> Result<(), IrcError> { panic!("Help does not implement the execute function!") } - fn command(&mut self, server: &IrcServer, command: PluginCommand) -> Result<(), IrcError> { + fn command(&self, server: &IrcServer, command: PluginCommand) -> Result<(), IrcError> { self.help(server, command) } } |
