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.

422 lines
20 KiB

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