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) -> 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(()) }