aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/factoids.rs
diff options
context:
space:
mode:
authorJokler <jokler.contact@gmail.com>2017-10-20 01:07:48 +0200
committerJokler <jokler.contact@gmail.com>2017-12-24 00:12:07 +0100
commite8b4f54ef9910f733f5d4785a906fc6ca185167b (patch)
tree95efd15c23ab4a4840e9e172c62a8a5c3b1b8e2b /src/plugins/factoids.rs
parent5f1b2465080b7343869256c09ceda8025b30f3fa (diff)
downloadfrippy-e8b4f54ef9910f733f5d4785a906fc6ca185167b.tar.gz
frippy-e8b4f54ef9910f733f5d4785a906fc6ca185167b.zip
Move the Factoids plugin into a subfolder
Diffstat (limited to 'src/plugins/factoids.rs')
-rw-r--r--src/plugins/factoids.rs161
1 files changed, 0 insertions, 161 deletions
diff --git a/src/plugins/factoids.rs b/src/plugins/factoids.rs
deleted file mode 100644
index a6cb5c3..0000000
--- a/src/plugins/factoids.rs
+++ /dev/null
@@ -1,161 +0,0 @@
-extern crate rlua;
-
-use self::rlua::prelude::*;
-use irc::client::prelude::*;
-use irc::error::Error as IrcError;
-
-use std::collections::HashMap;
-use std::sync::Mutex;
-
-use plugin::*;
-
-#[derive(PluginName, Debug)]
-pub struct Factoids {
- factoids: Mutex<HashMap<String, String>>,
-}
-
-macro_rules! try_lock {
- ( $m:expr ) => {
- match $m.lock() {
- Ok(guard) => guard,
- Err(poisoned) => poisoned.into_inner(),
- }
- }
-}
-
-static LUA_SANDBOX: &'static str = include_str!("sandbox.lua");
-
-impl Factoids {
- pub fn new() -> Factoids {
- Factoids { factoids: Mutex::new(HashMap::new()) }
- }
-
- fn add(&self, server: &IrcServer, command: &mut PluginCommand) -> Result<(), IrcError> {
-
- if command.tokens.len() < 2 {
- return self.invalid_command(server, command);
- }
-
- let name = command.tokens.remove(0);
-
- try_lock!(self.factoids)
- .insert(name, command.tokens.join(" "));
-
- server.send_notice(&command.source, "Successfully added")
- }
-
- fn get(&self, server: &IrcServer, command: &PluginCommand) -> Result<(), IrcError> {
-
- if command.tokens.len() < 1 {
- self.invalid_command(server, command)
-
- } else {
- let name = &command.tokens[0];
- let factoids = try_lock!(self.factoids);
- let factoid = match factoids.get(name) {
- Some(v) => v,
- None => return self.invalid_command(server, command),
- };
-
- server.send_privmsg(&command.target, &format!("{}: {}", name, factoid))
- }
- }
-
- fn exec(&self, server: &IrcServer, mut command: PluginCommand) -> Result<(), IrcError> {
-
- if command.tokens.len() < 1 {
- self.invalid_command(server, &command)
-
- } else {
- let name = command.tokens.remove(0);
-
- let factoids = try_lock!(self.factoids);
- let factoid = match factoids.get(&name) {
- Some(v) => v,
- None => return self.invalid_command(server, &command),
- };
-
- let value = match self.run_lua(&name, factoid, &command) {
- Ok(v) => v,
- Err(e) => format!("{}", e),
- };
-
- server.send_privmsg(&command.target, &value)
- }
- }
-
- fn run_lua(&self,
- name: &str,
- code: &str,
- command: &PluginCommand)
- -> Result<String, rlua::Error> {
-
- let args = command
- .tokens
- .iter()
- .filter(|x| !x.is_empty())
- .map(ToOwned::to_owned)
- .collect::<Vec<String>>();
-
- let lua = Lua::new();
- let globals = lua.globals();
-
- globals.set("factoid", lua.load(code, Some(name))?)?;
- globals.set("args", args)?;
- globals.set("input", command.tokens.join(" "))?;
- globals.set("user", command.source.clone())?;
- globals.set("channel", command.target.clone())?;
- globals.set("output", lua.create_table())?;
-
- lua.exec::<()>(LUA_SANDBOX, Some(name))?;
- let output: Vec<String> = globals.get::<_, Vec<String>>("output")?;
-
- Ok(output.join("|"))
- }
-
- fn invalid_command(&self, server: &IrcServer, command: &PluginCommand) -> Result<(), IrcError> {
- server.send_notice(&command.source, "Invalid Command")
- }
-}
-
-impl Plugin for Factoids {
- fn is_allowed(&self, _: &IrcServer, message: &Message) -> bool {
- match message.command {
- Command::PRIVMSG(_, ref content) => content.starts_with('!'),
- _ => false,
- }
- }
-
- fn execute(&self, server: &IrcServer, message: &Message) -> Result<(), IrcError> {
- if let Command::PRIVMSG(_, mut content) = message.command.clone() {
- content.remove(0);
-
- let t: Vec<String> = content.split(' ').map(ToOwned::to_owned).collect();
-
- let c = PluginCommand {
- source: message.source_nickname().unwrap().to_string(),
- target: message.response_target().unwrap().to_string(),
- tokens: t,
- };
-
- self.exec(server, c)
-
- } else {
- Ok(())
- }
- }
-
- fn command(&self, server: &IrcServer, mut command: PluginCommand) -> Result<(), IrcError> {
- if command.tokens.is_empty() {
- return self.invalid_command(server, &command);
- }
-
- let sub_command = command.tokens.remove(0);
- match sub_command.as_ref() {
- "add" => self.add(server, &mut command),
- "get" => self.get(server, &command),
- "exec" => self.exec(server, command),
- _ => self.invalid_command(server, &command),
- }
- }
-}