From c4e99fd0272e9364f5605063b18379d460e3f386 Mon Sep 17 00:00:00 2001 From: ntr Date: Tue, 10 Sep 2019 16:44:36 +1000 Subject: [PATCH] svt init --- server/bin/main.rs | 7 ++ server/src/instance.rs | 18 +++++ server/src/lib.rs | 160 +++++++++++++++++++++++++++++++++++++++++ server/src/main.rs | 159 +--------------------------------------- svt/.gitignore | 4 ++ svt/Cargo.toml | 13 ++++ svt/src/main.rs | 75 +++++++++++++++++++ 7 files changed, 280 insertions(+), 156 deletions(-) create mode 100644 server/bin/main.rs create mode 100644 server/src/lib.rs create mode 100644 svt/.gitignore create mode 100644 svt/Cargo.toml create mode 100644 svt/src/main.rs diff --git a/server/bin/main.rs b/server/bin/main.rs new file mode 100644 index 00000000..7c9ad5d1 --- /dev/null +++ b/server/bin/main.rs @@ -0,0 +1,7 @@ +extern crate mnml; + +use mnml::start; + +fn main() { + start() +} diff --git a/server/src/instance.rs b/server/src/instance.rs index 92812673..58a7feeb 100644 --- a/server/src/instance.rs +++ b/server/src/instance.rs @@ -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::*; diff --git a/server/src/lib.rs b/server/src/lib.rs new file mode 100644 index 00000000..1e88ce73 --- /dev/null +++ b/server/src/lib.rs @@ -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); +} diff --git a/server/src/main.rs b/server/src/main.rs index cad0c1f7..7c9ad5d1 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -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() } diff --git a/svt/.gitignore b/svt/.gitignore new file mode 100644 index 00000000..9e853f6c --- /dev/null +++ b/svt/.gitignore @@ -0,0 +1,4 @@ +target/ +Cargo.lock +log/ +.env \ No newline at end of file diff --git a/svt/Cargo.toml b/svt/Cargo.toml new file mode 100644 index 00000000..6aa65959 --- /dev/null +++ b/svt/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "mnml_svt" +version = "0.1.0" +authors = ["ntr "] +edition = "2018" + +[dependencies] +ws = "0.8" +reqwest = "0.9" +rand = "0.6" +url = "1" +cookie = "0.12" + diff --git a/svt/src/main.rs b/svt/src/main.rs new file mode 100644 index 00000000..2791fbaf --- /dev/null +++ b/svt/src/main.rs @@ -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 { + 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() +}