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
|
|
|
|
2020-05-28 19:29:21 -06:00
|
|
|
use elseware::patch::patch::{PatchServerState, generate_patch_tree, load_config, load_motd};
|
|
|
|
use elseware::login::login::LoginServerState;
|
|
|
|
use elseware::login::character::CharacterServerState;
|
|
|
|
use elseware::ship::ship::ShipServerState;
|
|
|
|
use elseware::entity::account::{NewUserAccountEntity, NewUserSettingsEntity};
|
|
|
|
use elseware::entity::gateway::{EntityGateway, InMemoryGateway};
|
|
|
|
use elseware::entity::character::NewCharacterEntity;
|
|
|
|
use elseware::entity::item::{NewItemEntity, ItemDetail, ItemLocation};
|
2020-01-31 09:13:52 -08:00
|
|
|
|
2020-05-28 19:29:21 -06:00
|
|
|
use elseware::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)
|
2020-05-28 19:29:21 -06:00
|
|
|
.chain(fern::log_file(format!("log/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();
|
2020-06-02 18:51:18 -06:00
|
|
|
async_std::task::block_on(async move {
|
|
|
|
let mut entity_gateway = InMemoryGateway::new();
|
2019-10-17 22:35:46 -07:00
|
|
|
|
2020-06-02 18:51:18 -06:00
|
|
|
for i in 0..5 {
|
|
|
|
let fake_user = NewUserAccountEntity {
|
|
|
|
username: if i == 0 { "hi".to_string() } else { format!("hi{}", i+1) },
|
|
|
|
password: bcrypt::hash("qwer", 5).unwrap(),
|
|
|
|
guildcard: i + 1,
|
|
|
|
team_id: None,
|
|
|
|
banned: false,
|
|
|
|
muted_until: SystemTime::now(),
|
|
|
|
created_at: SystemTime::now(),
|
|
|
|
flags: 0,
|
|
|
|
};
|
|
|
|
let fake_user = entity_gateway.create_user(fake_user).await.unwrap();
|
|
|
|
entity_gateway.create_user_settings(NewUserSettingsEntity::new(fake_user.id)).await;
|
|
|
|
let mut character = NewCharacterEntity::new(fake_user.id);
|
|
|
|
character.name = format!("Test Char {}", i*2);
|
|
|
|
entity_gateway.create_character(character).await;
|
|
|
|
let mut character = NewCharacterEntity::new(fake_user.id);
|
|
|
|
character.slot = 2;
|
2020-06-27 14:37:48 -03:00
|
|
|
character.name = "ItemRefactor".into();
|
2020-06-02 18:51:18 -06:00
|
|
|
character.exp = 80000000;
|
|
|
|
character.meseta = 999999;
|
|
|
|
let character = entity_gateway.create_character(character).await.unwrap();
|
2020-03-29 22:00:07 -07:00
|
|
|
|
2020-06-02 18:51:18 -06:00
|
|
|
entity_gateway.create_item(
|
|
|
|
NewItemEntity {
|
|
|
|
item: ItemDetail::Weapon(
|
|
|
|
item::weapon::Weapon {
|
|
|
|
weapon: item::weapon::WeaponType::Raygun,
|
|
|
|
grind: 5,
|
|
|
|
special: Some(item::weapon::WeaponSpecial::Hell),
|
|
|
|
attrs: [Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Hit, value: 40}),
|
|
|
|
Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Dark, value: 30}),
|
|
|
|
None,],
|
2020-06-27 14:37:48 -03:00
|
|
|
tekked: true,
|
2020-06-02 18:51:18 -06:00
|
|
|
}
|
|
|
|
),
|
|
|
|
location: ItemLocation::Inventory {
|
|
|
|
character_id: character.id,
|
|
|
|
slot: 0,
|
2020-06-27 14:37:48 -03:00
|
|
|
equipped: false,
|
|
|
|
}
|
|
|
|
}).await;
|
|
|
|
entity_gateway.create_item(
|
|
|
|
NewItemEntity {
|
|
|
|
item: ItemDetail::Weapon(
|
|
|
|
item::weapon::Weapon {
|
|
|
|
weapon: item::weapon::WeaponType::Handgun,
|
|
|
|
grind: 5,
|
|
|
|
special: Some(item::weapon::WeaponSpecial::Charge),
|
|
|
|
attrs: [Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Hit, value: 40}),
|
|
|
|
Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Dark, value: 30}),
|
|
|
|
None,],
|
|
|
|
tekked: true,
|
|
|
|
}
|
|
|
|
),
|
|
|
|
location: ItemLocation::Inventory {
|
|
|
|
character_id: character.id,
|
|
|
|
slot: 1,
|
|
|
|
equipped: false,
|
|
|
|
}
|
|
|
|
}).await;
|
|
|
|
entity_gateway.create_item(
|
|
|
|
NewItemEntity {
|
|
|
|
item: ItemDetail::Weapon(
|
|
|
|
item::weapon::Weapon {
|
|
|
|
weapon: item::weapon::WeaponType::Vjaya,
|
|
|
|
grind: 5,
|
|
|
|
special: Some(item::weapon::WeaponSpecial::Charge),
|
|
|
|
attrs: [Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Hit, value: 40}),
|
|
|
|
Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Dark, value: 100}),
|
|
|
|
None,],
|
|
|
|
tekked: true,
|
|
|
|
}
|
|
|
|
),
|
|
|
|
location: ItemLocation::Inventory {
|
|
|
|
character_id: character.id,
|
|
|
|
slot: 2,
|
|
|
|
equipped: true,
|
|
|
|
}
|
|
|
|
}).await;
|
|
|
|
entity_gateway.create_item(
|
|
|
|
NewItemEntity {
|
|
|
|
item: ItemDetail::Weapon(
|
|
|
|
item::weapon::Weapon {
|
|
|
|
weapon: item::weapon::WeaponType::Vulcan,
|
|
|
|
grind: 5,
|
|
|
|
special: Some(item::weapon::WeaponSpecial::Charge),
|
|
|
|
attrs: [Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Hit, value: 100}),
|
|
|
|
Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Dark, value: 100}),
|
|
|
|
None,],
|
|
|
|
tekked: true,
|
|
|
|
}
|
|
|
|
),
|
|
|
|
location: ItemLocation::Inventory {
|
|
|
|
character_id: character.id,
|
|
|
|
slot: 3,
|
|
|
|
equipped: true,
|
|
|
|
}
|
|
|
|
}).await;
|
|
|
|
entity_gateway.create_item(
|
|
|
|
NewItemEntity {
|
|
|
|
item: ItemDetail::Weapon(
|
|
|
|
item::weapon::Weapon {
|
|
|
|
weapon: item::weapon::WeaponType::DarkFlow,
|
|
|
|
grind: 5,
|
|
|
|
special: Some(item::weapon::WeaponSpecial::Charge),
|
|
|
|
attrs: [Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Hit, value: 100}),
|
|
|
|
Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Dark, value: 100}),
|
|
|
|
Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Native, value: 100}),],
|
|
|
|
tekked: true,
|
|
|
|
}
|
|
|
|
),
|
|
|
|
location: ItemLocation::Inventory {
|
|
|
|
character_id: character.id,
|
|
|
|
slot: 4,
|
2020-06-02 18:51:18 -06:00
|
|
|
equipped: true,
|
2020-03-29 22:00:07 -07:00
|
|
|
}
|
2020-06-02 18:51:18 -06:00
|
|
|
}).await;
|
2020-07-25 15:17:18 -03:00
|
|
|
entity_gateway.create_item(
|
|
|
|
NewItemEntity {
|
|
|
|
item: ItemDetail::Weapon(
|
|
|
|
item::weapon::Weapon {
|
|
|
|
weapon: item::weapon::WeaponType::Autogun,
|
|
|
|
grind: 5,
|
|
|
|
special: Some(item::weapon::WeaponSpecial::Hell),
|
|
|
|
attrs: [Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Hit, value: 70}),
|
|
|
|
Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Dark, value: 80}),
|
|
|
|
None,],
|
|
|
|
tekked: false,
|
|
|
|
}
|
|
|
|
),
|
|
|
|
location: ItemLocation::Bank {
|
|
|
|
character_id: character.id,
|
|
|
|
name: item::BankName("".to_string()),
|
|
|
|
}
|
|
|
|
}).await;
|
2020-06-02 18:51:18 -06:00
|
|
|
}
|
2020-01-13 20:59:29 -04:00
|
|
|
|
2020-01-23 18:00:34 -08:00
|
|
|
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);
|
|
|
|
|
2020-05-28 19:29:21 -06:00
|
|
|
elseware::common::mainloop::mainloop_async(patch_state, patch_config.port).await;
|
2020-01-23 18:00:34 -08:00
|
|
|
});
|
|
|
|
|
|
|
|
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-05-28 19:29:21 -06:00
|
|
|
elseware::common::mainloop::mainloop_async(auth_state, elseware::login::login::LOGIN_PORT).await;
|
2020-01-23 18:00:34 -08:00
|
|
|
});
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
2020-05-28 19:29:21 -06:00
|
|
|
elseware::common::mainloop::mainloop_async(char_state, elseware::login::character::CHARACTER_PORT).await;
|
2020-01-23 18:00:34 -08:00
|
|
|
});
|
|
|
|
|
|
|
|
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);
|
2020-05-28 19:29:21 -06:00
|
|
|
elseware::common::mainloop::mainloop_async(ship_state, elseware::ship::ship::SHIP_PORT).await;
|
2020-01-23 18:00:34 -08:00
|
|
|
});
|
|
|
|
|
|
|
|
futures::join!(patch, auth, character, ship);
|
|
|
|
});
|
2019-10-09 22:45:51 -07:00
|
|
|
}
|