summaryrefslogtreecommitdiff
path: root/server/src/room.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2022-09-07 14:46:09 +0200
committermetamuffin <metamuffin@disroot.org>2022-09-07 14:46:09 +0200
commit3ce9a53e272dc556222bca747461b3ec24796912 (patch)
tree3f0f780801cbb49ef797c361cf67b4709bacac42 /server/src/room.rs
parent61950198e3bf06555f48e8f51c882a4c3cce5128 (diff)
downloadkeks-meet-3ce9a53e272dc556222bca747461b3ec24796912.tar
keks-meet-3ce9a53e272dc556222bca747461b3ec24796912.tar.bz2
keks-meet-3ce9a53e272dc556222bca747461b3ec24796912.tar.zst
start with the new server
Diffstat (limited to 'server/src/room.rs')
-rw-r--r--server/src/room.rs76
1 files changed, 76 insertions, 0 deletions
diff --git a/server/src/room.rs b/server/src/room.rs
new file mode 100644
index 0000000..14ff9b6
--- /dev/null
+++ b/server/src/room.rs
@@ -0,0 +1,76 @@
+use crate::protocol::{ClientboundPacket, ServerboundPacket};
+use futures_util::{SinkExt, StreamExt, TryFutureExt};
+use log::error;
+use std::collections::HashMap;
+use tokio::sync::{mpsc, RwLock};
+use warp::ws::{Message, WebSocket};
+
+#[derive(Debug)]
+pub struct Client {
+ out: mpsc::UnboundedSender<ClientboundPacket>,
+}
+
+#[derive(Debug, Default)]
+pub struct Room {
+ clients: RwLock<HashMap<usize, Client>>,
+}
+
+impl Room {
+ pub async fn client_connect(&self, ws: WebSocket) {
+ let (mut user_ws_tx, mut user_ws_rx) = ws.split();
+
+ let (tx, mut rx) = mpsc::unbounded_channel();
+
+ tokio::task::spawn(async move {
+ while let Some(packet) = rx.recv().await {
+ user_ws_tx
+ .send(Message::text(serde_json::to_string(&packet).unwrap()))
+ .unwrap_or_else(|e| {
+ eprintln!("websocket send error: {}", e);
+ })
+ .await;
+ }
+ });
+
+ let id = {
+ let mut g = self.clients.write().await;
+ let id = g.len();
+ g.insert(id, Client { out: tx });
+ id
+ };
+
+ while let Some(result) = user_ws_rx.next().await {
+ let msg = match result {
+ Ok(msg) => msg,
+ Err(e) => {
+ error!("websocket error(id={id}): {e}");
+ break;
+ }
+ };
+ if let Ok(s) = msg.to_str() {
+ let p = match serde_json::from_str::<ServerboundPacket>(s) {
+ Ok(p) => p,
+ Err(e) => {
+ error!("client(id={id}) sent invalid packet: {e:?}");
+ break;
+ }
+ };
+ self.client_message(id, p).await;
+ };
+ }
+
+ self.clients.write().await.remove(&id);
+ }
+
+ pub async fn client_message(&self, sender: usize, packet: ServerboundPacket) {
+ for (&id, tx) in self.clients.read().await.iter() {
+ if sender != id {
+ let _ = tx.out.send(todo!());
+ }
+ }
+ }
+
+ pub async fn should_remove(&self) -> bool {
+ self.clients.read().await.len() == 0
+ }
+}