use std::{
path::Path,
sync::{
atomic::{AtomicU64, Ordering},
Arc,
},
};
use crate::{history, message::Message};
use super::state::{ClientMap, HostUser};
pub(crate) async fn broadcast_and_persist(
msg: &Message,
clients: &ClientMap,
chat_path: &Path,
seq_counter: &Arc<AtomicU64>,
) -> anyhow::Result<Message> {
let seq = seq_counter.fetch_add(1, Ordering::SeqCst) + 1;
let mut msg = msg.clone();
msg.set_seq(seq);
history::append(chat_path, &msg).await?;
let line = format!("{}\n", serde_json::to_string(&msg)?);
let map = clients.lock().await;
for (_, tx) in map.values() {
let _ = tx.send(line.clone());
}
Ok(msg)
}
pub(crate) async fn dm_and_persist(
msg: &Message,
host_user: &HostUser,
clients: &ClientMap,
chat_path: &Path,
seq_counter: &Arc<AtomicU64>,
) -> anyhow::Result<Message> {
let seq = seq_counter.fetch_add(1, Ordering::SeqCst) + 1;
let mut msg = msg.clone();
msg.set_seq(seq);
history::append(chat_path, &msg).await?;
let line = format!("{}\n", serde_json::to_string(&msg)?);
let host = host_user.lock().await;
let host_name = host.as_deref();
let map = clients.lock().await;
for (username, tx) in map.values() {
if msg.is_visible_to(username, host_name) {
let _ = tx.send(line.clone());
}
}
Ok(msg)
}