diff options
author | metamuffin <metamuffin@disroot.org> | 2024-06-03 21:27:52 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-06-03 21:27:52 +0200 |
commit | 3d107ea4710f3dec0eedd91ed5bc1e52d8f15912 (patch) | |
tree | 614a2110d1813c1f0df4170ac9932574c4e22c80 /src/game/server.rs | |
download | gpn-tron-rust-3d107ea4710f3dec0eedd91ed5bc1e52d8f15912.tar gpn-tron-rust-3d107ea4710f3dec0eedd91ed5bc1e52d8f15912.tar.bz2 gpn-tron-rust-3d107ea4710f3dec0eedd91ed5bc1e52d8f15912.tar.zst |
code
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(()) +} |