diff --git a/lib/src/models.rs b/lib/src/models.rs index bc7760b..55fef68 100644 --- a/lib/src/models.rs +++ b/lib/src/models.rs @@ -21,12 +21,18 @@ pub struct ServerStateSummary { } /// User -#[derive(Clone, Eq, PartialEq, Hash)] +#[derive(Clone, Debug, Eq, PartialEq, Hash)] pub struct User { pub name: String, pub addr: SocketAddr, } +impl User { + pub fn change_name(&mut self, new_name: String) { + self.name = new_name; + } +} + /// New game request structure #[derive(Debug, Serialize, Deserialize)] pub struct NewGameRequest { diff --git a/server/src/api.rs b/server/src/api.rs index 143ba03..33e18f6 100644 --- a/server/src/api.rs +++ b/server/src/api.rs @@ -27,7 +27,7 @@ fn server_sum_update(state: &Arc) -> ServerStateSummary { } } -pub async fn on_websocket_connection(stream: WebSocket, state: Arc, who: User) { +pub async fn on_websocket_connection(stream: WebSocket, state: Arc, mut who: User) { // Add user to users //if doesn't exist let _true_if_not_exist = &state.users.lock().unwrap().insert(who.clone()); @@ -73,7 +73,7 @@ pub async fn on_websocket_connection(stream: WebSocket, state: Arc, wh // handle new incoming messages let mut recv_task = tokio::spawn(async move { while let Some(Ok(message)) = receiver.next().await { - message_handler(message, &state, &who).await + message_handler(message, &state, &mut who).await } }); diff --git a/server/src/api/message_handler.rs b/server/src/api/message_handler.rs index 1ef3123..b8d24f8 100644 --- a/server/src/api/message_handler.rs +++ b/server/src/api/message_handler.rs @@ -4,7 +4,7 @@ use crate::api::*; use crate::AppState; use crate::Arc; -pub async fn message_handler(message: Message, state: &Arc, who: &User) { +pub async fn message_handler(message: Message, state: &Arc, who: &mut User) { let tx = &state.tx; match message { @@ -30,6 +30,17 @@ pub async fn message_handler(message: Message, state: &Arc, who: &User let msg = format! {"{0}: {1}", who.name, chat_message.text}; tracing::debug!("{msg}"); let _res = tx.send(to_string::(&ChatMessage { text: msg }).unwrap()); + } else if let Ok(user_log_in) = serde_json::from_str::(&text) { + let old_name = who.name.clone(); + let new_name = user_log_in.username.clone(); + who.change_name(user_log_in.username); + let msg = format!{ + "{0} changed name to {1}.", + old_name, + new_name + }; + tracing::debug!("{msg}"); + let _res = tx.send(to_string::(&ChatMessage { text: msg }).unwrap()); } else { tracing::debug!("Unhandled message: {}", &text); }