139 lines
3.6 KiB
Rust
139 lines
3.6 KiB
Rust
extern crate rand;
|
|
extern crate uuid;
|
|
extern crate bcrypt;
|
|
extern crate chrono;
|
|
|
|
extern crate dotenv;
|
|
extern crate postgres;
|
|
extern crate r2d2;
|
|
extern crate r2d2_postgres;
|
|
extern crate fallible_iterator;
|
|
|
|
extern crate serde;
|
|
extern crate serde_cbor;
|
|
#[macro_use] extern crate serde_derive;
|
|
#[macro_use] extern crate failure;
|
|
|
|
extern crate fern;
|
|
#[macro_use] extern crate log;
|
|
|
|
extern crate stripe;
|
|
|
|
extern crate iron;
|
|
extern crate bodyparser;
|
|
extern crate persistent;
|
|
extern crate router;
|
|
extern crate mount;
|
|
extern crate cookie;
|
|
|
|
extern crate ws;
|
|
extern crate crossbeam_channel;
|
|
|
|
mod account;
|
|
mod acp;
|
|
mod construct;
|
|
mod effect;
|
|
mod game;
|
|
mod instance;
|
|
mod item;
|
|
mod img;
|
|
mod mob;
|
|
mod mtx;
|
|
mod names;
|
|
mod http;
|
|
mod payments;
|
|
mod pg;
|
|
mod player;
|
|
mod events;
|
|
mod rpc;
|
|
mod skill;
|
|
mod spec;
|
|
mod util;
|
|
mod vbox;
|
|
mod warden;
|
|
|
|
use std::thread::{spawn};
|
|
use std::path::{Path};
|
|
use fern::colors::{Color, ColoredLevelConfig};
|
|
|
|
use crossbeam_channel::{unbounded};
|
|
|
|
fn setup_logger() -> Result<(), fern::InitError> {
|
|
let colors_line = ColoredLevelConfig::new()
|
|
.error(Color::Red)
|
|
.warn(Color::Yellow)
|
|
.info(Color::BrightWhite)
|
|
.debug(Color::BrightWhite)
|
|
.trace(Color::BrightBlack);
|
|
|
|
let colors_level = colors_line.clone().info(Color::Green);
|
|
let term = fern::Dispatch::new()
|
|
.format(move |out, message, record| {
|
|
out.finish(format_args!(
|
|
"{color_line}[{date}][{target}][{level}{color_line}] {message}\x1B[0m",
|
|
color_line = format_args!("\x1B[{}m", colors_line.get_color(&record.level()).to_fg_str()),
|
|
date = chrono::Local::now().format("%Y-%m-%d %H:%M:%S"),
|
|
target = record.target(),
|
|
level = colors_level.color(record.level()),
|
|
message = message,
|
|
));
|
|
})
|
|
.chain(std::io::stdout());
|
|
|
|
let file = fern::Dispatch::new()
|
|
.format(|out, message, record| {
|
|
out.finish(format_args!(
|
|
"{{\"time\":\"{}\",\"name\":\"{}\",\"level\":\"{}\",\"msg\":\"{}\"}}",
|
|
chrono::Local::now().to_rfc3339(),
|
|
record.target(),
|
|
record.level(),
|
|
message
|
|
))
|
|
})
|
|
.chain(fern::log_file("/var/log/mnml/mnml.log")?);
|
|
|
|
fern::Dispatch::new()
|
|
.level_for("postgres", log::LevelFilter::Info)
|
|
.level_for("ws", log::LevelFilter::Warn)
|
|
.level_for("iron", log::LevelFilter::Info)
|
|
.level(log::LevelFilter::Info)
|
|
.chain(term)
|
|
.chain(file)
|
|
.apply()?;
|
|
|
|
Ok(())
|
|
}
|
|
|
|
fn main() {
|
|
dotenv::from_path(Path::new("/etc/mnml/server.conf")).ok();
|
|
setup_logger().unwrap();
|
|
|
|
let pool = pg::create_pool();
|
|
let http_pool = pool.clone();
|
|
|
|
let (events_tx, events_rx) = unbounded();
|
|
let pg_events_tx = events_tx.clone();
|
|
let rpc_events_tx = events_tx.clone();
|
|
|
|
let (warden_tx, warden_rx) = unbounded();
|
|
let events_warden_tx = warden_tx.clone();
|
|
let warden_tick_tx = warden_tx.clone();
|
|
|
|
// create a clone of the tx so ws handler can tell events
|
|
// about connection status
|
|
let events = events::Events::new(events_tx, events_rx, events_warden_tx);
|
|
let warden = warden::Warden::new(warden_tx, warden_rx, events.tx.clone(), pool.clone());
|
|
|
|
let pg_pool = pool.clone();
|
|
|
|
spawn(move || http::start(http_pool));
|
|
spawn(move || warden.listen());
|
|
spawn(move || warden::upkeep_tick(warden_tick_tx));
|
|
spawn(move || pg::listen(pg_pool, pg_events_tx));
|
|
spawn(move || events.listen());
|
|
|
|
// the main thread becomes this ws listener
|
|
let rpc_pool = pool.clone();
|
|
rpc::start(rpc_pool, rpc_events_tx);
|
|
}
|