diff options
Diffstat (limited to 'src/plugins/factoid')
| -rw-r--r-- | src/plugins/factoid/mod.rs | 31 | ||||
| -rw-r--r-- | src/plugins/factoid/utils.rs | 10 |
2 files changed, 22 insertions, 19 deletions
diff --git a/src/plugins/factoid/mod.rs b/src/plugins/factoid/mod.rs index 4fcc7a0..5a484e6 100644 --- a/src/plugins/factoid/mod.rs +++ b/src/plugins/factoid/mod.rs @@ -210,20 +210,23 @@ impl<T: Database, C: Client> Factoid<T, C> { .collect::<Vec<String>>(); let lua = unsafe { Lua::new_with_debug() }; - let globals = lua.globals(); - - globals.set("factoid", code)?; - globals.set("download", lua.create_function(download)?)?; - globals.set("json_decode", lua.create_function(json_decode)?)?; - globals.set("sleep", lua.create_function(sleep)?)?; - 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")?; + let output = lua.context(|ctx| { + let globals = ctx.globals(); + + globals.set("factoid", code)?; + globals.set("download", ctx.create_function(|ctx, url| download(&ctx, url))?)?; + globals.set("json_decode", ctx.create_function(|ctx, json| json_decode(&ctx, json))?)?; + globals.set("sleep", ctx.create_function(|ctx, ms| sleep(&ctx, ms))?)?; + 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", ctx.create_table()?)?; + + ctx.load(LUA_SANDBOX).set_name(name)?.exec()?; + + Ok(globals.get::<_, Vec<String>>("output")?) + })?; Ok(output.join("|")) } diff --git a/src/plugins/factoid/utils.rs b/src/plugins/factoid/utils.rs index 7bd9b20..bd1bf43 100644 --- a/src/plugins/factoid/utils.rs +++ b/src/plugins/factoid/utils.rs @@ -5,19 +5,19 @@ use serde_json::{self, Value as SerdeValue}; use super::rlua::Error as LuaError; use super::rlua::Error::RuntimeError; -use super::rlua::{Lua, Value as LuaValue}; +use super::rlua::{Context, Value as LuaValue}; use utils::error::ErrorKind::Connection; use utils::Url; use failure::Fail; -pub fn sleep(_: &Lua, dur: u64) -> Result<(), LuaError> { +pub fn sleep(_: &Context, dur: u64) -> Result<(), LuaError> { thread::sleep(Duration::from_millis(dur)); Ok(()) } -pub fn download(_: &Lua, url: String) -> Result<String, LuaError> { +pub fn download(_: &Context, url: String) -> Result<String, LuaError> { let url = Url::from(url).max_kib(1024); match url.request() { Ok(v) => Ok(v), @@ -36,7 +36,7 @@ pub fn download(_: &Lua, url: String) -> Result<String, LuaError> { } } -fn convert_value(lua: &Lua, sval: SerdeValue, max_recurs: usize) -> Result<LuaValue, LuaError> { +fn convert_value<'l>(lua: &Context<'l>, sval: SerdeValue, max_recurs: usize) -> Result<LuaValue<'l>, LuaError> { if max_recurs == 0 { return Err(RuntimeError(String::from( "Reached max recursion level - json is nested too deep", @@ -74,7 +74,7 @@ fn convert_value(lua: &Lua, sval: SerdeValue, max_recurs: usize) -> Result<LuaVa Ok(lval) } -pub fn json_decode(lua: &Lua, json: String) -> Result<LuaValue, LuaError> { +pub fn json_decode<'l>(lua: &Context<'l>, json: String) -> Result<LuaValue<'l>, LuaError> { let ser_val: SerdeValue = serde_json::from_str(&json).map_err(|e| RuntimeError(e.to_string()))?; |
