Compare commits

..

2 Commits

Author SHA1 Message Date
9a38a634eb Can run cli as server
All checks were successful
continuous-integration/drone/push Build is passing
2022-10-16 19:52:34 +02:00
8990badaa4 Handle screens too small for setting boats layout 2022-10-16 19:42:43 +02:00
4 changed files with 34 additions and 11 deletions

View File

@@ -28,6 +28,10 @@ pub struct CliArgs {
#[clap(long, value_enum)] #[clap(long, value_enum)]
pub dev_screen: Option<TestDevScreen>, pub dev_screen: Option<TestDevScreen>,
/// Run as server instead of as client
#[clap(long, short)]
pub serve: bool,
} }
impl CliArgs { impl CliArgs {

View File

@@ -14,6 +14,7 @@ use tui::Terminal;
use cli_player::cli_args::{cli_args, TestDevScreen}; use cli_player::cli_args::{cli_args, TestDevScreen};
use cli_player::client::Client; use cli_player::client::Client;
use cli_player::server::run_server;
use cli_player::ui_screens::configure_game_rules::GameRulesConfigurationScreen; use cli_player::ui_screens::configure_game_rules::GameRulesConfigurationScreen;
use cli_player::ui_screens::game_screen::GameScreen; use cli_player::ui_screens::game_screen::GameScreen;
use cli_player::ui_screens::input_screen::InputScreen; use cli_player::ui_screens::input_screen::InputScreen;
@@ -138,7 +139,11 @@ async fn run_app<B: Backend>(terminal: &mut Terminal<B>) -> Res {
#[tokio::main] #[tokio::main]
pub async fn main() -> Result<(), Box<dyn Error>> { pub async fn main() -> Result<(), Box<dyn Error>> {
env_logger::Builder::from_env(Env::default()).init(); env_logger::Builder::from_env(Env::default()).init();
cli_args(); // Avoid a crash if help argument is triggered
if cli_args().serve {
run_server().await;
return Ok(());
}
// setup terminal // setup terminal
enable_raw_mode()?; enable_raw_mode()?;

View File

@@ -6,6 +6,21 @@ use sea_battle_backend::utils::network_utils;
use crate::cli_args::cli_args; use crate::cli_args::cli_args;
pub async fn run_server() {
let local_set = task::LocalSet::new();
local_set
.run_until(async move {
sea_battle_backend::server::start_server(Args {
listen_address: cli_args().listen_address.clone(),
cors: None,
})
.await
.expect("Failed to run local server!")
})
.await;
}
pub async fn start_server_if_missing() { pub async fn start_server_if_missing() {
if !network_utils::is_port_open(cli_args().listen_port()).await { if !network_utils::is_port_open(cli_args().listen_port()).await {
log::info!( log::info!(
@@ -15,16 +30,7 @@ pub async fn start_server_if_missing() {
std::thread::spawn(move || { std::thread::spawn(move || {
let rt = Builder::new_current_thread().enable_all().build().unwrap(); let rt = Builder::new_current_thread().enable_all().build().unwrap();
let local_set = task::LocalSet::new(); rt.block_on(run_server());
rt.block_on(local_set.run_until(async move {
sea_battle_backend::server::start_server(Args {
listen_address: cli_args().listen_address.clone(),
cors: None,
})
.await
.expect("Failed to run local server!")
}));
}); });
network_utils::wait_for_port(cli_args().listen_port()).await; network_utils::wait_for_port(cli_args().listen_port()).await;

View File

@@ -14,6 +14,7 @@ use sea_battle_backend::data::*;
use crate::constants::*; use crate::constants::*;
use crate::ui_screens::confirm_dialog_screen::confirm; use crate::ui_screens::confirm_dialog_screen::confirm;
use crate::ui_screens::popup_screen::PopupScreen;
use crate::ui_screens::utils::{centered_rect_size, centered_text}; use crate::ui_screens::utils::{centered_rect_size, centered_text};
use crate::ui_screens::ScreenResult; use crate::ui_screens::ScreenResult;
use crate::ui_widgets::game_map_widget::{ColoredCells, GameMapWidget}; use crate::ui_widgets::game_map_widget::{ColoredCells, GameMapWidget};
@@ -227,6 +228,13 @@ impl<'a> SetBoatsLayoutScreen<'a> {
} }
let (w, h) = game_map_widget.estimated_size(); let (w, h) = game_map_widget.estimated_size();
if f.size().width < w || f.size().height + 3 < h {
PopupScreen::new("Screen too small!").show_in_frame(f);
drop(game_map_widget);
return coordinates_mapper;
}
let area = centered_rect_size(w, h, &f.size()); let area = centered_rect_size(w, h, &f.size());
f.render_widget(game_map_widget, area); f.render_widget(game_map_widget, area);