aboutsummaryrefslogtreecommitdiff
path: root/notification.go
diff options
context:
space:
mode:
Diffstat (limited to 'notification.go')
-rw-r--r--notification.go86
1 files changed, 86 insertions, 0 deletions
diff --git a/notification.go b/notification.go
new file mode 100644
index 0000000..2d5625d
--- /dev/null
+++ b/notification.go
@@ -0,0 +1,86 @@
+package main
+
+import (
+ "encoding/json"
+ "log"
+ "os"
+ "time"
+
+ "github.com/godbus/dbus/v5"
+)
+
+type hint struct {
+ dbus.Variant
+}
+
+func (h hint) MarshalJSON() ([]byte, error) {
+ //TODO: find a better way lol
+ switch h.Signature().String()[0] {
+ case 'y':
+ return json.Marshal(h.Value().(uint8))
+ case 'b':
+ return json.Marshal(h.Value().(bool))
+ case 'n':
+ return json.Marshal(h.Value().(int16))
+ case 'q':
+ return json.Marshal(h.Value().(uint16))
+ case 'i':
+ return json.Marshal(h.Value().(int32))
+ case 'u':
+ return json.Marshal(h.Value().(uint32))
+ case 'x':
+ return json.Marshal(h.Value().(int64))
+ case 't':
+ return json.Marshal(h.Value().(uint64))
+ case 'd':
+ return json.Marshal(h.Value().(float64))
+ case 's':
+ return json.Marshal(h.Value().(string))
+ default:
+ panic("Impossible type")
+ }
+}
+
+type closeReason uint32
+
+const (
+ CloseReasonExpire closeReason = 1
+ CloseReasonDismissed = iota
+ CloseReasonClosed = iota
+ CloseReasonOther = iota
+)
+
+type notification struct {
+ Id uint32 `json:"id"`
+ AppName string `json:"app_name"`
+ AppIcon string `json:"app_icon"`
+ Summary string `json:"summary"`
+ Body string `json:"body"`
+ Actions map[string]string `json:"actions"`
+ Hints map[string]hint `json:"hints"`
+ Timestamp int64 `json:"timestamp"`
+ Expiration int32 `json:"expiration"`
+ Image string `json:"image"`
+ timer *time.Timer
+}
+
+func (n notification) close(reason closeReason) {
+ notifications.mutex.Lock()
+ defer notifications.mutex.Unlock()
+
+ if n.timer != nil {
+ n.timer.Stop()
+ }
+
+ if n.Image != "" {
+ os.Remove(n.Image)
+ }
+
+ delete(notifications.notifications, n.Id)
+ output()
+
+ err := conn.Emit(DBUS_OBJECT, DBUS_NAME+".NotificationClosed", n.Id, reason)
+ if err != nil {
+ log.Print(err)
+ }
+}