|
|
|
@ -1,5 +1,4 @@ |
|
|
|
use anyhow::Context as AnyhowContext;
|
|
|
|
use log::warn;
|
|
|
|
use solstice_proto::server;
|
|
|
|
|
|
|
|
use crate::context::Context;
|
|
|
|
@ -10,42 +9,34 @@ use crate::room::Message as RoomMessage; |
|
|
|
#[derive(Debug, Default)]
|
|
|
|
pub struct RoomMessageResponseHandler;
|
|
|
|
|
|
|
|
fn add_message(
|
|
|
|
context: &mut Context,
|
|
|
|
response: &server::RoomMessageResponse,
|
|
|
|
) -> anyhow::Result<()> {
|
|
|
|
let room = context
|
|
|
|
.state
|
|
|
|
.rooms
|
|
|
|
.get_mut_strict(&response.room_name)
|
|
|
|
.context("looking up room")?;
|
|
|
|
room.messages.insert(RoomMessage {
|
|
|
|
received_at: context.system_clock.now(),
|
|
|
|
user_name: response.user_name.clone(),
|
|
|
|
message: response.message.clone(),
|
|
|
|
});
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
impl MessageHandler for RoomMessageResponseHandler {
|
|
|
|
type Message = server::RoomMessageResponse;
|
|
|
|
|
|
|
|
fn run(
|
|
|
|
self,
|
|
|
|
context: &mut Context,
|
|
|
|
message: &server::RoomMessageResponse,
|
|
|
|
response: &server::RoomMessageResponse,
|
|
|
|
) -> anyhow::Result<()> {
|
|
|
|
if let Err(err) = add_message(context, message) {
|
|
|
|
warn!("Error storing room message: {:#}", err);
|
|
|
|
}
|
|
|
|
let room = context
|
|
|
|
.state
|
|
|
|
.rooms
|
|
|
|
.get_mut_strict(&response.room_name)
|
|
|
|
.context("looking up room")?;
|
|
|
|
|
|
|
|
let message = RoomMessage {
|
|
|
|
received_at: context.system_clock.now(),
|
|
|
|
user_name: response.user_name.clone(),
|
|
|
|
message: response.message.clone(),
|
|
|
|
};
|
|
|
|
|
|
|
|
room.messages.insert(message.clone());
|
|
|
|
|
|
|
|
context
|
|
|
|
.control_response_tx
|
|
|
|
.blocking_send(control::Response::RoomMessageResponse(
|
|
|
|
control::RoomMessageResponse {
|
|
|
|
room_name: message.room_name.clone(),
|
|
|
|
user_name: message.user_name.clone(),
|
|
|
|
message: message.message.clone(),
|
|
|
|
room_name: response.room_name.clone(),
|
|
|
|
message,
|
|
|
|
},
|
|
|
|
))
|
|
|
|
.context("sending control response")?;
|
|
|
|
@ -67,7 +58,7 @@ mod tests { |
|
|
|
use crate::context::{ContextBundle, ContextOptions};
|
|
|
|
use crate::control;
|
|
|
|
use crate::message_handler::MessageHandler;
|
|
|
|
use crate::room::{Message as RoomMessage, Room, Visibility};
|
|
|
|
use crate::room::{Message, Room, Visibility};
|
|
|
|
|
|
|
|
use super::RoomMessageResponseHandler;
|
|
|
|
|
|
|
|
@ -77,13 +68,21 @@ mod tests { |
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn run_forwards_response() {
|
|
|
|
let mut bundle = ContextBundle::default();
|
|
|
|
let mut options = ContextOptions::default();
|
|
|
|
options
|
|
|
|
.initial_state
|
|
|
|
.rooms
|
|
|
|
.insert("apple".to_string(), Room::new(Visibility::Public, 1));
|
|
|
|
options.simulated_clock =
|
|
|
|
Some(SimulatedSystemClock::new(system_time_from_secs(42)));
|
|
|
|
|
|
|
|
let mut bundle = ContextBundle::new(options);
|
|
|
|
|
|
|
|
RoomMessageResponseHandler::default()
|
|
|
|
.run(
|
|
|
|
&mut bundle.context,
|
|
|
|
&server::RoomMessageResponse {
|
|
|
|
room_name: "bleep".to_string(),
|
|
|
|
room_name: "apple".to_string(),
|
|
|
|
user_name: "shruti".to_string(),
|
|
|
|
message: "yo!".to_string(),
|
|
|
|
},
|
|
|
|
@ -98,9 +97,12 @@ mod tests { |
|
|
|
assert_eq!(
|
|
|
|
response,
|
|
|
|
control::Response::RoomMessageResponse(control::RoomMessageResponse {
|
|
|
|
room_name: "bleep".to_string(),
|
|
|
|
user_name: "shruti".to_string(),
|
|
|
|
message: "yo!".to_string(),
|
|
|
|
room_name: "apple".to_string(),
|
|
|
|
message: Message {
|
|
|
|
user_name: "shruti".to_string(),
|
|
|
|
message: "yo!".to_string(),
|
|
|
|
received_at: SystemTime::UNIX_EPOCH + Duration::from_secs(42),
|
|
|
|
},
|
|
|
|
})
|
|
|
|
);
|
|
|
|
}
|
|
|
|
@ -108,7 +110,7 @@ mod tests { |
|
|
|
#[test]
|
|
|
|
fn run_stores_message() {
|
|
|
|
let mut room = Room::new(Visibility::Public, 42);
|
|
|
|
room.messages.insert(RoomMessage {
|
|
|
|
room.messages.insert(Message {
|
|
|
|
received_at: system_time_from_secs(42),
|
|
|
|
user_name: "karandeep".to_string(),
|
|
|
|
message: "namaste!".to_string(),
|
|
|
|
@ -145,12 +147,12 @@ mod tests { |
|
|
|
assert_eq!(
|
|
|
|
room.messages.to_vec(),
|
|
|
|
vec![
|
|
|
|
RoomMessage {
|
|
|
|
Message {
|
|
|
|
received_at: system_time_from_secs(42),
|
|
|
|
user_name: "karandeep".to_string(),
|
|
|
|
message: "namaste!".to_string(),
|
|
|
|
},
|
|
|
|
RoomMessage {
|
|
|
|
Message {
|
|
|
|
received_at: system_time_from_secs(43),
|
|
|
|
user_name: "shruti".to_string(),
|
|
|
|
message: "yo!".to_string(),
|
|
|
|
|