86 lines
2.3 KiB
Rust
86 lines
2.3 KiB
Rust
pub mod block;
|
|
pub mod client;
|
|
pub mod container;
|
|
pub mod direction;
|
|
pub mod events;
|
|
pub mod logging;
|
|
pub mod nochatreports;
|
|
pub mod player;
|
|
pub mod system;
|
|
pub mod vec3;
|
|
|
|
use crate::{ListenerMap, build_info::built};
|
|
use mlua::{Lua, Table};
|
|
use std::{io, time::Duration};
|
|
|
|
#[derive(Debug)]
|
|
#[allow(dead_code)]
|
|
pub enum Error {
|
|
CreateEnv(mlua::Error),
|
|
EvalChunk(mlua::Error),
|
|
ExecChunk(mlua::Error),
|
|
LoadChunk(mlua::Error),
|
|
MissingPath(mlua::Error),
|
|
ReadFile(io::Error),
|
|
}
|
|
|
|
pub fn register_globals(
|
|
lua: &Lua,
|
|
globals: &Table,
|
|
event_listeners: ListenerMap,
|
|
) -> mlua::Result<()> {
|
|
globals.set("CARGO_PKG_VERSION", env!("CARGO_PKG_VERSION"))?;
|
|
globals.set("GIT_COMMIT_HASH", built::GIT_COMMIT_HASH)?;
|
|
globals.set("GIT_COMMIT_HASH_SHORT", built::GIT_COMMIT_HASH_SHORT)?;
|
|
|
|
globals.set(
|
|
"sleep",
|
|
lua.create_async_function(async |_, duration: u64| {
|
|
tokio::time::sleep(Duration::from_millis(duration)).await;
|
|
Ok(())
|
|
})?,
|
|
)?;
|
|
|
|
block::register_globals(lua, globals)?;
|
|
events::register_globals(lua, globals, event_listeners)?;
|
|
logging::register_globals(lua, globals)?;
|
|
nochatreports::register_globals(lua, globals)?;
|
|
system::register_globals(lua, globals)
|
|
}
|
|
|
|
pub fn reload(lua: &Lua, sender: Option<String>) -> Result<(), Error> {
|
|
lua.load(
|
|
&std::fs::read_to_string(
|
|
lua.globals()
|
|
.get::<String>("SCRIPT_PATH")
|
|
.map_err(Error::MissingPath)?,
|
|
)
|
|
.map_err(Error::ReadFile)?,
|
|
)
|
|
.set_environment(create_env(lua, sender)?)
|
|
.exec()
|
|
.map_err(Error::LoadChunk)
|
|
}
|
|
|
|
pub async fn eval(lua: &Lua, code: &str, sender: Option<String>) -> Result<String, Error> {
|
|
lua.load(code)
|
|
.set_environment(create_env(lua, sender)?)
|
|
.eval_async::<String>()
|
|
.await
|
|
.map_err(Error::EvalChunk)
|
|
}
|
|
|
|
pub async fn exec(lua: &Lua, code: &str, sender: Option<String>) -> Result<(), Error> {
|
|
lua.load(code)
|
|
.set_environment(create_env(lua, sender)?)
|
|
.exec_async()
|
|
.await
|
|
.map_err(Error::ExecChunk)
|
|
}
|
|
|
|
fn create_env(lua: &Lua, sender: Option<String>) -> Result<Table, Error> {
|
|
let globals = lua.globals();
|
|
globals.set("sender", sender).map_err(Error::CreateEnv)?;
|
|
Ok(globals)
|
|
}
|