From 49ce5c955d6a5ab742a7065584b4012240e51c6a Mon Sep 17 00:00:00 2001 From: core Date: Mon, 10 Apr 2023 15:08:01 -0400 Subject: [PATCH] SLP --- Cargo.lock | 128 +++++++++++++++++++++++++---------- client/Cargo.toml | 4 +- client/src/chat.rs | 2 +- client/src/lib.rs | 8 +-- protocol/Cargo.toml | 2 +- server/Cargo.toml | 16 +++-- server/build.rs | 22 ++++++ server/src/client_handler.rs | 2 +- server/src/handler.rs | 2 +- server/src/main.rs | 31 ++++++++- 10 files changed, 165 insertions(+), 52 deletions(-) create mode 100644 server/build.rs diff --git a/Cargo.lock b/Cargo.lock index 7a0b9abda52771e89265835bd21f7b10df97c874..08e78c1510e41c2d8fa002c5ffa73da7166c2034 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -64,30 +64,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] -name = "cfg-if" -version = "1.0.0" +name = "camino" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "c530edf18f37068ac2d977409ed5cd50d53d73bc653c7647b48eb78976ac9ae2" +dependencies = [ + "serde", +] [[package]] -name = "client" -version = "0.1.0" +name = "cargo-platform" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" dependencies = [ - "console_log", - "futures", - "js-sys", - "lazy_static", - "log", - "protocol", - "rmp-serde", "serde", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "ws_stream_wasm", ] +[[package]] +name = "cargo_metadata" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + [[package]] name = "colored" version = "2.0.0" @@ -522,14 +535,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "protocol" -version = "0.1.0" -dependencies = [ - "rmp-serde", - "serde", -] - [[package]] name = "quote" version = "1.0.26" @@ -600,11 +605,20 @@ dependencies = [ "semver", ] +[[package]] +name = "ryu" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + [[package]] name = "semver" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +dependencies = [ + "serde", +] [[package]] name = "send_wrapper" @@ -633,20 +647,14 @@ dependencies = [ ] [[package]] -name = "server" -version = "0.1.0" +name = "serde_json" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d721eca97ac802aa7777b701877c8004d950fc142651367300d21c1cc0194744" dependencies = [ - "futures", - "hyper", - "lazy_static", - "log", - "protocol", - "rmp-serde", + "itoa", + "ryu", "serde", - "simple_logger", - "tokio", - "tokio-tungstenite", - "tungstenite", ] [[package]] @@ -692,6 +700,52 @@ dependencies = [ "winapi", ] +[[package]] +name = "starkingdoms-client" +version = "0.1.0" +dependencies = [ + "console_log", + "futures", + "js-sys", + "lazy_static", + "log", + "rmp-serde", + "serde", + "starkingdoms-protocol", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "ws_stream_wasm", +] + +[[package]] +name = "starkingdoms-protocol" +version = "0.1.0" +dependencies = [ + "rmp-serde", + "serde", +] + +[[package]] +name = "starkingdoms-server" +version = "0.0.1" +dependencies = [ + "cargo_metadata", + "futures", + "hyper", + "lazy_static", + "log", + "rmp-serde", + "serde", + "serde_json", + "simple_logger", + "starkingdoms-protocol", + "tokio", + "tokio-tungstenite", + "tungstenite", +] + [[package]] name = "syn" version = "1.0.109" diff --git a/client/Cargo.toml b/client/Cargo.toml index e5b99e29170fa8f3118da023d927f826d5a33696..1442cf93279455b50af1fd4558513f8fa7e21988 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "client" +name = "starkingdoms-client" version = "0.1.0" edition = "2021" @@ -17,7 +17,7 @@ log = "0.4" futures = { version = "0.3", default-features = false } wasm-bindgen-futures = "0.4" url = "2.3" -protocol = { version = "0.1.0", path = "../protocol" } +starkingdoms-protocol = { version = "0.1.0", path = "../protocol" } rmp-serde = "1.1" ws_stream_wasm = "0.7" serde = { version = "1", features = ["derive"] } diff --git a/client/src/chat.rs b/client/src/chat.rs index 0bf0dfc68a19bff7ea998bf12ce81ac20ee33de6..774be725b000f32d038103f652bda7288a4fff28 100644 --- a/client/src/chat.rs +++ b/client/src/chat.rs @@ -1,5 +1,5 @@ use wasm_bindgen::prelude::*; -use protocol::MessageC2S; +use starkingdoms_protocol::MessageC2S; use crate::CLIENT; use futures::SinkExt; diff --git a/client/src/lib.rs b/client/src/lib.rs index ec59ab2bcd45470a04e5654f9833b26d6a4dac47..49505ccc5339ce589a018d7068059f3fb2c189e6 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -4,10 +4,10 @@ use futures::StreamExt; use log::{debug, error, info, Level, trace, warn}; use wasm_bindgen::prelude::*; use ws_stream_wasm::{WsMessage, WsMeta, WsStream}; -use protocol::State; -use protocol::PROTOCOL_VERSION; -use protocol::MessageS2C; -use protocol::MessageC2S; +use starkingdoms_protocol::State; +use starkingdoms_protocol::PROTOCOL_VERSION; +use starkingdoms_protocol::MessageS2C; +use starkingdoms_protocol::MessageC2S; use futures::SinkExt; use lazy_static::lazy_static; use std::sync::Arc; diff --git a/protocol/Cargo.toml b/protocol/Cargo.toml index bb9fd774961a2c4dfc578d21147603d2ba8b475f..d4e718fa7604c830eefa4044a93d985c53720d2e 100644 --- a/protocol/Cargo.toml +++ b/protocol/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "protocol" +name = "starkingdoms-protocol" version = "0.1.0" edition = "2021" diff --git a/server/Cargo.toml b/server/Cargo.toml index 2205eed16659a87500820ba07f4d94d8d1fc2e55..3b8b7802a8db169ee737fa638f21c44f74649b1f 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -1,19 +1,27 @@ [package] -name = "server" -version = "0.1.0" +name = "starkingdoms-server" +version = "0.0.1" edition = "2021" +[metadata] +version-name = "Super Duper Ultra Alpha" +slp-description = "A StarKingdoms.TK server" + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] tokio = { version = "1.27", features = ["macros", "sync", "rt-multi-thread"] } serde = { version = "1", features = ["derive"] } rmp-serde = { version = "1" } +serde_json = "1" futures = { version = "0.3", default-features = false } hyper = { version = "0.14", features = ["server", "http1", "http2", "tcp"] } tungstenite = { version = "0.18", default-features = false } tokio-tungstenite = { version = "0.18" } log = "0.4" simple_logger = "4.1" -protocol = { version = "0.1.0", path = "../protocol" } -lazy_static = "1.4.0" \ No newline at end of file +starkingdoms-protocol = { version = "0.1.0", path = "../protocol" } +lazy_static = "1.4.0" + +[build-dependencies] +cargo_metadata = "0.15" \ No newline at end of file diff --git a/server/build.rs b/server/build.rs new file mode 100644 index 0000000000000000000000000000000000000000..5a6bbc81a0cd23664c2744bbcf227971b72f682c --- /dev/null +++ b/server/build.rs @@ -0,0 +1,22 @@ +use cargo_metadata::MetadataCommand; + +fn main() { + let path = std::env::var("CARGO_MANIFEST_DIR").unwrap(); + + let meta = MetadataCommand::new() + .manifest_path("./Cargo.toml") + .current_dir(&path) + .exec() + .unwrap(); + + let root = meta.root_package().unwrap(); + + let version = root.version.to_string(); + let version_name = root.metadata["version-name"].to_string(); + let description = root.metadata["slp-description"].to_string(); + + println!("cargo:rustc-env=STK_VERSION={}", version); + println!("cargo:rustc-env=STK_VERSION_NAME={}", version_name); + println!("cargo:rustc-env=STK_SLP_DESCRIPTION={}", description); + println!("cargo:rerun-if-changed:Cargo.toml"); +} \ No newline at end of file diff --git a/server/src/client_handler.rs b/server/src/client_handler.rs index 7d15034ccc867d9e6e332a0da7b445ab782a89d0..aaa48a47543e9f23367f0aa2a579df02b2762f57 100644 --- a/server/src/client_handler.rs +++ b/server/src/client_handler.rs @@ -7,7 +7,7 @@ use log::{error, info}; use tokio::sync::mpsc::Receiver; use tokio_tungstenite::WebSocketStream; use tungstenite::Message; -use protocol::{GoodbyeReason, MessageC2S, MessageS2C, PROTOCOL_VERSION, ps2c, State}; +use starkingdoms_protocol::{GoodbyeReason, MessageC2S, MessageS2C, PROTOCOL_VERSION, ps2c, State}; use crate::handler::{ClientHandlerMessage, ClientManager}; use crate::{send, recv}; diff --git a/server/src/handler.rs b/server/src/handler.rs index b98dd16581373c2f1e76af03f2a2d5c457a928a1..d1c8753c5e24bc77481f7750a87ca068754ef284 100644 --- a/server/src/handler.rs +++ b/server/src/handler.rs @@ -6,7 +6,7 @@ use serde::Serialize; use tokio::sync::mpsc::Sender; use tokio::sync::RwLock; use tungstenite::Message; -use protocol::State; +use starkingdoms_protocol::State; #[derive(Clone)] pub struct ClientManager { diff --git a/server/src/main.rs b/server/src/main.rs index e48032c7ce113a5fd1b1081edcb003e389b025fc..b59fc8699868dc1edbcca3bd9a3c66b149e560e2 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -8,8 +8,10 @@ use tungstenite::{Error, handshake}; use futures::stream::StreamExt; use lazy_static::lazy_static; use log::{error, info, Level}; +use serde::{Deserialize, Serialize}; use tokio::sync::RwLock; -use protocol::State; +use protocol::{PROTOCOL_VERSION, State}; +use starkingdoms_protocol::PROTOCOL_VERSION; use crate::handler::{ClientHandler, ClientManager}; use crate::client_handler::handle_client; use crate::timer::timer_main; @@ -96,6 +98,19 @@ async fn handle_request(mut request: Request, remote_addr: SocketAddr, mgr ("/ws", false) => { Ok(Response::builder().status(400).body(Body::from("Connection-Upgrade header missing")).unwrap()) }, + ("/ping", false) => { + Ok(Response::builder().status(200).body(Body::from( + serde_json::to_string(&ServerPingResponse { + version: ServerPingResponseVersion { + name: env!("STK_VERSION_NAME").to_string(), // Set by build.rs + number: env!("STK_VERSION").to_string(), // Set by build.rs + protocol: PROTOCOL_VERSION, + }, + players: cmgr.usernames.read().await.len() as u32, + description: env!("STK_SLP_DESCRIPTION").to_string(), + }).unwrap() + )).unwrap()) + }, (url@_, false) => { // typical HTTP file request // TODO @@ -146,3 +161,17 @@ async fn main() { error!("error in server thread: {}", e); } } + +#[derive(Serialize, Deserialize)] +pub struct ServerPingResponse { + pub version: ServerPingResponseVersion, + pub players: u32, + pub description: String +} + +#[derive(Serialize, Deserialize)] +pub struct ServerPingResponseVersion { + pub name: String, + pub number: String, + pub protocol: u32 +} \ No newline at end of file