aboutsummaryrefslogtreecommitdiff
path: root/server/src/main.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-06-17 00:04:34 +0200
committermetamuffin <metamuffin@disroot.org>2024-06-17 00:04:34 +0200
commitdd4b88a86a99f028bdfe66fef3c66170629f3cdc (patch)
tree6e9acd5148b18220cfe7de83b80cf47b1aef3449 /server/src/main.rs
parentc10d66de1bd2ef04e4010223dcd82443a5d558f0 (diff)
downloadhurrycurry-dd4b88a86a99f028bdfe66fef3c66170629f3cdc.tar
hurrycurry-dd4b88a86a99f028bdfe66fef3c66170629f3cdc.tar.bz2
hurrycurry-dd4b88a86a99f028bdfe66fef3c66170629f3cdc.tar.zst
establish ws
Diffstat (limited to 'server/src/main.rs')
-rw-r--r--server/src/main.rs81
1 files changed, 59 insertions, 22 deletions
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(())