diff options
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(()) | 
