diff options
Diffstat (limited to 'server/src')
-rw-r--r-- | server/src/main.rs | 131 |
1 files changed, 45 insertions, 86 deletions
diff --git a/server/src/main.rs b/server/src/main.rs index 0f0bac5e..96c268e5 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -3,7 +3,6 @@ use futures_util::{SinkExt, StreamExt}; use log::{debug, info, warn}; use std::{sync::Arc, time::Duration}; use tokio::{ - io::{AsyncBufReadExt, AsyncWriteExt, BufReader}, net::TcpListener, spawn, sync::{broadcast, RwLock}, @@ -20,12 +19,7 @@ use undercooked::{ #[tokio::main] async fn main() -> Result<()> { env_logger::init_from_env("LOG"); - let raw_listener = TcpListener::bind("0.0.0.0:27031").await?; let ws_listener = TcpListener::bind("0.0.0.0:27032").await?; - info!( - "listening for line-based tcp on {}", - raw_listener.local_addr()? - ); info!("listening for websockets on {}", ws_listener.local_addr()?); let data = load_gamedata(); @@ -53,94 +47,59 @@ async fn main() -> Result<()> { spawn(customer(game.clone(), rx.resubscribe())); for id in (1..).map(PlayerID) { - tokio::select! { - r = raw_listener.accept() => { - let (sock, addr) = r?; - let (read, mut write) = sock.into_split(); - let game = game.clone(); - let mut rx = rx.resubscribe(); - info!("{addr} connected"); - let init = game.write().await.prime_client(id); - spawn(async move { - for p in init { - write - .write_all(serde_json::to_string(&p).unwrap().as_bytes()) - .await?; - write.write_all(b"\n").await?; - } - while let Ok(packet) = rx.recv().await { - write - .write_all(serde_json::to_string(&packet).unwrap().as_bytes()) - .await?; - write.write_all(b"\n").await?; - } - Ok::<_, anyhow::Error>(()) - }); - spawn(async move { - let mut read = BufReader::new(read).lines(); - while let Ok(Some(line)) = read.next_line().await { + let (sock, addr) = ws_listener.accept().await?; + let Ok(sock) = tokio_tungstenite::accept_async(sock).await else { + warn!("invalid ws handshake"); + continue; + }; + let (mut write, mut read) = sock.split(); + let game = game.clone(); + let mut rx = rx.resubscribe(); + info!("{addr} connected via ws"); + let init = game.write().await.prime_client(id); + spawn(async move { + for p in init { + if let Err(e) = write + .send(tokio_tungstenite::tungstenite::Message::Text( + serde_json::to_string(&p).unwrap(), + )) + .await + { + warn!("ws error on init: {e}"); + return; + } + } + while let Ok(packet) = rx.recv().await { + if let Err(e) = write + .send(tokio_tungstenite::tungstenite::Message::Text( + serde_json::to_string(&packet).unwrap(), + )) + .await + { + warn!("ws error: {e}"); + break; + } + } + }); + spawn(async move { + while let Some(Ok(message)) = read.next().await { + match message { + Message::Text(line) => { let Ok(packet): Result<PacketS, _> = serde_json::from_str(&line) else { - warn!("invalid json over tcp"); - break + warn!("invalid json over ws"); + break; }; debug!("<- {id:?} {packet:?}"); if let Err(e) = game.write().await.packet_in(id, packet) { warn!("client error: {e}"); } } - let _ = game.write().await.packet_in(id, PacketS::Leave); - }); - } - r = ws_listener.accept() => { - let (sock, addr) = r?; - let Ok(sock) = tokio_tungstenite::accept_async(sock).await else { - warn!("invalid ws handshake"); - continue - }; - let (mut write, mut read) = sock.split(); - let game = game.clone(); - let mut rx = rx.resubscribe(); - info!("{addr} connected via ws"); - let init = game.write().await.prime_client(id); - spawn(async move { - for p in init { - if let Err(e) = write.send(tokio_tungstenite::tungstenite::Message::Text( - serde_json::to_string(&p).unwrap(), - )).await { - warn!("ws error on init: {e}"); - return; - } - } - while let Ok(packet) = rx.recv().await { - if let Err(e) = write.send(tokio_tungstenite::tungstenite::Message::Text( - serde_json::to_string(&packet).unwrap(), - )).await { - warn!("ws error: {e}"); - break; - } - } - }); - spawn(async move { - while let Some(Ok(message)) = read.next().await { - match message { - Message::Text(line) => { - let Ok(packet): Result<PacketS, _> = serde_json::from_str(&line) else { - warn!("invalid json over ws"); - break - }; - debug!("<- {id:?} {packet:?}"); - if let Err(e) = game.write().await.packet_in(id, packet) { - warn!("client error: {e}"); - } - }, - Message::Close(_) => break, - _ => (), - } - } - let _ = game.write().await.packet_in(id, PacketS::Leave); - }); + Message::Close(_) => break, + _ => (), + } } - } + let _ = game.write().await.packet_in(id, PacketS::Leave); + }); } Ok(()) } |