use crate::websocat::chat::services::save_chat_message;
use super::ChatServerHandle;
use super::ConnId;
pub async fn process_text_msg(
chat_server: &ChatServerHandle,
session: &mut actix_ws::Session,
text: &str,
conn: ConnId,
name: &mut Option<String>,
) {
let msg = text.trim();
if msg.starts_with('/') {
let mut cmd_args = msg.splitn(2, ' ');
match cmd_args.next().unwrap() {
"/list" => {
log::info!("conn {conn}: listing rooms");
let rooms = chat_server.list_rooms().await;
for room in rooms {
session.text(room).await.unwrap();
}
}
"/join" => match cmd_args.next() {
Some(room) => {
log::info!("conn {conn}: joining room {room}");
chat_server.join_room(conn, room).await;
session.text(format!("joined {room}")).await.unwrap();
}
None => {
session.text("!!! room name is required").await.unwrap();
}
},
"/name" => match cmd_args.next() {
Some(new_name) => {
log::info!("conn {conn}: setting name to: {new_name}");
name.replace(new_name.to_owned());
}
None => {
session.text("!!! name is required").await.unwrap();
}
},
_ => {
session
.text(format!("!!! unknown command: {msg}"))
.await
.unwrap();
}
}
} else {
let msg = match name {
Some(ref name) => {
format!("{name}: {msg}")
}
None => msg.to_owned(),
};
match save_chat_message(chat_server.context.mongo(), &msg).await {
Ok(result) => {
log::info!("save_chat_message: result={}", result);
}
Err(e) => {
log::error!("error={:?}", e);
}
}
log::info!("process_text_msg: msg={}", msg);
chat_server.send_message(conn, msg).await
}
}