From b615c86820b29f787a339f2848a428e84a487aa4 Mon Sep 17 00:00:00 2001 From: Hamcha Date: Mon, 5 Oct 2020 02:24:23 +0200 Subject: [PATCH] Handle connection event properly --- src/components/map.rs | 9 ++++++++ src/components/mod.rs | 2 +- src/components/network.rs | 4 ---- src/components/transform.rs | 1 - src/components/viewport.rs | 1 - src/game.rs | 39 ++++++++++++++++++++++++-------- src/main.rs | 9 ++++---- src/network.rs | 45 ++++++++++++++++++++++++++++++------- src/systems/client.rs | 0 src/systems/mod.rs | 2 +- 10 files changed, 82 insertions(+), 30 deletions(-) create mode 100644 src/components/map.rs delete mode 100644 src/components/network.rs delete mode 100644 src/systems/client.rs diff --git a/src/components/map.rs b/src/components/map.rs new file mode 100644 index 0000000..e8d9dec --- /dev/null +++ b/src/components/map.rs @@ -0,0 +1,9 @@ +pub struct Tile { + contents: Vec, +} + +pub struct Map { + width: u16, + height: u16, + tiles: Vec, +} diff --git a/src/components/mod.rs b/src/components/mod.rs index cb02087..f3a3bb3 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -1,3 +1,3 @@ -pub mod network; +pub mod map; pub mod transform; pub mod viewport; diff --git a/src/components/network.rs b/src/components/network.rs deleted file mode 100644 index 062c56c..0000000 --- a/src/components/network.rs +++ /dev/null @@ -1,4 +0,0 @@ -#[derive(Clone, Copy, Debug, PartialEq)] -pub struct NetworkConnection { - conn_id: u64, -} diff --git a/src/components/transform.rs b/src/components/transform.rs index 400f527..9563ada 100644 --- a/src/components/transform.rs +++ b/src/components/transform.rs @@ -1,6 +1,5 @@ use ultraviolet::Vec2; -#[derive(Clone, Copy, Debug, PartialEq)] pub struct Transform { pub chunk_id: (u16, u16), pub position: Vec2, diff --git a/src/components/viewport.rs b/src/components/viewport.rs index 01b1889..d3c80ca 100644 --- a/src/components/viewport.rs +++ b/src/components/viewport.rs @@ -1,6 +1,5 @@ use ultraviolet::Vec2; -#[derive(Clone, Copy, Debug, PartialEq)] pub struct Viewport { pub chunk_id: (u16, u16), pub position: Vec2, diff --git a/src/game.rs b/src/game.rs index 194c407..ea0f925 100644 --- a/src/game.rs +++ b/src/game.rs @@ -1,4 +1,6 @@ -use crate::network::NetworkMessage; +use crate::network::{NetworkMessage, NetworkPayload}; +use async_std::sync::Arc; +use async_std::sync::RwLock; use async_std::sync::{Receiver, Sender}; use shipyard::{error, World}; use std::collections::HashMap; @@ -16,7 +18,12 @@ impl Game { // Create world let world = World::default(); - // Create workload + // Create init workload + world.run(|| { + //todo + }); + + // Create update workload world.add_workload("update").build(); Game { @@ -30,15 +37,29 @@ impl Game { self.world.try_run_workload("update") } - pub async fn read_loop(&self, net_in: Receiver) { + pub async fn read_loop(game: Arc>, net_in: Receiver) { loop { let message = net_in.recv().await.expect("could not read from channel"); - self.net_out - .send(NetworkMessage { - conn_id: message.conn_id, - data: tungstenite::Message::text("hello"), - }) - .await; + match message.data { + NetworkPayload::Connected => { + log::info!("[{:?}] connected", &message.conn_id); + game.write() + .await + .players + .insert(message.conn_id, Player {}); + } + NetworkPayload::Message(msg) => { + log::info!("[{:?}] said {:?}", &message.conn_id, msg); + game.write() + .await + .net_out + .send(NetworkMessage { + conn_id: message.conn_id, + data: NetworkPayload::Message(tungstenite::Message::text("hello")), + }) + .await; + } + } } } } diff --git a/src/main.rs b/src/main.rs index 6ced875..7cb8b13 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,7 @@ use crate::config::Settings; use crate::game::Game; use crate::network::listen; use async_std::sync::Arc; +use async_std::sync::RwLock; use async_std::{sync::channel, task}; use env_logger::Env; use std::time::Duration; @@ -24,17 +25,15 @@ async fn run() { let (in_s, in_r) = channel(10); let (out_s, out_r) = channel(10); - let game = Arc::new(Game::new(out_s)); + let game = Arc::new(RwLock::new(Game::new(out_s))); let game_read_loop = game.clone(); - task::spawn(async move { - game_read_loop.read_loop(in_r).await; - }); + task::spawn(Game::read_loop(game_read_loop, in_r)); task::spawn(async move { loop { let game = game.clone(); - task::spawn(async move { game.update().expect("update failed") }); + task::spawn(async move { game.read().await.update().expect("update failed") }); task::sleep(Duration::from_millis(MIN_UPDATE_MS)).await; } }); diff --git a/src/network.rs b/src/network.rs index 55ad94c..ba6022e 100644 --- a/src/network.rs +++ b/src/network.rs @@ -11,11 +11,18 @@ use futures_util::{stream::SplitSink, stream::SplitStream, SinkExt, StreamExt}; #[derive(Debug)] pub struct NetworkMessage { pub conn_id: usize, - pub data: tungstenite::Message, + pub data: NetworkPayload, +} + +#[derive(Debug)] +pub enum NetworkPayload { + Connected, + Message(tungstenite::Message), } struct Connection { stream: SplitSink, tungstenite::Message>, + address: SocketAddr, conn_id: usize, } @@ -39,10 +46,14 @@ impl NetworkManager { .connections .get_mut(&message.conn_id) .expect("cant send message to an unregistered connection"); - conn.stream - .send(message.data) - .await - .expect("could not send message to connection"); + match message.data { + NetworkPayload::Message(msg) => conn + .stream + .send(msg) + .await + .expect("could not send message to connection"), + _ => (), + } } } @@ -70,13 +81,27 @@ async fn accept_connection( stream: TcpStream, incoming: Sender, ) -> Connection { + // Generate random connection id let conn_id = rand::random(); + + // Get streams let ws_stream = accept_async(stream).await.expect("could not accept"); - log::info!("New WebSocket connection: {}", peer); let (ws_sender, ws_receiver) = ws_stream.split(); + + // Send event to game instance + incoming + .send(NetworkMessage { + conn_id, + data: NetworkPayload::Connected, + }) + .await; + // Start read loop task::spawn(read_loop(ws_receiver, incoming, conn_id)); + + // Return connection instance for network manager Connection { stream: ws_sender, + address: peer, conn_id, } } @@ -87,12 +112,16 @@ async fn read_loop( conn_id: usize, ) { loop { - let data = stream + let message = stream .next() .await .expect("failed getting the next message") .expect("received error while reading"); - ch.send(NetworkMessage { conn_id, data }).await; + ch.send(NetworkMessage { + conn_id, + data: NetworkPayload::Message(message), + }) + .await; } } diff --git a/src/systems/client.rs b/src/systems/client.rs deleted file mode 100644 index e69de29..0000000 diff --git a/src/systems/mod.rs b/src/systems/mod.rs index b9babe5..8b13789 100644 --- a/src/systems/mod.rs +++ b/src/systems/mod.rs @@ -1 +1 @@ -pub mod client; +