Browse Source

Send details about room with RoomJoinResponse.

wip
Titouan Rigoudy 4 years ago
parent
commit
f2b241cffe
4 changed files with 46 additions and 15 deletions
  1. +9
    -4
      client/src/client.rs
  2. +31
    -4
      client/src/control/response.rs
  3. +4
    -4
      client/src/control/ws.rs
  4. +2
    -3
      client/src/handlers/room_join_response_handler.rs

+ 9
- 4
client/src/client.rs View File

@ -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,


+ 31
- 4
client/src/control/response.rs View File

@ -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::<RoomJoinResponse>(r#"{ "room_name": "bleep" }"#)
.unwrap(),
serde_json::from_str::<RoomJoinResponse>(
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![],
}
}
);
}


+ 4
- 4
client/src/control/ws.rs View File

@ -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(),
})
);


+ 2
- 3
client/src/handlers/room_join_response_handler.rs View File

@ -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


Loading…
Cancel
Save