2024-09-01 08:20:17 +00:00
use futures_util ::stream ::TryStreamExt ;
2024-09-15 18:10:19 +00:00
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 < String > ,
HashMap < String , OwnedValue > ,
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 " ) ;
Ok ( ( ) )
}
2024-08-27 11:28:05 +00:00
#[ tokio::main ]
async fn main ( ) -> Result < ( ) > {
let connection = Connection ::session ( ) . await ? ;
2024-09-01 08:20:17 +00:00
connection
2024-09-14 10:33:40 +00:00
. request_name ( " org.freedesktop.Notifications " ) // Requesting dbus for this service name. Any other services using this name should be stopped/disabled before this
2024-09-01 08:20:17 +00:00
. await ? ;
2024-08-25 21:10:15 +00:00
2024-09-15 15:43:09 +00:00
let mut stream = zbus ::MessageStream ::from ( & connection ) ; // Convert connection to a MessageStream, yields Message items
2024-09-01 11:31:19 +00:00
while let Some ( msg ) = stream . try_next ( ) . await ? {
2024-09-15 15:43:09 +00:00
// Check if the message is a method call to the "Notify" method
if let Some ( member ) = msg . header ( ) . member ( ) . map ( | m | m . as_str ( ) ) {
2024-09-15 18:10:19 +00:00
match member {
" GetServerInformation " = > {
println! ( " Member is: {member} " ) ;
// Respond with server information
let response = ( " SNot " , " candifloss.cc " , " 0.1.0 " , " 1.0 " ) ; // (name, vendor, version, spec_version)
connection . reply ( & msg , & response ) . await ? ;
}
" 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 , & notification_id ) . await ? ;
}
_ = > {
println! ( " Unhandled method: {member} " ) ;
}
} ;
2024-09-14 10:33:40 +00:00
}
2024-09-01 11:31:19 +00:00
}
Ok ( ( ) )
}