statusbar-go/module_dbus.go

121 lines
2.6 KiB
Go

package main
import (
"fmt"
"html"
"strconv"
"strings"
"github.com/godbus/dbus/v5"
)
var HEADSET_PATH = dbus.ObjectPath("/org/bluez/hci0/dev_" + strings.ReplaceAll(HEADSET, ":", "_"))
func dbus_system_handler(feedback chan bool) {
// watches for BT headset connections
headsetObjectPath := "/org/bluez/hci0/dev_" + strings.ReplaceAll(HEADSET, ":", "_")
err := CONN.dbusSystem.AddMatchSignal(
dbus.WithMatchObjectPath(dbus.ObjectPath(headsetObjectPath)),
dbus.WithMatchInterface("org.freedesktop.DBus.Properties"),
)
if err != nil {
warn("Failed to add match signal", err)
return
}
sigs := make(chan *dbus.Signal, 1)
CONN.dbusSystem.Signal(sigs)
for range sigs {
CACHE.Delete(CACHE_BT_CONNECTED)
CACHE.Delete(CACHE_BT_BATTERY)
feedback <- true
}
}
func dbus_session_handler(feedback chan bool) {
// watches for media changes
err := CONN.dbusSession.AddMatchSignal(
dbus.WithMatchObjectPath("/org/mpris/MediaPlayer2"),
dbus.WithMatchInterface("org.freedesktop.DBus.Properties"),
)
if err != nil {
warn("Failed to add match signal", err)
return
}
sigs := make(chan *dbus.Signal, 1)
CONN.dbusSession.Signal(sigs)
for range sigs {
CACHE.Delete(CACHE_MEDIA)
feedback <- true
}
}
func get_bt_headset_connected() bool {
obj := CONN.dbusSystem.Object("org.bluez", HEADSET_PATH)
status, err := obj.GetProperty("org.bluez.Device1.Connected")
if err == nil {
if status.String() == "true" {
return true
}
}
return false
}
func get_bt_headset_battery() string {
obj := CONN.dbusSystem.Object("org.bluez", HEADSET_PATH)
status, err := obj.GetProperty("org.bluez.Battery1.Percentage")
if err == nil {
return fmt.Sprintf("%v", status.Value())
}
return ""
}
func get_playing_spotify_media() string {
var output strings.Builder
obj := CONN.dbusSession.Object("org.mpris.MediaPlayer2.spotify", "/org/mpris/MediaPlayer2")
metadata, err := obj.GetProperty("org.mpris.MediaPlayer2.Player.Metadata")
if err != nil {
return ""
}
status, err := obj.GetProperty("org.mpris.MediaPlayer2.Player.PlaybackStatus")
if err != nil {
return ""
}
if status.String() != "\"Playing\"" {
output.WriteString("‖ ")
}
metadataMap := metadata.Value().(map[string]dbus.Variant)
artists := make([]string, 1)
metadataMap["xesam:artist"].Store(&artists)
title := metadataMap["xesam:title"].String()
titleUnquoted, err := strconv.Unquote(title)
if err != nil {
titleUnquoted = "bug: strconv unquoting fail"
}
if titleUnquoted == "" {
return ""
}
output.WriteString(fmt.Sprintf(
"%s - %s",
strings.Join(artists, ", "),
titleUnquoted,
))
return html.EscapeString(output.String())
}