huskies: merge 649_story_migrate_whatsapp_transport_to_status_broadcaster

This commit is contained in:
dave
2026-04-27 14:14:21 +00:00
parent 6c8043d866
commit cbb0a50729
3 changed files with 60 additions and 0 deletions
+33
View File
@@ -752,6 +752,39 @@ async fn main() -> Result<(), std::io::Error> {
watcher_rx_for_whatsapp,
root.clone(),
);
// Subscribe to the status broadcaster if the whatsapp_status_consumer toggle
// is enabled (default: true). Formats each StatusEvent via the common
// formatter and sends the resulting text to all active WhatsApp senders.
// The task exits automatically when the broadcaster is dropped on shutdown.
{
use crate::service::status::format::format_status_event;
let status_enabled = config::ProjectConfig::load(root)
.map(|c| c.whatsapp_status_consumer)
.unwrap_or(true);
if status_enabled {
let mut sub = ctx.services.status.subscribe();
let transport = Arc::clone(&ctx.transport) as Arc<dyn crate::chat::ChatTransport>;
let ambient_rooms = Arc::clone(&ctx.services.ambient_rooms);
tokio::spawn(async move {
while let Some(event) = sub.recv().await {
let plain = format_status_event(&event);
let rooms: Vec<String> =
ambient_rooms.lock().unwrap().iter().cloned().collect();
for room in &rooms {
if let Err(e) = transport.send_message(room, &plain, "").await {
crate::slog!(
"[whatsapp] Failed to send status event to {room}: {e}"
);
}
}
}
crate::slog!("[whatsapp] Status subscriber task exiting — broadcaster dropped");
});
}
}
} else {
drop(watcher_rx_for_whatsapp);
}