all repos — gnotif @ 968a32576be704f7e51a44254c2b5d7063b5f845

A simple dbus monitor to see desktop notifications in the terminal

mod.go (view raw)

 1package main
 2
 3import (
 4	"fmt"
 5	"os"
 6	"time"
 7
 8	"github.com/godbus/dbus/v5"
 9)
10
11var DATETIME_FORMAT = "02-01-2006 15:03"
12
13func main() {
14	conn, err := dbus.ConnectSessionBus()
15	if err != nil {
16		fmt.Fprintln(os.Stderr, "Failed to connect to session bus:", err)
17		os.Exit(1)
18	}
19	defer conn.Close()
20
21	// https://github.com/godbus/dbus/blob/master/_examples/monitor.go
22	rules := []string{
23		"type='signal',member='Notify',path='/org/freedesktop/Notifications',interface='org.freedesktop.Notifications'",
24		"type='method_call',member='Notify',path='/org/freedesktop/Notifications',interface='org.freedesktop.Notifications'",
25		"type='method_return',member='Notify',path='/org/freedesktop/Notifications',interface='org.freedesktop.Notifications'",
26		"type='error',member='Notify',path='/org/freedesktop/Notifications',interface='org.freedesktop.Notifications'",
27	}
28	var flag uint = 0
29
30	call := conn.BusObject().Call("org.freedesktop.DBus.Monitoring.BecomeMonitor", 0, rules, flag)
31	if call.Err != nil {
32		fmt.Fprintln(os.Stderr, "Failed to become monitor:", call.Err)
33		os.Exit(1)
34	}
35
36	c := make(chan *dbus.Message, 10)
37	conn.Eavesdrop(c)
38	for v := range c {
39		if len(v.Body) >= 5 {
40			currentTime := time.Now()
41			appName := fmt.Sprintf("%v", v.Body[0])
42			summary := fmt.Sprintf("%v", v.Body[3])
43			body := fmt.Sprintf("%v", v.Body[4])
44			fmt.Printf("%s\n%s %s\n%s\n\n",
45				datetimeStyle.Render(currentTime.Format(DATETIME_FORMAT)),
46				appNameStyle.Render(appName),
47				summaryStyle.Render(summary),
48				bodyStyle.Render(body),
49			)
50		}
51	}
52}