blastmud/blastmud_game/src/message_handler.rs

48 lines
1.8 KiB
Rust
Raw Normal View History

use blastmud_interfaces::*;
use crate::listener::ListenerMap;
use crate::db;
2022-12-16 20:48:24 +11:00
use MessageFromListener::*;
use uuid::Uuid;
use tokio::{sync::oneshot, task};
use crate::listener::ListenerSend;
use crate::DResult;
use log::info;
pub async fn handle(listener: Uuid, msg: MessageFromListener, pool: db::DBPool, listener_map: ListenerMap)
-> DResult<()> {
2022-12-16 20:48:24 +11:00
match msg {
ListenerPing { .. } => { pool.record_listener_ping(listener).await?; }
SessionConnected { session, source: _ } => {
pool.start_session(listener, session).await?;
}
2022-12-16 20:48:24 +11:00
SessionDisconnected { session: _ } => {}
SessionSentLine { session, msg } => {
info!("Awaiting listener lock");
2022-12-16 20:48:24 +11:00
let lmlock = listener_map.lock().await;
let opt_sender = lmlock.get(&listener).map(|v| v.clone());
drop(lmlock);
info!("Listener lock dropped");
2022-12-16 20:48:24 +11:00
match opt_sender {
None => {}
Some(sender) => {
info!("Spawning message task");
2022-12-16 20:48:24 +11:00
task::spawn(async move {
let (tx, rx) = oneshot::channel();
info!("Sending echo");
2022-12-16 20:48:24 +11:00
sender.send(ListenerSend { message: MessageToListener::SendToSession {
session,
msg: format!("You hear an echo saying: \x1b[31m{}\x1b[0m\r\n", msg) },
ack_notify: tx }).await.unwrap_or(());
info!("Awaiting echo ack");
2022-12-16 20:48:24 +11:00
rx.await.unwrap_or(());
info!("Echo ack received");
2022-12-16 20:48:24 +11:00
});
info!("Message task spawned");
2022-12-16 20:48:24 +11:00
}
}
}
AcknowledgeMessage => {}
}
Ok(())
}