aboutsummaryrefslogtreecommitdiff
path: root/src/game/server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/server.rs')
-rw-r--r--src/game/server.rs46
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(())
+}