summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs10
-rw-r--r--src/plugin.rs29
-rw-r--r--src/plugins/currency.rs14
-rw-r--r--src/plugins/emoji.rs13
4 files changed, 27 insertions, 39 deletions
diff --git a/src/lib.rs b/src/lib.rs
index ca1aafe..04210a6 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -13,11 +13,12 @@
#[macro_use]
extern crate lazy_static;
+#[macro_use]
+extern crate plugin_derive;
extern crate irc;
extern crate regex;
-#[macro_use]
mod plugin;
mod plugins;
@@ -28,8 +29,7 @@ use irc::client::prelude::*;
use irc::proto::Command::PRIVMSG;
use irc::error::Error as IrcError;
-use plugin::Plugin;
-use plugin::PluginCommand;
+use plugin::*;
/// Runs the bot
///
@@ -49,7 +49,7 @@ pub fn run() {
// if they use an incorrect plugin name
let plugin_names: Vec<String> = plugins
.iter()
- .map(|p| p.lock().unwrap().to_string().to_lowercase())
+ .map(|p| p.lock().unwrap().name().to_lowercase())
.collect();
// The main loop over received messages
@@ -101,7 +101,7 @@ pub fn run() {
// Check if the command is for this plugin
if let Some(mut c) = command {
if !c.tokens.is_empty() &&
- plugin.to_string().to_lowercase() == c.tokens[0].to_lowercase() {
+ plugin.name().to_lowercase() == c.tokens[0].to_lowercase() {
// The first token contains the name of the plugin
c.tokens.remove(0);
diff --git a/src/plugin.rs b/src/plugin.rs
index 3791bf1..0a4034d 100644
--- a/src/plugin.rs
+++ b/src/plugin.rs
@@ -2,38 +2,19 @@ use std::fmt;
use irc::client::prelude::*;
use irc::error::Error as IrcError;
-pub trait Plugin: Send + Sync + fmt::Display + fmt::Debug {
+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>;
}
+pub trait PluginName: Send + Sync + fmt::Debug {
+ fn name(&self) -> &str;
+}
+
#[derive(Clone, Debug)]
pub struct PluginCommand {
pub source: String,
pub target: String,
pub tokens: Vec<String>,
}
-
-macro_rules! register_plugin {
- ($t:ident) => {
- use std::fmt;
-
- #[derive(Debug)]
- pub struct $t {
- _name: &'static str,
- }
-
- impl fmt::Display for $t {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "{}", self._name)
- }
- }
-
- impl $t {
- pub fn new() -> $t {
- $t { _name: stringify!($t) }
- }
- }
- };
-}
diff --git a/src/plugins/currency.rs b/src/plugins/currency.rs
index b2320ac..d29e560 100644
--- a/src/plugins/currency.rs
+++ b/src/plugins/currency.rs
@@ -6,14 +6,14 @@ extern crate regex;
use std::io::Read;
use irc::client::prelude::*;
use irc::error::Error as IrcError;
-use plugin::Plugin;
use self::reqwest::Client;
use self::reqwest::header::Connection;
use self::serde_json::Value;
-use PluginCommand;
+use plugin::*;
-register_plugin!(Currency);
+#[derive(PluginName, Debug)]
+pub struct Currency;
struct ConvertionRequest<'a> {
value: f64,
@@ -62,6 +62,11 @@ impl<'a> ConvertionRequest<'a> {
}
impl Currency {
+
+ pub fn new() -> Currency {
+ Currency {}
+ }
+
fn eval_command<'a>(&self, tokens: &'a [String]) -> Option<ConvertionRequest<'a>> {
let parsed = match tokens[0].parse() {
Ok(v) => v,
@@ -144,5 +149,4 @@ impl Plugin for Currency {
}
#[cfg(test)]
-mod tests {
-}
+mod tests {}
diff --git a/src/plugins/emoji.rs b/src/plugins/emoji.rs
index c7054d8..b08b1b7 100644
--- a/src/plugins/emoji.rs
+++ b/src/plugins/emoji.rs
@@ -2,12 +2,16 @@ extern crate unicode_names;
use irc::client::prelude::*;
use irc::error::Error as IrcError;
-use plugin::Plugin;
-use PluginCommand;
-register_plugin!(Emoji);
+use plugin::*;
+#[derive(PluginName, Debug)]
+pub struct Emoji;
impl Emoji {
+ pub fn new() -> Emoji {
+ Emoji {}
+ }
+
fn emoji(&self, server: &IrcServer, content: &str, target: &str) -> Result<(), IrcError> {
let mut names: Vec<String> = Vec::new();
@@ -73,5 +77,4 @@ impl Plugin for Emoji {
}
#[cfg(test)]
-mod tests {
-}
+mod tests {}