use std::borrow::Cow; use std::net::SocketAddr; use std::time::Duration; use std::io::Write; use chrono::Utc; use env_logger::Env; use log::info; use mlua::Lua; use network::NetworkServer; use plugins::Plugins; use crate::config::load_config; mod config; mod plugins; mod protocol; mod network; pub const VERSION: &str = std::env!("CARGO_PKG_VERSION"); fn main() { env_logger::Builder::from_env( Env::default().default_filter_or("info") ).format(|buf, record| { let now = Utc::now().format("%Y-%m-%d %H:%M:%S"); let mut target = Cow::Borrowed(record.target()); if target.starts_with("quectocraft") { target = Cow::Owned(record.target().replacen("quectocraft", "qc", 1)); } let color = match record.level() { log::Level::Error => "\x1b[31m", log::Level::Warn => "\x1b[33m", log::Level::Info => "\x1b[32m", log::Level::Debug => "\x1b[37m", log::Level::Trace => "\x1b[37m", }; writeln!(buf, "\x1b[90m[\x1b[37m{} {color}{}\x1b[37m {}\x1b[90m]\x1b[0m {}", now, record.level(), target, record.args()) }).init(); let config = load_config().expect("Failed to load config"); let addr = SocketAddr::new(config.addr, config.port); info!("Starting Quectocraft version {}", VERSION); let lua = Lua::new(); let mut plugins = Plugins::new(&lua).expect("Error initializing lua environment"); std::fs::create_dir_all("plugins").expect("Couldn't create the plugins directory"); plugins.load_plugins(); let mut server = NetworkServer::new(addr, plugins); let sleep_dur = Duration::from_millis(5); let mut i = 0; loop { server.get_new_clients(); server.handle_connections(); if i % 1024 == 0 { server.send_keep_alive(); i = 0; } i += 1; std::thread::sleep(sleep_dur); } }