mod config; mod game; use crate::config::Settings; use crate::game::world::GameWorld; use futures_util::StreamExt; use log::info; use std::io::Error; use tokio::net::{TcpListener, TcpStream}; #[tokio::main] async fn main() -> Result<(), Error> { let world = GameWorld::new(); let mut dispatcher = world.dispatcher(); dispatcher.dispatch(); let settings = Settings::new().unwrap(); // Create the event loop and TCP listener we'll accept connections on. let try_socket = TcpListener::bind(&settings.bind).await; let mut listener = try_socket.expect("Failed to bind"); info!("Listening on: {}", settings.bind); while let Ok((stream, _)) = listener.accept().await { tokio::spawn(accept_connection(stream)); } dispatcher.wait(); Ok(()) } async fn accept_connection(stream: TcpStream) { let addr = stream .peer_addr() .expect("connected streams should have a peer address"); info!("Peer address: {}", addr); let ws_stream = tokio_tungstenite::accept_async(stream) .await .expect("Error during the websocket handshake occurred"); info!("New WebSocket connection: {}", addr); let (write, read) = ws_stream.split(); read.forward(write) .await .expect("Failed to forward message") }