This commit is contained in:
ntr 2019-09-10 16:44:36 +10:00
parent c853299c46
commit c4e99fd027
7 changed files with 280 additions and 156 deletions

7
server/bin/main.rs Normal file
View File

@ -0,0 +1,7 @@
extern crate mnml;
use mnml::start;
fn main() {
start()
}

View File

@ -782,6 +782,24 @@ pub fn instance_game_finished(tx: &mut Transaction, game: &Game, instance_id: Uu
Ok(())
}
pub fn bot_instance() -> Instance {
let mut instance = Instance::new();
let bot_player = bot_player();
let bot = bot_player.id;
instance.add_player(bot_player).unwrap();
let player_account = Uuid::new_v4();
let constructs = instance_mobs(player_account);
let player = Player::new(player_account, &"test".to_string(), constructs).set_bot(true);
instance.add_player(player).expect("could not add player");
instance.player_ready(player_account).unwrap();
instance.player_ready(bot).unwrap();
return instance;
}
#[cfg(test)]
mod tests {
use super::*;

160
server/src/lib.rs Normal file
View File

@ -0,0 +1,160 @@
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 urlencoded;
extern crate persistent;
extern crate router;
extern crate mount;
extern crate cookie;
extern crate lettre;
extern crate lettre_email;
extern crate ws;
extern crate crossbeam_channel;
mod account;
mod acp;
mod construct;
mod effect;
mod game;
mod instance;
mod item;
mod img;
mod mail;
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};
#[derive(Serialize)]
struct JsonLog {
time: String,
module: String,
level: String,
msg: String,
}
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 json = fern::Dispatch::new()
.format(|out, message, record| {
let json = JsonLog {
time: chrono::Local::now().to_rfc3339(),
module: record.target().to_string(),
level: record.level().to_string(),
msg: message.to_string()
};
out.finish(format_args!(
"{}",
serde_json::to_string(&json).unwrap(),
))
})
.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(json)
.apply()?;
Ok(())
}
pub fn start() {
setup_logger().unwrap();
dotenv::from_path(Path::new("/etc/mnml/gs.conf")).ok();
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();
let (mail_tx, mail_rx) = unbounded();
let http_mail_tx = mail_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, mail_tx);
let warden = warden::Warden::new(warden_tx, warden_rx, events.tx.clone(), pool.clone());
let pg_pool = pool.clone();
let mailer = mail::listen(mail_rx);
let stripe = payments::stripe_client();
spawn(move || http::start(http_pool, mailer));
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, stripe);
}

View File

@ -1,160 +1,7 @@
extern crate rand;
extern crate uuid;
extern crate bcrypt;
extern crate chrono;
extern crate mnml;
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 urlencoded;
extern crate persistent;
extern crate router;
extern crate mount;
extern crate cookie;
extern crate lettre;
extern crate lettre_email;
extern crate ws;
extern crate crossbeam_channel;
mod account;
mod acp;
mod construct;
mod effect;
mod game;
mod instance;
mod item;
mod img;
mod mail;
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};
#[derive(Serialize)]
struct JsonLog {
time: String,
module: String,
level: String,
msg: String,
}
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 json = fern::Dispatch::new()
.format(|out, message, record| {
let json = JsonLog {
time: chrono::Local::now().to_rfc3339(),
module: record.target().to_string(),
level: record.level().to_string(),
msg: message.to_string()
};
out.finish(format_args!(
"{}",
serde_json::to_string(&json).unwrap(),
))
})
.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(json)
.apply()?;
Ok(())
}
use mnml::start;
fn main() {
setup_logger().unwrap();
dotenv::from_path(Path::new("/etc/mnml/gs.conf")).ok();
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();
let (mail_tx, mail_rx) = unbounded();
let http_mail_tx = mail_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, mail_tx);
let warden = warden::Warden::new(warden_tx, warden_rx, events.tx.clone(), pool.clone());
let pg_pool = pool.clone();
let mailer = mail::listen(mail_rx);
let stripe = payments::stripe_client();
spawn(move || http::start(http_pool, mailer));
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, stripe);
start()
}

4
svt/.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
target/
Cargo.lock
log/
.env

13
svt/Cargo.toml Normal file
View File

@ -0,0 +1,13 @@
[package]
name = "mnml_svt"
version = "0.1.0"
authors = ["ntr <ntr@mnml.gg>"]
edition = "2018"
[dependencies]
ws = "0.8"
reqwest = "0.9"
rand = "0.6"
url = "1"
cookie = "0.12"

75
svt/src/main.rs Normal file
View File

@ -0,0 +1,75 @@
extern crate reqwest;
extern crate rand;
extern crate ws;
use std::thread;
use rand::distributions::Alphanumeric;
use rand::{thread_rng, Rng};
use reqwest::header;
use std::iter;
use ws::{connect, CloseCode, Message, Handler, Sender, Result, Request, Response};
struct Bot {
out: Sender,
token: String,
}
impl Handler for Bot {
fn build_request(&mut self, url: &url::Url) -> Result<Request> {
let mut req = Request::from_url(url)?;
let headers = req.headers_mut();
headers.push(("x-auth-token".to_string(), Vec::from(self.token.clone())));
Ok(req)
}
fn on_open(&mut self, _: ws::Handshake) -> ws::Result<()> {
println!("websocket connected");
Ok(())
}
}
fn main() {
let mut rng = thread_rng();
let name: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(12).collect();
let password: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(12).collect();
let mut headers = header::HeaderMap::new();
headers.insert(header::CONTENT_TYPE, header::HeaderValue::from_static("application/json"));
let client = reqwest::Client::builder()
.cookie_store(true)
.default_headers(headers)
.build()
.unwrap();
let register_body = format!("{{ \"name\": {:?}, \"password\": {:?}, \"code\": \"grep842\" }}", name, password);
println!("{:?}", register_body);
let account = client.post("http://localhost/api/account/register")
.body(register_body)
.send()
.unwrap();
println!("{:?}", account.headers().get("set-cookie"));
// Client thread
let client = thread::Builder::new().name(name).spawn(move || {
connect("ws://localhost/api/ws", |out| {
let token_cookie = account.cookies()
.find(|c| c.name() == "x-auth-token")
.unwrap();
Bot {
out: out,
token: token_cookie.value().to_string(),
}
}).unwrap()
}).unwrap();
client.join().unwrap()
}