From f2b241cffebc0890c3e1fc1b2a46edb6d5be0950 Mon Sep 17 00:00:00 2001 From: Titouan Rigoudy Date: Thu, 19 Aug 2021 11:20:09 +0200 Subject: [PATCH] Send details about room with RoomJoinResponse. --- client/src/client.rs | 13 ++++--- client/src/control/response.rs | 35 ++++++++++++++++--- client/src/control/ws.rs | 8 ++--- .../handlers/room_join_response_handler.rs | 5 ++- 4 files changed, 46 insertions(+), 15 deletions(-) diff --git a/client/src/client.rs b/client/src/client.rs index 62a1002..caf9bbd 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -589,10 +589,14 @@ impl Client { response.operators, &response.users, ); - if let Err(err) = result { - error!("RoomJoinResponse: {}", err); - return; - } + + let room = match result { + Ok(room) => room, + Err(err) => { + error!("RoomJoinResponse: {}", err); + return; + } + }; // Then update the user structs based on the info we just got. for user in response.users.drain(..) { @@ -601,6 +605,7 @@ impl Client { let control_response = control::RoomJoinResponse { room_name: response.room_name, + room: room.clone(), }; self.send_to_controller(control::Response::RoomJoinResponse( control_response, diff --git a/client/src/control/response.rs b/client/src/control/response.rs index 1772f15..34484ee 100644 --- a/client/src/control/response.rs +++ b/client/src/control/response.rs @@ -1,4 +1,4 @@ -use crate::room; +use crate::room::Room; use serde::{Deserialize, Serialize}; use solstice_proto::User; @@ -20,6 +20,7 @@ pub enum Response { #[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct RoomJoinResponse { pub room_name: String, + pub room: Room, } #[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] @@ -60,7 +61,7 @@ pub enum LoginStatusResponse { #[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct RoomListResponse { /// The list of (room name, room data) pairs. - pub rooms: Vec<(String, room::Room)>, + pub rooms: Vec<(String, Room)>, } /// This structure contains a message said in a chat room the user is a member @@ -172,10 +173,36 @@ mod tests { #[test] fn deserialize_room_join_response() { assert_eq!( - serde_json::from_str::(r#"{ "room_name": "bleep" }"#) - .unwrap(), + serde_json::from_str::( + r#"{ + "room_name": "bleep", + "room": { + "membership": "Joining", + "visibility": "PrivateOwned", + "operated": false, + "user_count": 3, + "owner": null, + "operators": [], + "members": [], + "messages": [], + "tickers": [] + } + }"# + ) + .unwrap(), RoomJoinResponse { room_name: "bleep".to_string(), + room: Room { + membership: Membership::Joining, + visibility: Visibility::PrivateOwned, + operated: false, + user_count: 3, + owner: None, + operators: HashSet::new(), + members: HashSet::new(), + messages: vec![], + tickers: vec![], + } } ); } diff --git a/client/src/control/ws.rs b/client/src/control/ws.rs index 1549017..d888b91 100644 --- a/client/src/control/ws.rs +++ b/client/src/control/ws.rs @@ -164,7 +164,7 @@ mod tests { use tokio_tungstenite::connect_async; use tokio_tungstenite::tungstenite::Message as WebSocketMessage; - use crate::control::{Request, Response, RoomJoinResponse}; + use crate::control::{Request, Response, RoomLeaveResponse}; use crate::dispatcher::Message; struct Channels { @@ -284,7 +284,7 @@ mod tests { .context("binding listener")?; let address = format!("ws://{}", listener.address()); - let mut channels = Channels::default(); + let channels = Channels::default(); // Move individual fields out of `channels`, for capture by `tokio::spawn`. let message_tx = channels.message_tx; @@ -296,7 +296,7 @@ mod tests { channels .response_tx - .send(Response::RoomJoinResponse(RoomJoinResponse { + .send(Response::RoomLeaveResponse(RoomLeaveResponse { room_name: "bleep".to_string(), })) .await @@ -315,7 +315,7 @@ mod tests { assert_eq!( response, - Response::RoomJoinResponse(RoomJoinResponse { + Response::RoomLeaveResponse(RoomLeaveResponse { room_name: "bleep".to_string(), }) ); diff --git a/client/src/handlers/room_join_response_handler.rs b/client/src/handlers/room_join_response_handler.rs index 69e6e85..efcb404 100644 --- a/client/src/handlers/room_join_response_handler.rs +++ b/client/src/handlers/room_join_response_handler.rs @@ -18,7 +18,7 @@ impl MessageHandler for RoomJoinResponseHandler { ) -> anyhow::Result<()> { { let mut guard = context.state.lock(); - let _room = guard + let room = guard .rooms .join( &response.room_name, @@ -28,12 +28,11 @@ impl MessageHandler for RoomJoinResponseHandler { ) .context("joining room")?; - // TODO: Re-evaluate this with deadlocks in mind. // Send under lock to avoid out-of-order sends. - // TODO: Send details about the room too in the same response. let control_response = control::Response::RoomJoinResponse(control::RoomJoinResponse { room_name: response.room_name.clone(), + room: room.clone(), }); context