use futures_util::stream::TryStreamExt; use std::collections::HashMap; use zbus::{message::Body, Connection, Result}; use zvariant::OwnedValue; fn print_notif(msg_body: Body) -> Result<()> { // Deserialize the message body to the expected tuple let (app_name, replace_id, icon, summary, body, actions, hints, expir_timeout): ( String, u32, String, String, String, Vec, HashMap, i32, ) = msg_body.deserialize()?; // Print the notification details println!("App Name: {app_name}"); println!("Replace ID: {replace_id}"); println!("Icon: {icon}"); println!("Summary: {summary}"); println!("Body: {body}"); println!("Actions: {actions:?}"); println!("Hints:"); for (key, value) in hints { println!(" {key}: {value:?}"); } println!("Expiration Timeout: {expir_timeout} seconds\n"); Ok(()) } #[tokio::main] async fn main() -> Result<()> { let connection = Connection::session().await?; connection .request_name("org.freedesktop.Notifications") // Requesting dbus for this service name. Any other services using this name should be stopped/disabled before this .await?; let mut stream = zbus::MessageStream::from(&connection); // Convert connection to a MessageStream, yields Message items while let Some(msg) = stream.try_next().await? { // Check if the message is a method call to the "Notify" method if let Some(member) = msg.header().member().map(|m| m.as_str()) { match member { "GetServerInformation" => { // Respond with server information let response = ("SNot", "candifloss.cc", "0.1.0", "0.1.0"); // (name, vendor, version, spec_version) connection.reply(&msg, &response).await?; println!("Request received: {member}\n\tName: SNot\n\tVendor: candifloss.cc\n\tVersion: 0.1.0\n\tSpec_version: 0.1.0"); } "Notify" => { println!("Member is: {member}"); // Handle notif let msg_body = msg.body(); // get the app_name, summary, body, etc. from the msg_body and print it let _ = print_notif(msg_body); // Done. Respond with a notification ID let notification_id: u32 = 1; // This could be incremented or generated connection.reply(&msg, ¬ification_id).await?; } _ => { println!("Unhandled method: {member}"); } }; } } Ok(()) }