You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

481 lines
22 KiB

5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
5 years ago
  1. use std::net::Ipv4Addr;
  2. use log::{info};
  3. use elseware::patch::patch::{PatchServerState, generate_patch_tree, load_config, load_motd};
  4. use elseware::login::login::LoginServerState;
  5. use elseware::login::character::CharacterServerState;
  6. use elseware::ship::ship::ShipServerStateBuilder;
  7. use elseware::entity::account::{NewUserAccountEntity, NewUserSettingsEntity};
  8. use elseware::entity::gateway::{EntityGateway, InMemoryGateway, PostgresGateway};
  9. use elseware::entity::character::NewCharacterEntity;
  10. use elseware::entity::item::{NewItemEntity, ItemDetail, ItemLocation};
  11. use elseware::common::interserver::AuthToken;
  12. use elseware::entity::item;
  13. use elseware::common::mainloop::*;
  14. fn setup_logger() {
  15. let colors = fern::colors::ColoredLevelConfig::new()
  16. .error(fern::colors::Color::Red)
  17. .warn(fern::colors::Color::Yellow)
  18. .info(fern::colors::Color::Green)
  19. .debug(fern::colors::Color::White)
  20. .trace(fern::colors::Color::BrightBlack);
  21. let stdio = fern::Dispatch::new()
  22. .level(log::LevelFilter::Debug)
  23. .format(move |out, message, record| {
  24. out.finish(format_args!(
  25. "\x1B[{}m[{}][{}][{}] {}\x1B[0m",
  26. colors.get_color(&record.level()).to_fg_str(),
  27. chrono::Local::now().format("%Y-%m-%d %H:%M:%S"),
  28. record.target(),
  29. record.level(),
  30. message,
  31. ))
  32. })
  33. .chain(std::io::stdout());
  34. let fileout = fern::Dispatch::new()
  35. .level(log::LevelFilter::Trace)
  36. .chain(fern::log_file(format!("log/elseware-{}.log", chrono::Local::now().format("%Y-%m-%d_%H-%M-%S"))).unwrap());
  37. fern::Dispatch::new()
  38. .chain(stdio)
  39. .chain(fileout)
  40. .apply().unwrap();
  41. }
  42. fn main() {
  43. setup_logger();
  44. async_std::task::block_on(async move {
  45. //let mut entity_gateway = PostgresGateway::new("localhost", "elsewhere", "elsewhere", "");
  46. let mut entity_gateway = InMemoryGateway::new();
  47. for i in 0..5 {
  48. let fake_user = NewUserAccountEntity {
  49. email: format!("fake{}@email.com", i),
  50. username: if i == 0 { "hi".to_string() } else { format!("hi{}", i+1) },
  51. password: bcrypt::hash("qwer", 5).unwrap(),
  52. guildcard: i + 1,
  53. team_id: None,
  54. banned_until: None,
  55. muted_until: None,
  56. flags: 0,
  57. activated: true,
  58. };
  59. let fake_user = entity_gateway.create_user(fake_user).await.unwrap();
  60. entity_gateway.create_user_settings(NewUserSettingsEntity::new(fake_user.id)).await.unwrap();
  61. let mut character = NewCharacterEntity::new(fake_user.id);
  62. character.name = format!("Test Char {}", i*2);
  63. entity_gateway.create_character(character).await.unwrap();
  64. let mut character = NewCharacterEntity::new(fake_user.id);
  65. character.slot = 2;
  66. character.name = "ItemRefactor".into();
  67. character.exp = 80000000;
  68. character.meseta = 999999;
  69. let character = entity_gateway.create_character(character).await.unwrap();
  70. for _ in 0..3usize {
  71. entity_gateway.create_item(
  72. item::NewItemEntity {
  73. item: item::ItemDetail::Weapon(
  74. item::weapon::Weapon {
  75. weapon: item::weapon::WeaponType::Vulcan,
  76. grind: 0,
  77. special: None,
  78. attrs: [None, None, None],
  79. tekked: true,
  80. wrapping: None,
  81. }
  82. ),
  83. location: item::ItemLocation::Bank {
  84. character_id: character.id,
  85. name: item::BankName("".to_string())
  86. }
  87. }).await.unwrap();
  88. }
  89. for _ in 0..8usize {
  90. entity_gateway.create_item(
  91. NewItemEntity {
  92. item: ItemDetail::Tool (
  93. item::tool::Tool {
  94. tool: item::tool::ToolType::Monomate,
  95. wrapping: None,
  96. }
  97. ),
  98. location: item::ItemLocation::Bank {
  99. character_id: character.id,
  100. name: item::BankName("".to_string())
  101. }
  102. }).await.unwrap();
  103. }
  104. let item0 = entity_gateway.create_item(
  105. NewItemEntity {
  106. item: ItemDetail::Weapon(
  107. item::weapon::Weapon {
  108. weapon: item::weapon::WeaponType::Raygun,
  109. grind: 5,
  110. special: Some(item::weapon::WeaponSpecial::Hell),
  111. attrs: [Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Hit, value: 40}),
  112. Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Dark, value: 30}),
  113. None,],
  114. tekked: false,
  115. wrapping: Some(item::WrappingPaper::BlackYellow),
  116. }
  117. ),
  118. location: ItemLocation::Inventory {
  119. character_id: character.id,
  120. }
  121. }).await.unwrap();
  122. let item1 = entity_gateway.create_item(
  123. NewItemEntity {
  124. item: ItemDetail::Weapon(
  125. item::weapon::Weapon {
  126. weapon: item::weapon::WeaponType::Handgun,
  127. grind: 5,
  128. special: Some(item::weapon::WeaponSpecial::Charge),
  129. attrs: [Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Hit, value: 40}),
  130. Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Dark, value: 30}),
  131. None,],
  132. tekked: true,
  133. wrapping: None,
  134. }
  135. ),
  136. location: ItemLocation::Inventory {
  137. character_id: character.id,
  138. }
  139. }).await.unwrap();
  140. let item2_w = entity_gateway.create_item(
  141. NewItemEntity {
  142. item: ItemDetail::Weapon(
  143. item::weapon::Weapon {
  144. weapon: item::weapon::WeaponType::Vjaya,
  145. grind: 5,
  146. special: Some(item::weapon::WeaponSpecial::Charge),
  147. attrs: [Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Hit, value: 40}),
  148. Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Dark, value: 100}),
  149. None,],
  150. tekked: true,
  151. wrapping: None,
  152. }
  153. ),
  154. location: ItemLocation::Inventory {
  155. character_id: character.id,
  156. }
  157. }).await.unwrap();
  158. let item3 = entity_gateway.create_item(
  159. NewItemEntity {
  160. item: ItemDetail::Weapon(
  161. item::weapon::Weapon {
  162. weapon: item::weapon::WeaponType::Vulcan,
  163. grind: 5,
  164. special: Some(item::weapon::WeaponSpecial::Charge),
  165. attrs: [Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Hit, value: 100}),
  166. Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Dark, value: 100}),
  167. None,],
  168. tekked: true,
  169. wrapping: None,
  170. }
  171. ),
  172. location: ItemLocation::Inventory {
  173. character_id: character.id,
  174. }
  175. }).await.unwrap();
  176. let item4 = entity_gateway.create_item(
  177. NewItemEntity {
  178. item: ItemDetail::Weapon(
  179. item::weapon::Weapon {
  180. weapon: item::weapon::WeaponType::DarkFlow,
  181. grind: 5,
  182. special: Some(item::weapon::WeaponSpecial::Charge),
  183. attrs: [Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Hit, value: 100}),
  184. Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Dark, value: 100}),
  185. Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Native, value: 100}),],
  186. tekked: true,
  187. wrapping: None,
  188. }
  189. ),
  190. location: ItemLocation::Inventory {
  191. character_id: character.id,
  192. }
  193. }).await.unwrap();
  194. let item5_m = entity_gateway.create_item(
  195. item::NewItemEntity {
  196. item: item::ItemDetail::Mag(item::mag::Mag::baby_mag(0)),
  197. location: item::ItemLocation::Inventory {
  198. character_id: character.id,
  199. }
  200. }).await.unwrap();
  201. for _ in 0..10usize {
  202. let fed_tool = entity_gateway.create_item(
  203. NewItemEntity {
  204. item: ItemDetail::Tool (
  205. item::tool::Tool {
  206. tool: item::tool::ToolType::Monomate,
  207. wrapping: None,
  208. }
  209. ),
  210. location: item::ItemLocation::FedToMag {
  211. mag: item5_m.id,
  212. }
  213. }).await.unwrap();
  214. entity_gateway.feed_mag(&item5_m.id, &fed_tool.id).await.unwrap();
  215. }
  216. entity_gateway.change_mag_owner(&item5_m.id, &character).await.unwrap();
  217. let item6 = entity_gateway.create_item(
  218. item::NewItemEntity {
  219. item: ItemDetail::Tool (
  220. item::tool::Tool {
  221. tool: item::tool::ToolType::CellOfMag502,
  222. wrapping: None,
  223. }
  224. ),
  225. location: item::ItemLocation::Inventory {
  226. character_id: character.id,
  227. }
  228. }).await.unwrap();
  229. let cell = entity_gateway.create_item(
  230. item::NewItemEntity {
  231. item: ItemDetail::Tool (
  232. item::tool::Tool {
  233. tool: item::tool::ToolType::CellOfMag502,
  234. // wrapping: None,
  235. wrapping: Some(item::WrappingPaper::PinkYellowGreen),
  236. }
  237. ),
  238. location: item::ItemLocation::Consumed,
  239. }).await.unwrap();
  240. entity_gateway.use_mag_cell(&item5_m.id, &cell.id).await.unwrap();
  241. entity_gateway.create_item(
  242. NewItemEntity {
  243. item: ItemDetail::Weapon(
  244. item::weapon::Weapon {
  245. weapon: item::weapon::WeaponType::Autogun,
  246. grind: 5,
  247. special: Some(item::weapon::WeaponSpecial::Hell),
  248. attrs: [Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Hit, value: 70}),
  249. Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Dark, value: 80}),
  250. None,],
  251. tekked: false,
  252. wrapping: None,
  253. }
  254. ),
  255. location: ItemLocation::Bank {
  256. character_id: character.id,
  257. name: item::BankName("".to_string()),
  258. }
  259. }).await.unwrap();
  260. let item7_a = entity_gateway.create_item(
  261. NewItemEntity {
  262. item: ItemDetail::Armor(
  263. item::armor::Armor {
  264. armor: item::armor::ArmorType::Frame,
  265. dfp: 0,
  266. evp: 0,
  267. slots: 4,
  268. wrapping: Some(item::WrappingPaper::Green),
  269. }
  270. ),
  271. location: ItemLocation::Inventory {
  272. character_id: character.id,
  273. }
  274. }
  275. ).await.unwrap();
  276. let item8_s = entity_gateway.create_item(
  277. NewItemEntity {
  278. item: ItemDetail::Shield(
  279. item::shield::Shield {
  280. shield: item::shield::ShieldType::Barrier,
  281. dfp: 0,
  282. evp: 0,
  283. wrapping: Some(item::WrappingPaper::Green),
  284. }
  285. ),
  286. location: ItemLocation::Inventory {
  287. character_id: character.id,
  288. }
  289. }
  290. ).await.unwrap();
  291. let item9_u0 = entity_gateway.create_item(
  292. NewItemEntity {
  293. item: ItemDetail::Unit(
  294. item::unit::Unit {
  295. unit: item::unit::UnitType::PriestMind,
  296. modifier: Some(item::unit::UnitModifier::Minus),
  297. wrapping: None,
  298. }
  299. ),
  300. location: ItemLocation::Inventory {
  301. character_id: character.id,
  302. }
  303. }
  304. ).await.unwrap();
  305. let item10_u1 = entity_gateway.create_item(
  306. NewItemEntity {
  307. item: ItemDetail::Unit(
  308. item::unit::Unit {
  309. unit: item::unit::UnitType::PriestMind,
  310. modifier: Some(item::unit::UnitModifier::Minus),
  311. // wrapping: None,
  312. wrapping: Some(item::WrappingPaper::YellowBlue),
  313. }
  314. ),
  315. location: ItemLocation::Inventory {
  316. character_id: character.id,
  317. }
  318. }
  319. ).await.unwrap();
  320. let item11_u2 = entity_gateway.create_item(
  321. NewItemEntity {
  322. item: ItemDetail::Unit(
  323. item::unit::Unit {
  324. unit: item::unit::UnitType::PriestMind,
  325. modifier: Some(item::unit::UnitModifier::Minus),
  326. wrapping: None,
  327. }
  328. ),
  329. location: ItemLocation::Inventory {
  330. character_id: character.id,
  331. }
  332. }
  333. ).await.unwrap();
  334. let item12_u3 = entity_gateway.create_item(
  335. NewItemEntity {
  336. item: ItemDetail::Unit(
  337. item::unit::Unit {
  338. unit: item::unit::UnitType::PriestMind,
  339. modifier: Some(item::unit::UnitModifier::Minus),
  340. wrapping: None,
  341. }
  342. ),
  343. location: ItemLocation::Inventory {
  344. character_id: character.id,
  345. }
  346. }
  347. ).await.unwrap();
  348. let item13 = entity_gateway.create_item(
  349. NewItemEntity {
  350. item: item::ItemDetail::Mag(item::mag::Mag::wrapped_baby_mag(5)),
  351. location: ItemLocation::Inventory {
  352. character_id: character.id,
  353. }
  354. }
  355. ).await.unwrap();
  356. // wrapping monomates doesn't do anything
  357. let item14 = entity_gateway.create_item(
  358. NewItemEntity {
  359. item: ItemDetail::Tool (
  360. item::tool::Tool {
  361. tool: item::tool::ToolType::Monomate,
  362. // wrapping: None,
  363. wrapping: Some(item::WrappingPaper::Yellow),
  364. }
  365. ),
  366. location: ItemLocation::Inventory {
  367. character_id: character.id,
  368. }
  369. }
  370. ).await.unwrap();
  371. /* wrapping techs is no bueno */
  372. // let item15 = entity_gateway.create_item(
  373. // NewItemEntity {
  374. // item: ItemDetail::TechniqueDisk (
  375. // item::tech::TechniqueDisk {
  376. // tech: item::tech::Technique::Foie,
  377. // level: 5,
  378. // // wrapping: None,
  379. // wrapping: Some(item::WrappingPaper::Blue),
  380. // }
  381. // ),
  382. // location: ItemLocation::Inventory {
  383. // character_id: character.id,
  384. // }
  385. // }
  386. // ).await.unwrap();
  387. let item16 = entity_gateway.create_item(
  388. NewItemEntity {
  389. item: ItemDetail::ESWeapon (
  390. item::esweapon::ESWeapon {
  391. esweapon: item::esweapon::ESWeaponType::Hammer,
  392. special: Some(item::esweapon::ESWeaponSpecial::Hell),
  393. name: "BAN".to_owned(),
  394. grind: 69u8,
  395. wrapping: Some(item::WrappingPaper::LightBlueOrange),
  396. }
  397. ),
  398. location: ItemLocation::Inventory {
  399. character_id: character.id,
  400. }
  401. }
  402. ).await.unwrap();
  403. let equipped = item::EquippedEntity {
  404. weapon: Some(item2_w.id),
  405. armor: Some(item7_a.id),
  406. shield: Some(item8_s.id),
  407. unit: [Some(item9_u0.id), Some(item10_u1.id), Some(item11_u2.id), Some(item12_u3.id)],
  408. mag: Some(item5_m.id),
  409. };
  410. entity_gateway.set_character_equips(&character.id, &equipped).await.unwrap();
  411. let inventory = item::InventoryEntity::new(vec![item0, item1, item2_w, item3, item4, item5_m, item6, item7_a, item8_s, item9_u0, item10_u1, item11_u2, item12_u3, item13, item14, /*item15,*/ item16]);
  412. entity_gateway.set_character_inventory(&character.id, &inventory).await.unwrap();
  413. entity_gateway.set_character_bank(&character.id, &item::BankEntity::default(), item::BankName("".into())).await.unwrap();
  414. }
  415. info!("[patch] starting server");
  416. let patch_config = load_config();
  417. let patch_motd = load_motd();
  418. let (patch_file_tree, patch_file_lookup) = generate_patch_tree(patch_config.path.as_str());
  419. let patch_state = Box::new(PatchServerState::new(patch_file_tree, patch_file_lookup, patch_motd));
  420. let patch_loop = patch_mainloop(*patch_state, patch_config.port);
  421. let thread_entity_gateway = entity_gateway.clone();
  422. info!("[auth] starting server");
  423. let login_state = Box::new(LoginServerState::new(thread_entity_gateway, "127.0.0.1".parse().unwrap()));
  424. let login_loop = login_mainloop(*login_state, elseware::login::login::LOGIN_PORT);
  425. let thread_entity_gateway = entity_gateway.clone();
  426. info!("[character] starting server");
  427. let char_state = Box::new(CharacterServerState::new(thread_entity_gateway, AuthToken("".into())));
  428. let character_loop = character_mainloop(*char_state, elseware::login::character::CHARACTER_PORT, elseware::login::login::COMMUNICATION_PORT);
  429. let thread_entity_gateway = entity_gateway.clone();
  430. info!("[ship] starting server");
  431. let ship_state = Box::new(ShipServerStateBuilder::new()
  432. .name("US/Sona-Nyl".into())
  433. .ip(Ipv4Addr::new(127,0,0,1))
  434. .port(elseware::ship::ship::SHIP_PORT)
  435. .gateway(thread_entity_gateway)
  436. .build());
  437. let ship_loop = ship_mainloop(*ship_state, elseware::ship::ship::SHIP_PORT, std::net::Ipv4Addr::new(127, 0, 0, 1), elseware::login::login::COMMUNICATION_PORT);
  438. let thread_entity_gateway = entity_gateway.clone();
  439. let ship_state = Box::new(ShipServerStateBuilder::new()
  440. .name("EU/Dylath-Leen".into())
  441. .ip(Ipv4Addr::new(127,0,0,1))
  442. .port(elseware::ship::ship::SHIP_PORT+2000)
  443. .gateway(thread_entity_gateway)
  444. .build());
  445. let ship_loop2 = ship_mainloop(*ship_state, elseware::ship::ship::SHIP_PORT+2000, std::net::Ipv4Addr::new(127, 0, 0, 1), elseware::login::login::COMMUNICATION_PORT);
  446. let thread_entity_gateway = entity_gateway.clone();
  447. let ship_state = Box::new(ShipServerStateBuilder::new()
  448. .name("JP/Thalarion".into())
  449. .ip(Ipv4Addr::new(127,0,0,1))
  450. .port(elseware::ship::ship::SHIP_PORT+3000)
  451. .gateway(thread_entity_gateway)
  452. .build());
  453. let ship_loop3 = ship_mainloop(*ship_state, elseware::ship::ship::SHIP_PORT+3000, std::net::Ipv4Addr::new(127, 0, 0, 1), elseware::login::login::COMMUNICATION_PORT);
  454. futures::future::join_all(vec![patch_loop, login_loop, character_loop, ship_loop, ship_loop2, ship_loop3]).await;
  455. });
  456. }