use actix_cors::Cors; use actix_web::{web, App, HttpRequest, HttpResponse, HttpServer, Responder}; use actix_web_actors::ws; use crate::args::Args; use crate::data::{GameRules, PlayConfiguration}; use crate::human_player_ws::{HumanPlayerWS, StartMode}; /// The default '/' route async fn index() -> impl Responder { HttpResponse::Ok().json("Sea battle backend") } /// The default 404 route async fn not_found() -> impl Responder { HttpResponse::NotFound().json("You missed your strike lol") } /// Get bot configuration async fn game_configuration() -> impl Responder { HttpResponse::Ok().json(PlayConfiguration::default()) } /// Start bot game async fn start_bot_play( req: HttpRequest, stream: web::Payload, query: web::Query, ) -> Result { let errors = query.0.get_errors(); if !errors.is_empty() { return Ok(HttpResponse::BadRequest().json(errors)); } let mut player_ws = HumanPlayerWS::default(); player_ws.start_mode = StartMode::Bot(query.0.clone()); let resp = ws::start(player_ws, &req, stream); log::info!("New bot play with configuration: {:?}", &query.0); resp } pub async fn start_server(args: Args) -> std::io::Result<()> { let args_clone = args.clone(); HttpServer::new(move || { let mut cors = Cors::default(); match args_clone.cors.as_deref() { Some("*") => cors = cors.allow_any_origin(), Some(orig) => cors = cors.allowed_origin(orig), None => {} } App::new() .wrap(cors) .route("/config", web::get().to(game_configuration)) .route("/play/bot", web::get().to(start_bot_play)) // TODO : create & accept invite // TODO : join random .route("/", web::get().to(index)) .route("{tail:.*}", web::get().to(not_found)) }) .bind(&args.listen_address)? .run() .await }