From 0ee84c168ef28cf9cacda4ed13066ad0e776ea08 Mon Sep 17 00:00:00 2001 From: ppc Date: Fri, 9 Jan 2026 20:31:53 +0000 Subject: [PATCH] add test server --- Cargo.lock | 11 ++++++ Cargo.toml | 4 +-- amnet-server-test/Cargo.toml | 18 ++++++++++ amnet-server-test/src/main.rs | 65 +++++++++++++++++++++++++++++++++++ amnet-server/src/lib.rs | 1 + 5 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 amnet-server-test/Cargo.toml create mode 100644 amnet-server-test/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 2f08a0a..a32a0f1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18,6 +18,17 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "amnet-server-test" +version = "2.0.0" +dependencies = [ + "amnet", + "axum", + "tokio", + "tracing", + "tracing-subscriber", +] + [[package]] name = "atomic-waker" version = "1.1.2" diff --git a/Cargo.toml b/Cargo.toml index c8bd544..cd3747a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,8 @@ [workspace] -members = ["amnet-server"] +members = ["amnet-server", "amnet-server-test"] resolver = "3" [workspace.package] version = "2.0.0" authors = ["ppc"] -description = "AMNet IC Card Switcher" \ No newline at end of file +description = "AMNet IC Card Switcher" diff --git a/amnet-server-test/Cargo.toml b/amnet-server-test/Cargo.toml new file mode 100644 index 0000000..0e420be --- /dev/null +++ b/amnet-server-test/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "amnet-server-test" +edition = "2024" + +version.workspace = true +authors.workspace = true +description = "AMNet Server Test Application" + +[[bin]] +name = "amnet-server-test" +path = "src/main.rs" + +[dependencies] +amnet = { path = "../amnet-server" } +axum = "0.8.8" +tokio = { version = "1", features = ["rt-multi-thread", "macros", "net", "time"] } +tracing = "0.1" +tracing-subscriber = "0.3" diff --git a/amnet-server-test/src/main.rs b/amnet-server-test/src/main.rs new file mode 100644 index 0000000..d6eb160 --- /dev/null +++ b/amnet-server-test/src/main.rs @@ -0,0 +1,65 @@ +use std::time::Duration; + +use amnet::{build_server, CardSlot, ServerConfig, Metrics, format_hex_bytes}; +use tokio::net::TcpListener; +use tracing::{info, warn}; + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt() + .with_max_level(tracing::Level::DEBUG) + .init(); + + let config = ServerConfig::instance(); + + info!("AMNet Server (Test Application)"); + + info!("Configuration:"); + info!(" Game ID: {}", config.game_id.as_deref().unwrap_or("(not set)")); + info!(" Server Name: {}", config.server_name); + info!(" Listen Address: {}", config.server_listen_address); + info!(" Physical Card Use IDm: {}", config.physical_card_use_idm); + info!(""); + + // Start the webserver in the background + let app = build_server(); + let listen_addr = config.server_listen_address.as_str(); + + let listener = match TcpListener::bind(listen_addr).await { + Ok(l) => l, + Err(e) => { + warn!("Failed to bind to {}: {}", listen_addr, e); + return; + } + }; + + Metrics::instance().set_start_time(); + + info!("Server started on {}", listen_addr); + info!("Submit a card via the web API and it will be detected here."); + + tokio::spawn(async move { + if let Err(e) = axum::serve(listener, app).await { + warn!("Server error: {}", e); + } + }); + + loop { + if let Err(_) = Metrics::instance().set_last_poll() { + warn!("Failed to update poll metrics"); + } + + if let Some(card) = CardSlot::instance().request_card(None) { + info!("=== CARD DETECTED ==="); + info!(" Access Code: {}", format_hex_bytes(&card.access_code)); + + if let Some(idm) = card.card_idm { + info!(" Card IDm: {}", format_hex_bytes(&idm)); + } else { + info!(" Card IDm: (not provided)"); + } + } + + tokio::time::sleep(Duration::from_secs(1)).await; + } +} diff --git a/amnet-server/src/lib.rs b/amnet-server/src/lib.rs index 3ec3d9a..c829ac6 100644 --- a/amnet-server/src/lib.rs +++ b/amnet-server/src/lib.rs @@ -169,6 +169,7 @@ pub extern "system" fn DllMain(_hinst_dll: *mut std::ffi::c_void, fdw_reason: u3 } tracing_subscriber::fmt() + .with_max_level(tracing::Level::DEBUG) .with_ansi(false) // some targets that are injected into don't play nicely with ansi codes .init();