diff options
author | metamuffin <metamuffin@disroot.org> | 2024-06-17 00:04:34 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-06-17 00:04:34 +0200 |
commit | dd4b88a86a99f028bdfe66fef3c66170629f3cdc (patch) | |
tree | 6e9acd5148b18220cfe7de83b80cf47b1aef3449 /server/src | |
parent | c10d66de1bd2ef04e4010223dcd82443a5d558f0 (diff) | |
download | hurrycurry-dd4b88a86a99f028bdfe66fef3c66170629f3cdc.tar hurrycurry-dd4b88a86a99f028bdfe66fef3c66170629f3cdc.tar.bz2 hurrycurry-dd4b88a86a99f028bdfe66fef3c66170629f3cdc.tar.zst |
establish ws
Diffstat (limited to 'server/src')
-rw-r--r-- | server/src/game.rs | 2 | ||||
-rw-r--r-- | server/src/main.rs | 81 |
2 files changed, 59 insertions, 24 deletions
diff --git a/server/src/game.rs b/server/src/game.rs index 0d1e8c3b..458a796b 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -3,8 +3,6 @@ use anyhow::{anyhow, Result}; use glam::UVec2; use std::collections::{HashMap, VecDeque}; -struct ItemData {} - struct TileData { items: Vec<ID>, active: bool, diff --git a/server/src/main.rs b/server/src/main.rs index 06786c05..0987e9ef 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use futures_util::{SinkExt, StreamExt}; use log::{debug, info}; use std::{sync::Arc, time::Duration}; use tokio::{ @@ -8,6 +9,7 @@ use tokio::{ sync::{broadcast, RwLock}, time::sleep, }; +use tokio_tungstenite::tungstenite::Message; use undercooked::{ game::Game, protocol::{PacketC, PacketS}, @@ -16,8 +18,13 @@ use undercooked::{ #[tokio::main] async fn main() -> Result<()> { env_logger::init_from_env("LOG"); - let listener = TcpListener::bind("0.0.0.0:27031").await?; - info!("listening on {}", listener.local_addr()?); + 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 game = Arc::new(RwLock::new(Game::new())); let (tx, rx) = broadcast::channel::<PacketC>(1024); @@ -37,28 +44,58 @@ async fn main() -> Result<()> { } for id in 0.. { - let (sock, addr) = listener.accept().await?; - let (read, mut write) = sock.into_split(); - let game = game.clone(); - let mut rx = rx.resubscribe(); - info!("{addr} connected"); - spawn(async move { - while let Ok(packet) = rx.recv().await { - write - .write_all(serde_json::to_string(&packet).unwrap().as_bytes()) - .await - .unwrap(); - write.write_all(b"\n").await.unwrap(); + 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"); + spawn(async move { + while let Ok(packet) = rx.recv().await { + write + .write_all(serde_json::to_string(&packet).unwrap().as_bytes()) + .await + .unwrap(); + write.write_all(b"\n").await.unwrap(); + } + }); + spawn(async move { + let mut read = BufReader::new(read).lines(); + while let Ok(Some(line)) = read.next_line().await { + let packet: PacketS = serde_json::from_str(&line).unwrap(); + debug!("<- {id} {packet:?}"); + game.write().await.packet_in(id, packet).unwrap(); + } + }); } - }); - spawn(async move { - let mut read = BufReader::new(read).lines(); - while let Ok(Some(line)) = read.next_line().await { - let packet: PacketS = serde_json::from_str(&line).unwrap(); - debug!("<- {id} {packet:?}"); - game.write().await.packet_in(id, packet).unwrap(); + r = ws_listener.accept() => { + // let (sock, addr) = ws_listener.accept().await?; + let (sock, addr) = r?; + let sock = tokio_tungstenite::accept_async(sock).await?; + let (mut write, mut read) = sock.split(); + let game = game.clone(); + let mut rx = rx.resubscribe(); + info!("{addr} connected via ws"); + spawn(async move { + while let Ok(packet) = rx.recv().await { + write + .send(tokio_tungstenite::tungstenite::Message::Text( + serde_json::to_string(&packet).unwrap(), + )) + .await + .unwrap(); + } + }); + spawn(async move { + while let Some(Ok(Message::Text(message))) = read.next().await { + let packet: PacketS = serde_json::from_str(&message).unwrap(); + debug!("<- {id} {packet:?}"); + game.write().await.packet_in(id, packet).unwrap(); + } + }); } - }); + } } Ok(()) |