elseware/src/main.rs

210 lines
7.3 KiB
Rust
Raw Normal View History

2019-11-23 19:01:03 -08:00
#![allow(incomplete_features)]
2019-10-09 22:45:51 -07:00
#![feature(const_generics)]
2019-11-23 19:01:03 -08:00
#![feature(maybe_uninit_extra)]
2020-01-11 08:36:51 -08:00
#![feature(const_in_array_repeat_expressions)]
2019-10-09 22:45:51 -07:00
mod common;
mod entity;
mod patch;
mod login;
mod ship;
2019-10-17 22:35:46 -07:00
use std::time::SystemTime;
2019-12-18 19:31:25 -08:00
use log::{info};
2019-10-09 22:45:51 -07:00
2019-12-22 20:43:18 -04:00
use patch::patch::{PatchServerState, generate_patch_tree, load_config, load_motd};
2019-10-09 22:45:51 -07:00
use login::login::LoginServerState;
use login::character::CharacterServerState;
use ship::ship::ShipServerState;
2020-03-16 20:43:20 -07:00
use entity::account::UserAccount;
2019-10-09 22:45:51 -07:00
use entity::gateway::{EntityGateway, InMemoryGateway};
2019-12-18 19:31:25 -08:00
use entity::item::ItemLocation;
2020-01-31 09:13:52 -08:00
use crate::entity::item;
2019-10-09 22:45:51 -07:00
2019-12-18 19:31:25 -08:00
fn setup_logger() {
let colors = fern::colors::ColoredLevelConfig::new()
.error(fern::colors::Color::Red)
.warn(fern::colors::Color::Yellow)
.info(fern::colors::Color::Green)
.debug(fern::colors::Color::White)
.trace(fern::colors::Color::BrightBlack);
let stdio = fern::Dispatch::new()
.level(log::LevelFilter::Debug)
.format(move |out, message, record| {
out.finish(format_args!(
"\x1B[{}m[{}][{}][{}] {}\x1B[0m",
colors.get_color(&record.level()).to_fg_str(),
chrono::Local::now().format("%Y-%m-%d %H:%M:%S"),
record.target(),
record.level(),
message,
))
})
.chain(std::io::stdout());
let fileout = fern::Dispatch::new()
.level(log::LevelFilter::Trace)
2019-12-22 20:43:18 -04:00
.chain(fern::log_file(format!("elseware-{}.log", chrono::Local::now().format("%Y-%m-%d_%H:%M:%S"))).unwrap());
2019-12-18 19:31:25 -08:00
fern::Dispatch::new()
.chain(stdio)
.chain(fileout)
.apply().unwrap();
}
2019-11-20 22:49:13 -08:00
2019-10-09 22:45:51 -07:00
fn main() {
2019-12-18 19:31:25 -08:00
setup_logger();
2019-10-17 22:35:46 -07:00
let mut entity_gateway = InMemoryGateway::new();
let fake_user = UserAccount {
id: 1,
username: "hi".to_string(),
password: bcrypt::hash("qwer", 5).unwrap(),
2020-03-22 22:40:40 -03:00
guildcard: 1u32,
2019-10-17 22:35:46 -07:00
team_id: None,
banned: false,
muted_until: SystemTime::now(),
created_at: SystemTime::now(),
flags: 0,
};
entity_gateway.set_user(&fake_user);
entity_gateway.create_user_settings_by_user(&fake_user);
let mut character = entity_gateway.new_character_by_user(&fake_user);
character.name = "Test Char 1".into();
2020-03-22 22:40:40 -03:00
entity_gateway.create_guild_card_by_character(&character);
2019-10-17 22:35:46 -07:00
entity_gateway.set_character(&character);
let mut character = entity_gateway.new_character_by_user(&fake_user);
character.slot = 2;
character.name = "\tE12345678".into();
character.exp = 80000000;
2020-03-22 22:40:40 -03:00
entity_gateway.create_guild_card_by_character(&character);
2019-10-17 22:35:46 -07:00
entity_gateway.set_character(&character);
2019-10-09 22:45:51 -07:00
2020-01-31 09:13:52 -08:00
entity_gateway.new_item(
item::ItemDetail::Weapon(
item::weapon::Weapon {
weapon: item::weapon::WeaponType::Handgun,
grind: 5,
special: None,
attrs: [None; 3],
2020-01-31 09:13:52 -08:00
equipped: true,
2020-03-14 10:44:27 -07:00
tekked: true,
2020-01-31 09:13:52 -08:00
}
),
ItemLocation::Inventory {
character_id: character.id,
index: 0,
}
);
let fake_user2 = UserAccount {
id: 2,
username: "hi2".to_string(),
password: bcrypt::hash("qwer", 5).unwrap(),
2020-03-22 22:40:40 -03:00
guildcard: 2u32,
team_id: None,
banned: false,
muted_until: SystemTime::now(),
created_at: SystemTime::now(),
flags: 0,
};
entity_gateway.set_user(&fake_user2);
entity_gateway.create_user_settings_by_user(&fake_user2);
let mut character = entity_gateway.new_character_by_user(&fake_user2);
character.name = "Test Char 3".into();
2020-03-22 22:40:40 -03:00
entity_gateway.create_guild_card_by_character(&character);
entity_gateway.set_character(&character);
let mut character = entity_gateway.new_character_by_user(&fake_user2);
character.slot = 2;
character.name = "Test Char 4".into();
2020-03-22 22:40:40 -03:00
entity_gateway.create_guild_card_by_character(&character);
entity_gateway.set_character(&character);
let fake_user3 = UserAccount {
id: 3,
username: "hi3".to_string(),
password: bcrypt::hash("qwer", 5).unwrap(),
2020-03-22 22:40:40 -03:00
guildcard: 3u32,
team_id: None,
banned: false,
muted_until: SystemTime::now(),
created_at: SystemTime::now(),
flags: 0,
};
entity_gateway.set_user(&fake_user3);
entity_gateway.create_user_settings_by_user(&fake_user3);
let mut character = entity_gateway.new_character_by_user(&fake_user3);
character.name = "Test Char 5".into();
2020-03-22 22:40:40 -03:00
entity_gateway.create_guild_card_by_character(&character);
entity_gateway.set_character(&character);
let mut character = entity_gateway.new_character_by_user(&fake_user3);
character.slot = 2;
character.name = "Test Char 6".into();
2020-03-22 22:40:40 -03:00
entity_gateway.create_guild_card_by_character(&character);
entity_gateway.set_character(&character);
let fake_user4 = UserAccount {
id: 4,
username: "hi4".to_string(),
password: bcrypt::hash("qwer", 5).unwrap(),
2020-03-22 22:40:40 -03:00
guildcard: 4u32,
team_id: None,
banned: false,
muted_until: SystemTime::now(),
created_at: SystemTime::now(),
flags: 0,
};
entity_gateway.set_user(&fake_user4);
entity_gateway.create_user_settings_by_user(&fake_user4);
let mut character = entity_gateway.new_character_by_user(&fake_user4);
character.name = "Test Char 7".into();
2020-03-22 22:40:40 -03:00
entity_gateway.create_guild_card_by_character(&character);
entity_gateway.set_character(&character);
let mut character = entity_gateway.new_character_by_user(&fake_user4);
character.slot = 2;
character.name = "Test Char 8".into();
2020-03-22 22:40:40 -03:00
entity_gateway.create_guild_card_by_character(&character);
entity_gateway.set_character(&character);
2020-01-23 18:00:34 -08:00
async_std::task::block_on(async move {
let thread_entity_gateway = entity_gateway.clone();
let patch = async_std::task::spawn(async {
info!("[patch] starting server");
let patch_config = load_config();
let patch_motd = load_motd();
let (patch_file_tree, patch_file_lookup) = generate_patch_tree(patch_config.path.as_str());
let patch_state = PatchServerState::new(patch_file_tree, patch_file_lookup, patch_motd);
crate::common::mainloop::mainloop_async(patch_state, patch_config.port).await;
});
let thread_entity_gateway = entity_gateway.clone();
let auth = async_std::task::spawn(async {
info!("[auth] starting server");
let auth_state = LoginServerState::new(thread_entity_gateway);
2019-10-09 22:45:51 -07:00
2020-01-23 18:00:34 -08:00
common::mainloop::mainloop_async(auth_state, login::login::LOGIN_PORT).await;
});
let thread_entity_gateway = entity_gateway.clone();
let character = async_std::task::spawn(async {
info!("[character] starting server");
let char_state = CharacterServerState::new(thread_entity_gateway);
common::mainloop::mainloop_async(char_state, login::character::CHARACTER_PORT).await;
});
let thread_entity_gateway = entity_gateway.clone();
let ship = async_std::task::spawn(async {
info!("[ship] starting server");
let ship_state = ShipServerState::new(thread_entity_gateway);
common::mainloop::mainloop_async(ship_state, ship::ship::SHIP_PORT).await;
});
futures::join!(patch, auth, character, ship);
});
2019-10-09 22:45:51 -07:00
}