From 3d21cd740261b1c88686565e79b70c3097e96858 Mon Sep 17 00:00:00 2001 From: timokoesters Date: Wed, 24 Apr 2019 09:59:42 +0200 Subject: [PATCH 1/3] Get player count and calculate ping time Former-commit-id: 99da086195e301f1e6cba3ebe7fa5b745b86502a --- chat-cli/src/main.rs | 9 ++++++++- client/src/lib.rs | 31 ++++++++++++++++++------------- voxygen/src/session.rs | 4 +--- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/chat-cli/src/main.rs b/chat-cli/src/main.rs index a080e6f9d6..c7aff19f73 100644 --- a/chat-cli/src/main.rs +++ b/chat-cli/src/main.rs @@ -20,13 +20,20 @@ fn main() { client.register(comp::Player::new("test".to_string(), None)); + println!("Players online: {:?}", + client.get_players() + .into_iter() + .map(|(e, p)| p) + .collect::>() + ); + client.send_chat("Hello!".to_string()); loop { let events = match client.tick(comp::Control::default(), clock.get_last_delta()) { Ok(events) => events, Err(err) => { - println!("Error: {:?}", err); + error!("Error: {:?}", err); break; } }; diff --git a/client/src/lib.rs b/client/src/lib.rs index d9038df8da..d6bcfbc1f8 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -22,7 +22,7 @@ use std::{ use threadpool::ThreadPool; use vek::*; -const SERVER_TIMEOUT: f64 = 20.0; // Seconds +const SERVER_TIMEOUT: Duration = Duration::from_secs(20); pub enum Event { Chat(String), @@ -33,7 +33,6 @@ pub struct Client { client_state: ClientState, thread_pool: ThreadPool, - last_ping: f64, postbox: PostBox, last_server_ping: Instant, @@ -70,13 +69,14 @@ impl Client { _ => return Err(Error::ServerWentMad), }; + postbox.send_message(ClientMsg::Ping); + Ok(Self { client_state, thread_pool: threadpool::Builder::new() .thread_name("veloren-worker".into()) .build(), - last_ping: state.get_time(), postbox, last_server_ping: Instant::now(), @@ -91,7 +91,7 @@ impl Client { }) } - /// Request a state transition to `ClientState::Registered`. + /// Ask the server to transition the player into the `Registered` state pub fn register(&mut self, player: comp::Player) { self.postbox.send_message(ClientMsg::Register { player }); self.client_state = ClientState::Pending; @@ -310,12 +310,9 @@ impl Client { fn handle_new_messages(&mut self) -> Result, Error> { let mut frontend_events = Vec::new(); - // Step 1 let new_msgs = self.postbox.new_messages(); if new_msgs.len() > 0 { - self.last_ping = self.state.get_time(); - for msg in new_msgs { match msg { ServerMsg::InitialSync { .. } => return Err(Error::ServerWentMad), @@ -375,14 +372,10 @@ impl Client { } } else if let Some(err) = self.postbox.error() { return Err(err.into()); - } else if self.state.get_time() - self.last_ping > SERVER_TIMEOUT { + // We regularily ping in the tick method + } else if Instant::now().duration_since(self.last_server_ping) > SERVER_TIMEOUT { return Err(Error::ServerTimeout); - } else if self.state.get_time() - self.last_ping > SERVER_TIMEOUT * 0.5 { - // Try pinging the server if the timeout is nearing. - self.postbox.send_message(ClientMsg::Ping); - self.last_server_ping = Instant::now(); } - Ok(frontend_events) } @@ -428,6 +421,18 @@ impl Client { pub fn state_mut(&mut self) -> &mut State { &mut self.state } + + /// Get a vector of all the players on the server + pub fn get_players(&mut self) -> Vec<(EcsEntity, comp::Player)> { + ( + &self.state.ecs().entities(), + &self.state.ecs().read_storage::(), + ) + .join() + .map(|(e, p)| (e, p.clone())) + .collect() + } + } impl Drop for Client { diff --git a/voxygen/src/session.rs b/voxygen/src/session.rs index 1b51b9d4f0..9687e21a9e 100644 --- a/voxygen/src/session.rs +++ b/voxygen/src/session.rs @@ -67,9 +67,7 @@ impl SessionState { client::Event::Chat(msg) => { self.hud.new_message(msg); } - client::Event::Disconnect => { - // TODO - } + client::Event::Disconnect => {} // TODO } } From c10a43f5419907a81d0bb2a60cf1c9553f2d88e8 Mon Sep 17 00:00:00 2001 From: timokoesters Date: Wed, 8 May 2019 18:22:52 +0200 Subject: [PATCH 2/3] Add server info Former-commit-id: 9e504c821e871d30f8ac7cd4acb7a8022bdb5710 --- chat-cli/src/main.rs | 14 ++++++++++---- client/src/lib.rs | 12 +++++++----- common/src/msg/mod.rs | 2 +- common/src/msg/server.rs | 7 +++++++ server/src/lib.rs | 10 +++++++++- 5 files changed, 34 insertions(+), 11 deletions(-) diff --git a/chat-cli/src/main.rs b/chat-cli/src/main.rs index c7aff19f73..b0a9d61986 100644 --- a/chat-cli/src/main.rs +++ b/chat-cli/src/main.rs @@ -1,6 +1,6 @@ use client::{Client, Event}; use common::{clock::Clock, comp}; -use log::info; +use log::{error, info}; use std::time::Duration; const FPS: u64 = 60; @@ -18,15 +18,21 @@ fn main() { let mut client = Client::new(([127, 0, 0, 1], 59003), None).expect("Failed to create client instance"); - client.register(comp::Player::new("test".to_string(), None)); + println!("Server info: {:?}", client.server_info); - println!("Players online: {:?}", - client.get_players() + // TODO: Remove or move somewhere else, this doesn't work immediately after connecting + println!("Ping: {:?}", client.get_ping_ms()); + + println!( + "Players online: {:?}", + client + .get_players() .into_iter() .map(|(e, p)| p) .collect::>() ); + client.register(comp::Player::new("test".to_string(), None)); client.send_chat("Hello!".to_string()); loop { diff --git a/client/src/lib.rs b/client/src/lib.rs index d6bcfbc1f8..3313836be1 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -9,7 +9,7 @@ pub use specs::Entity as EcsEntity; use common::{ comp, - msg::{ClientMsg, ClientState, ServerMsg}, + msg::{ClientMsg, ClientState, ServerInfo, ServerMsg}, net::PostBox, state::State, }; @@ -32,6 +32,7 @@ pub enum Event { pub struct Client { client_state: ClientState, thread_pool: ThreadPool, + pub server_info: ServerInfo, postbox: PostBox, @@ -54,17 +55,18 @@ impl Client { let mut postbox = PostBox::to(addr)?; // Wait for initial sync - let (mut state, entity) = match postbox.next_message() { + let (mut state, entity, server_info) = match postbox.next_message() { Some(ServerMsg::InitialSync { ecs_state, entity_uid, + server_info, }) => { let mut state = State::from_state_package(ecs_state); let entity = state .ecs() .entity_from_uid(entity_uid) .ok_or(Error::ServerWentMad)?; - (state, entity) + (state, entity, server_info) } _ => return Err(Error::ServerWentMad), }; @@ -76,6 +78,7 @@ impl Client { thread_pool: threadpool::Builder::new() .thread_name("veloren-worker".into()) .build(), + server_info, postbox, @@ -91,7 +94,7 @@ impl Client { }) } - /// Ask the server to transition the player into the `Registered` state + /// Request a state transition to `ClientState::Registered`. pub fn register(&mut self, player: comp::Player) { self.postbox.send_message(ClientMsg::Register { player }); self.client_state = ClientState::Pending; @@ -432,7 +435,6 @@ impl Client { .map(|(e, p)| (e, p.clone())) .collect() } - } impl Drop for Client { diff --git a/common/src/msg/mod.rs b/common/src/msg/mod.rs index 8489bb5f0c..2cad42a63c 100644 --- a/common/src/msg/mod.rs +++ b/common/src/msg/mod.rs @@ -5,7 +5,7 @@ pub mod server; // Reexports pub use self::client::ClientMsg; pub use self::ecs_packet::{EcsCompPacket, EcsResPacket}; -pub use self::server::{RequestStateError, ServerMsg}; +pub use self::server::{RequestStateError, ServerInfo, ServerMsg}; #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] pub enum ClientState { diff --git a/common/src/msg/server.rs b/common/src/msg/server.rs index 379f65cddf..62f3b27bf5 100644 --- a/common/src/msg/server.rs +++ b/common/src/msg/server.rs @@ -10,11 +10,18 @@ pub enum RequestStateError { WrongMessage, } +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ServerInfo { + pub name: String, + pub description: String, +} + #[derive(Debug, Clone, Serialize, Deserialize)] pub enum ServerMsg { InitialSync { ecs_state: sphynx::StatePackage, entity_uid: u64, + server_info: ServerInfo, }, StateAnswer(Result), ForceState(ClientState), diff --git a/server/src/lib.rs b/server/src/lib.rs index 27f65c897f..44c35e2304 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -14,7 +14,7 @@ use crate::{ }; use common::{ comp, - msg::{ClientMsg, ClientState, RequestStateError, ServerMsg}, + msg::{ClientMsg, ClientState, RequestStateError, ServerInfo, ServerMsg}, net::PostOffice, state::{State, Uid}, terrain::TerrainChunk, @@ -65,6 +65,8 @@ pub struct Server { chunk_tx: mpsc::Sender<(Vec2, TerrainChunk)>, chunk_rx: mpsc::Receiver<(Vec2, TerrainChunk)>, pending_chunks: HashSet>, + + server_info: ServerInfo, } impl Server { @@ -97,6 +99,11 @@ impl Server { chunk_tx, chunk_rx, pending_chunks: HashSet::new(), + + server_info: ServerInfo { + name: "Server name".to_owned(), + description: "This is the best Veloren server.".to_owned(), + }, }; /* @@ -377,6 +384,7 @@ impl Server { client.notify(ServerMsg::InitialSync { ecs_state: self.state.ecs().gen_state_package(), entity_uid: self.state.ecs().uid_from_entity(entity).unwrap().into(), // Can't fail. + server_info: self.server_info.clone(), }); self.clients.add(entity, client); From a69b5022c216d1fbedb3babda89a8f0f658d632a Mon Sep 17 00:00:00 2001 From: timokoesters Date: Sun, 2 Jun 2019 16:35:21 +0200 Subject: [PATCH 3/3] Add TODO --- chat-cli/src/main.rs | 9 +-------- client/src/lib.rs | 12 ++++++------ 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/chat-cli/src/main.rs b/chat-cli/src/main.rs index b0a9d61986..f68a5b47e9 100644 --- a/chat-cli/src/main.rs +++ b/chat-cli/src/main.rs @@ -23,14 +23,7 @@ fn main() { // TODO: Remove or move somewhere else, this doesn't work immediately after connecting println!("Ping: {:?}", client.get_ping_ms()); - println!( - "Players online: {:?}", - client - .get_players() - .into_iter() - .map(|(e, p)| p) - .collect::>() - ); + println!("Players online: {:?}", client.get_players()); client.register(comp::Player::new("test".to_string(), None)); client.send_chat("Hello!".to_string()); diff --git a/client/src/lib.rs b/client/src/lib.rs index 3313836be1..2734ee7bf6 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -426,13 +426,13 @@ impl Client { } /// Get a vector of all the players on the server - pub fn get_players(&mut self) -> Vec<(EcsEntity, comp::Player)> { - ( - &self.state.ecs().entities(), - &self.state.ecs().read_storage::(), - ) + pub fn get_players(&mut self) -> Vec { + // TODO: Don't clone players. + self.state + .ecs() + .read_storage::() .join() - .map(|(e, p)| (e, p.clone())) + .map(|p| p.clone()) .collect() } }