Compare commits
4 Commits
6be3eae863
...
e88d64ff63
Author | SHA1 | Date | |
---|---|---|---|
e88d64ff63 | |||
3ca6c43c9a | |||
d4223be8b4 | |||
83d0780954 |
8
rust/Cargo.lock
generated
8
rust/Cargo.lock
generated
@@ -421,9 +421,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap"
|
name = "clap"
|
||||||
version = "4.0.15"
|
version = "4.0.16"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6bf8832993da70a4c6d13c581f4463c2bdda27b9bf1c5498dc4365543abe6d6f"
|
checksum = "2ef582e2c00a63a0c0aa1fb4a4870781c4f5729f51196d3537fa7c1c1992eaa3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atty",
|
"atty",
|
||||||
"bitflags",
|
"bitflags",
|
||||||
@@ -1564,7 +1564,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sea_battle_backend"
|
name = "sea_battle_backend"
|
||||||
version = "0.1.0"
|
version = "0.2.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"actix",
|
"actix",
|
||||||
"actix-cors",
|
"actix-cors",
|
||||||
@@ -1588,7 +1588,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sea_battle_cli_player"
|
name = "sea_battle_cli_player"
|
||||||
version = "0.1.0"
|
version = "0.2.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"crossterm",
|
"crossterm",
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "sea_battle_backend"
|
name = "sea_battle_backend"
|
||||||
version = "0.1.0"
|
version = "0.2.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "GPL-2.0-or-later"
|
license = "GPL-2.0-or-later"
|
||||||
description = "A Sea Battle game backend server"
|
description = "A Sea Battle game backend server"
|
||||||
@@ -12,7 +12,7 @@ categories = [ "games" ]
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clap = { version = "4.0.15", features = ["derive"] }
|
clap = { version = "4.0.16", features = ["derive"] }
|
||||||
log = "0.4.17"
|
log = "0.4.17"
|
||||||
env_logger = "0.9.0"
|
env_logger = "0.9.0"
|
||||||
serde = { version = "1.0.145", features = ["derive"] }
|
serde = { version = "1.0.145", features = ["derive"] }
|
||||||
|
@@ -12,3 +12,14 @@ pub struct Args {
|
|||||||
#[clap(short, long, value_parser)]
|
#[clap(short, long, value_parser)]
|
||||||
pub cors: Option<String>,
|
pub cors: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use crate::args::Args;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn verify_cli() {
|
||||||
|
use clap::CommandFactory;
|
||||||
|
Args::command().debug_assert()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -361,7 +361,7 @@ impl BoatsLayout {
|
|||||||
mod test {
|
mod test {
|
||||||
use crate::data::boats_layout::{BoatDirection, BoatPosition, BoatsLayout, Coordinates};
|
use crate::data::boats_layout::{BoatDirection, BoatPosition, BoatsLayout, Coordinates};
|
||||||
use crate::data::game_map::GameMap;
|
use crate::data::game_map::GameMap;
|
||||||
use crate::data::{BotType, GameRules, PlayConfiguration, PrintableMap};
|
use crate::data::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn dist_coordinates_eq() {
|
fn dist_coordinates_eq() {
|
||||||
@@ -488,9 +488,7 @@ mod test {
|
|||||||
map_height: 5,
|
map_height: 5,
|
||||||
boats_str: "1,1".to_string(),
|
boats_str: "1,1".to_string(),
|
||||||
boats_can_touch: false,
|
boats_can_touch: false,
|
||||||
player_continue_on_hit: false,
|
..Default::default()
|
||||||
strike_timeout: None,
|
|
||||||
bot_type: BotType::Random,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut boats = BoatsLayout(vec![
|
let mut boats = BoatsLayout(vec![
|
||||||
|
@@ -4,7 +4,7 @@ use actix_web::{web, App, HttpRequest, HttpResponse, HttpServer, Responder};
|
|||||||
use actix_web_actors::ws;
|
use actix_web_actors::ws;
|
||||||
|
|
||||||
use crate::args::Args;
|
use crate::args::Args;
|
||||||
use crate::data::{GameRules, PlayConfiguration, VersionInfo};
|
use crate::data::{BoatsLayout, GameRules, PlayConfiguration, VersionInfo};
|
||||||
use crate::dispatcher_actor::DispatcherActor;
|
use crate::dispatcher_actor::DispatcherActor;
|
||||||
use crate::human_player_ws::{HumanPlayerWS, StartMode};
|
use crate::human_player_ws::{HumanPlayerWS, StartMode};
|
||||||
|
|
||||||
@@ -28,6 +28,35 @@ async fn game_configuration() -> impl Responder {
|
|||||||
HttpResponse::Ok().json(PlayConfiguration::default())
|
HttpResponse::Ok().json(PlayConfiguration::default())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get default game rules
|
||||||
|
async fn default_game_rules() -> impl Responder {
|
||||||
|
HttpResponse::Ok().json(GameRules::random_players_rules())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Validate game rules
|
||||||
|
async fn validate_game_rules(rules: web::Json<GameRules>) -> impl Responder {
|
||||||
|
HttpResponse::Ok().json(rules.get_errors())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Generate random boats layout
|
||||||
|
async fn gen_boats_layout(rules: web::Json<GameRules>) -> impl Responder {
|
||||||
|
let errors = rules.get_errors();
|
||||||
|
if !errors.is_empty() {
|
||||||
|
return HttpResponse::BadRequest().json(errors);
|
||||||
|
}
|
||||||
|
match BoatsLayout::gen_random_for_rules(&rules) {
|
||||||
|
Ok(l) => HttpResponse::Ok().json(l),
|
||||||
|
Err(e) => {
|
||||||
|
log::error!(
|
||||||
|
"Failed to generate boats layout for valid game rules: {} ! / Rules: {:?}",
|
||||||
|
e,
|
||||||
|
rules
|
||||||
|
);
|
||||||
|
HttpResponse::InternalServerError().json("Failed to generate random layout!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(serde::Serialize, serde::Deserialize, Eq, PartialEq, Debug)]
|
#[derive(serde::Serialize, serde::Deserialize, Eq, PartialEq, Debug)]
|
||||||
pub struct BotPlayQuery {
|
pub struct BotPlayQuery {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
@@ -135,6 +164,7 @@ async fn start_random(
|
|||||||
log::info!("New random play");
|
log::info!("New random play");
|
||||||
resp
|
resp
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn start_server(args: Args) -> std::io::Result<()> {
|
pub async fn start_server(args: Args) -> std::io::Result<()> {
|
||||||
log::info!("Start to listen on {}", args.listen_address);
|
log::info!("Start to listen on {}", args.listen_address);
|
||||||
|
|
||||||
@@ -155,6 +185,9 @@ pub async fn start_server(args: Args) -> std::io::Result<()> {
|
|||||||
.wrap(cors)
|
.wrap(cors)
|
||||||
.route("/version", web::get().to(version_information))
|
.route("/version", web::get().to(version_information))
|
||||||
.route("/config", web::get().to(game_configuration))
|
.route("/config", web::get().to(game_configuration))
|
||||||
|
.route("/game_rules/default", web::get().to(default_game_rules))
|
||||||
|
.route("/game_rules/validate", web::post().to(validate_game_rules))
|
||||||
|
.route("/generate_boats_layout", web::post().to(gen_boats_layout))
|
||||||
.route("/play/bot", web::get().to(start_bot_play))
|
.route("/play/bot", web::get().to(start_bot_play))
|
||||||
.route("/play/create_invite", web::get().to(start_create_invite))
|
.route("/play/create_invite", web::get().to(start_create_invite))
|
||||||
.route("/play/accept_invite", web::get().to(start_accept_invite))
|
.route("/play/accept_invite", web::get().to(start_accept_invite))
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "sea_battle_cli_player"
|
name = "sea_battle_cli_player"
|
||||||
version = "0.1.0"
|
version = "0.2.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "GPL-2.0-or-later"
|
license = "GPL-2.0-or-later"
|
||||||
description = "A Sea Battle game shell client"
|
description = "A Sea Battle game shell client"
|
||||||
@@ -12,8 +12,8 @@ categories = [ "games" ]
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
sea_battle_backend = { path = "../sea_battle_backend", version = "0.1.0" }
|
sea_battle_backend = { path = "../sea_battle_backend", version = "0.2.0" }
|
||||||
clap = { version = "4.0.15", features = ["derive"] }
|
clap = { version = "4.0.16", features = ["derive"] }
|
||||||
log = "0.4.17"
|
log = "0.4.17"
|
||||||
env_logger = "0.9.0"
|
env_logger = "0.9.0"
|
||||||
tui = "0.19.0"
|
tui = "0.19.0"
|
||||||
|
@@ -61,3 +61,14 @@ lazy_static::lazy_static! {
|
|||||||
pub fn cli_args() -> &'static CliArgs {
|
pub fn cli_args() -> &'static CliArgs {
|
||||||
&ARGS
|
&ARGS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use crate::cli_args::CliArgs;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn verify_cli() {
|
||||||
|
use clap::CommandFactory;
|
||||||
|
CliArgs::command().debug_assert()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user