huskies: merge 649_story_migrate_whatsapp_transport_to_status_broadcaster
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user