#![allow(clippy::print_stdout)]
use blooio::webhook::{MessageEventKind, WebhookEvent, verify_at, verify_default};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let secret = b"whsec_example_secret";
let body = br#"{"event":"message.received","message_id":"m_123","text":"Hi there!","sender":"+15555550123"}"#;
let signature_header =
"t=1700000000,v1=a031050aeb41a7ef072aefefdece109e8ca7db26d85348b8b64a911dac4e2987";
let _ = verify_default; verify_at(secret, signature_header, body, 300, 1_700_000_000)?;
println!("signature OK");
let event = WebhookEvent::parse(body)?;
match event.kind() {
Some(MessageEventKind::Received) => {
println!(
"inbound message from {:?}: {:?}",
event.payload.sender, event.payload.text
);
}
Some(MessageEventKind::Delivered | MessageEventKind::Read) => {
println!("status update for {:?}", event.payload.message_id);
}
Some(other) => println!("other event: {other:?}"),
None => println!("payload carried no event field"),
}
let tampered = br#"{"event":"message.received","text":"gotcha"}"#;
match verify_at(secret, signature_header, tampered, 300, 1_700_000_000) {
Ok(()) => println!("unexpected: tampered body verified"),
Err(e) => println!("tampered body rejected: {e}"),
}
Ok(())
}