summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugin.rs39
-rw-r--r--src/plugins/currency.rs5
-rw-r--r--src/plugins/emoji.rs4
-rw-r--r--src/plugins/help.rs4
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)
}
}