use asterisk_rs_ami::AmiClient;
use std::time::Duration;
use tracing::info;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt::init();
let client = AmiClient::builder()
.host("127.0.0.1")
.port(5038)
.credentials("admin", "secret")
.timeout(Duration::from_secs(10))
.ping_interval(Duration::from_secs(20))
.build()
.await?;
info!("connected, starting call tracker");
let (tracker, mut rx) = client.call_tracker();
let collector = tokio::spawn(async move {
while let Some(call) = rx.recv().await {
info!(
channel = %call.channel,
unique_id = %call.unique_id,
linked_id = %call.linked_id,
duration_ms = call.duration.as_millis(),
cause = call.cause,
cause_txt = %call.cause_txt,
events = call.events.len(),
"call completed",
);
}
info!("call tracker receiver closed");
});
tokio::signal::ctrl_c().await?;
info!("shutting down");
tracker.shutdown();
collector.await?;
client.disconnect().await?;
Ok(())
}