svt init
This commit is contained in:
parent
c853299c46
commit
c4e99fd027
7
server/bin/main.rs
Normal file
7
server/bin/main.rs
Normal file
@ -0,0 +1,7 @@
|
||||
extern crate mnml;
|
||||
|
||||
use mnml::start;
|
||||
|
||||
fn main() {
|
||||
start()
|
||||
}
|
||||
@ -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
160
server/src/lib.rs
Normal 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);
|
||||
}
|
||||
@ -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
4
svt/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
target/
|
||||
Cargo.lock
|
||||
log/
|
||||
.env
|
||||
13
svt/Cargo.toml
Normal file
13
svt/Cargo.toml
Normal 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
75
svt/src/main.rs
Normal 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()
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user