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}