diff options
Diffstat (limited to 'src/game/server.rs')
-rw-r--r-- | src/game/server.rs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/game/server.rs b/src/game/server.rs new file mode 100644 index 0000000..1775bd1 --- /dev/null +++ b/src/game/server.rs @@ -0,0 +1,46 @@ +use super::{ + protocol::{Direction, Packet}, + Config, +}; +use crate::State; +use anyhow::{bail, Result}; +use glam::IVec2; +use log::{error, info}; +use std::sync::Arc; +use tokio::{ + io::{AsyncBufReadExt, AsyncWriteExt, BufReader, BufWriter}, + net::{TcpListener, TcpStream}, + spawn, +}; + +pub async fn game_server(config: Config, state: Arc<State>) -> Result<()> { + let listener = TcpListener::bind(config.bind).await?; + info!("listening on {}", listener.local_addr()?); + while let Ok((sock, addr)) = listener.accept().await { + spawn(async move { + info!("connected {addr}"); + if let Err(e) = handle_client(sock).await { + error!("client error: {e}") + } + info!("disconnected {addr}"); + }); + } + bail!("accept failure") +} + +async fn handle_client(sock: TcpStream) -> Result<()> { + let (rx, tx) = sock.into_split(); + let rx = BufReader::new(rx); + let mut tx = BufWriter::new(tx); + + let mut lines = rx.lines(); + + while let Some(line) = lines.next_line().await? { + let packet = Packet::parse(&line)?; + + tx.write_all(packet.dump().as_bytes()).await?; + tx.flush().await?; + } + + Ok(()) +} |