Compare commits
No commits in common. "a8c527ba18fb335811ad42f86199181032d7b367" and "c3b35cdd2d5b403a52103b90088b11251318ee63" have entirely different histories.
a8c527ba18
...
c3b35cdd2d
49
bus/bus.go
49
bus/bus.go
@ -1,49 +0,0 @@
|
|||||||
package bus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"git.t-juice.club/torjus/ghettoptt/metrics"
|
|
||||||
"github.com/godbus/dbus/v5"
|
|
||||||
)
|
|
||||||
|
|
||||||
type MumbleBus struct {
|
|
||||||
conn *dbus.Conn
|
|
||||||
obj dbus.BusObject
|
|
||||||
metrics *metrics.MumbleMetricsCollector
|
|
||||||
|
|
||||||
lastTalked time.Time
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewMumbleBus(m *metrics.MumbleMetricsCollector) *MumbleBus {
|
|
||||||
mb := &MumbleBus{
|
|
||||||
metrics: m,
|
|
||||||
}
|
|
||||||
conn, err := dbus.ConnectSessionBus()
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
mb.obj = conn.Object("net.sourceforge.mumble.mumble", "/")
|
|
||||||
mb.conn = conn
|
|
||||||
return mb
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *MumbleBus) Close() error {
|
|
||||||
return m.conn.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *MumbleBus) StartTalking() error {
|
|
||||||
m.obj.Call("net.sourceforge.mumble.Mumble.startTalking", 0)
|
|
||||||
m.lastTalked = time.Now()
|
|
||||||
m.metrics.PTTTogglesTotal.Add(1)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *MumbleBus) StopTalking() error {
|
|
||||||
m.obj.Call("net.sourceforge.mumble.Mumble.stopTalking", 0)
|
|
||||||
duration := time.Since(m.lastTalked)
|
|
||||||
m.lastTalked = time.Time{}
|
|
||||||
m.metrics.TalkSecondsTotal.Add(duration.Seconds())
|
|
||||||
m.metrics.PTTTogglesTotal.Add(1)
|
|
||||||
return nil
|
|
||||||
}
|
|
@ -2,11 +2,11 @@
|
|||||||
"nodes": {
|
"nodes": {
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1710631334,
|
"lastModified": 1709703039,
|
||||||
"narHash": "sha256-rL5LSYd85kplL5othxK5lmAtjyMOBg390sGBTb3LRMM=",
|
"narHash": "sha256-6hqgQ8OK6gsMu1VtcGKBxKQInRLHtzulDo9Z5jxHEFY=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "c75037bbf9093a2acb617804ee46320d6d1fea5a",
|
"rev": "9df3e30ce24fd28c7b3e2de0d986769db5d6225d",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
default = pkgs.buildGoModule {
|
default = pkgs.buildGoModule {
|
||||||
name = "ghettoptt";
|
name = "ghettoptt";
|
||||||
src = ./.;
|
src = ./.;
|
||||||
vendorHash = "sha256-WhlifAFIqoBNhBWGmYgHc5DWmdhHnK/2kYbEF/DOclw=";
|
vendorHash = "sha256-S/t8EkMRjceGhNcNqGhmnMviQrhqt7n9FiCmpxbKUoI=";
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
devShells = forAllSystems ({ pkgs }: {
|
devShells = forAllSystems ({ pkgs }: {
|
||||||
|
15
go.mod
15
go.mod
@ -3,17 +3,6 @@ module git.t-juice.club/torjus/ghettoptt
|
|||||||
go 1.21.6
|
go 1.21.6
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/godbus/dbus/v5 v5.1.0
|
github.com/godbus/dbus/v5 v5.1.0 // indirect
|
||||||
github.com/holoplot/go-evdev v0.0.0-20240306072622-217e18f17db1
|
github.com/holoplot/go-evdev v0.0.0-20240306072622-217e18f17db1 // indirect
|
||||||
github.com/prometheus/client_golang v1.19.0
|
|
||||||
)
|
|
||||||
|
|
||||||
require (
|
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
|
||||||
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
|
||||||
github.com/prometheus/client_model v0.5.0 // indirect
|
|
||||||
github.com/prometheus/common v0.48.0 // indirect
|
|
||||||
github.com/prometheus/procfs v0.12.0 // indirect
|
|
||||||
golang.org/x/sys v0.16.0 // indirect
|
|
||||||
google.golang.org/protobuf v1.32.0 // indirect
|
|
||||||
)
|
)
|
||||||
|
20
go.sum
20
go.sum
@ -1,24 +1,4 @@
|
|||||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
|
||||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
|
||||||
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
|
|
||||||
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
||||||
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
|
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
|
||||||
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
|
||||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
|
||||||
github.com/holoplot/go-evdev v0.0.0-20240306072622-217e18f17db1 h1:92OsBIf5KB1Tatx+uUGOhah73jyNUrt7DmfDRXXJ5Xo=
|
github.com/holoplot/go-evdev v0.0.0-20240306072622-217e18f17db1 h1:92OsBIf5KB1Tatx+uUGOhah73jyNUrt7DmfDRXXJ5Xo=
|
||||||
github.com/holoplot/go-evdev v0.0.0-20240306072622-217e18f17db1/go.mod h1:iHAf8OIncO2gcQ8XOjS7CMJ2aPbX2Bs0wl5pZyanEqk=
|
github.com/holoplot/go-evdev v0.0.0-20240306072622-217e18f17db1/go.mod h1:iHAf8OIncO2gcQ8XOjS7CMJ2aPbX2Bs0wl5pZyanEqk=
|
||||||
github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=
|
|
||||||
github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=
|
|
||||||
github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
|
|
||||||
github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
|
|
||||||
github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=
|
|
||||||
github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=
|
|
||||||
github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
|
|
||||||
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
|
|
||||||
golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
|
|
||||||
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
|
||||||
google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
|
|
||||||
google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
|
|
||||||
|
53
main.go
53
main.go
@ -4,17 +4,15 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"net/http"
|
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
|
"time"
|
||||||
|
|
||||||
"git.t-juice.club/torjus/ghettoptt/bus"
|
"github.com/godbus/dbus/v5"
|
||||||
"git.t-juice.club/torjus/ghettoptt/metrics"
|
|
||||||
"github.com/holoplot/go-evdev"
|
"github.com/holoplot/go-evdev"
|
||||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const Version = "v0.1.2"
|
const Version = "v0.1.1"
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// Setup logger
|
// Setup logger
|
||||||
@ -26,11 +24,14 @@ func main() {
|
|||||||
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
|
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
|
||||||
defer stop()
|
defer stop()
|
||||||
|
|
||||||
// Setup metrics
|
// Connect to dbus
|
||||||
m := metrics.NewMumbleMetricsCollector()
|
conn, err := dbus.ConnectSessionBus()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer conn.Close()
|
||||||
|
|
||||||
mbus := bus.NewMumbleBus(m)
|
obj := conn.Object("net.sourceforge.mumble.mumble", "/")
|
||||||
defer mbus.Close()
|
|
||||||
|
|
||||||
// Start reading input events
|
// Start reading input events
|
||||||
input, err := evdev.OpenWithFlags("/dev/input/event1", os.O_RDONLY)
|
input, err := evdev.OpenWithFlags("/dev/input/event1", os.O_RDONLY)
|
||||||
@ -42,26 +43,6 @@ func main() {
|
|||||||
|
|
||||||
var done bool
|
var done bool
|
||||||
|
|
||||||
// Start metrics server
|
|
||||||
srvCtx, srvCancel := context.WithCancel(context.Background())
|
|
||||||
defer srvCancel()
|
|
||||||
go func() {
|
|
||||||
mux := http.NewServeMux()
|
|
||||||
mux.Handle("/metrics", promhttp.Handler())
|
|
||||||
srv := http.Server{
|
|
||||||
Handler: mux,
|
|
||||||
Addr: ":8989",
|
|
||||||
}
|
|
||||||
go func() {
|
|
||||||
<-ctx.Done()
|
|
||||||
srv.Shutdown(context.Background())
|
|
||||||
srvCancel()
|
|
||||||
}()
|
|
||||||
|
|
||||||
slog.Info("Starting metrics server", "addr", srv.Addr)
|
|
||||||
srv.ListenAndServe()
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Listen for context cancellation
|
// Listen for context cancellation
|
||||||
go func() {
|
go func() {
|
||||||
<-ctx.Done()
|
<-ctx.Done()
|
||||||
@ -69,6 +50,7 @@ func main() {
|
|||||||
input.Close()
|
input.Close()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
var lastOn time.Time
|
||||||
// Start listening for PTT key
|
// Start listening for PTT key
|
||||||
slog.Info("Starting event listener", "version", Version)
|
slog.Info("Starting event listener", "version", Version)
|
||||||
for !done {
|
for !done {
|
||||||
@ -77,19 +59,20 @@ func main() {
|
|||||||
if errors.Is(err, os.ErrClosed) {
|
if errors.Is(err, os.ErrClosed) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
slog.Error("Error reading from input device", "error", err)
|
slog.Error("Error reading fron input device", "error", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
if ev.Code == evdev.KEY_F24 && ev.Value == 1 {
|
if ev.Code == evdev.KEY_F24 && ev.Value == 1 {
|
||||||
slog.Info("PTT ON")
|
slog.Info("PTT ON")
|
||||||
mbus.StartTalking()
|
lastOn = time.Now()
|
||||||
|
obj.Call("net.sourceforge.mumble.Mumble.startTalking", 0)
|
||||||
}
|
}
|
||||||
if ev.Code == evdev.KEY_F24 && ev.Value == 0 {
|
if ev.Code == evdev.KEY_F24 && ev.Value == 0 {
|
||||||
slog.Info("PTT OFF")
|
speakDuration := time.Since(lastOn).String()
|
||||||
mbus.StopTalking()
|
slog.Info("PTT OFF", "duration", speakDuration)
|
||||||
|
obj.Call("net.sourceforge.mumble.Mumble.stopTalking", 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mbus.StopTalking()
|
obj.Call("net.sourceforge.mumble.Mumble.stopTalking", 0)
|
||||||
<-srvCtx.Done()
|
|
||||||
slog.Info("Exiting")
|
slog.Info("Exiting")
|
||||||
}
|
}
|
||||||
|
@ -1,27 +0,0 @@
|
|||||||
package metrics
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
|
||||||
"github.com/prometheus/client_golang/prometheus/promauto"
|
|
||||||
)
|
|
||||||
|
|
||||||
type MumbleMetricsCollector struct {
|
|
||||||
TalkSecondsTotal prometheus.Counter
|
|
||||||
PTTTogglesTotal prometheus.Counter
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewMumbleMetricsCollector() *MumbleMetricsCollector {
|
|
||||||
talkSecondsTotal := promauto.NewCounter(prometheus.CounterOpts{
|
|
||||||
Name: "mumble_talk_seconds_total",
|
|
||||||
Help: "The total number of seconds a user has been talking",
|
|
||||||
})
|
|
||||||
pttTogglesTotal := promauto.NewCounter(prometheus.CounterOpts{
|
|
||||||
Name: "mumble_ptt_toggles_total",
|
|
||||||
Help: "The total number of seconds a user has been talking",
|
|
||||||
})
|
|
||||||
|
|
||||||
return &MumbleMetricsCollector{
|
|
||||||
TalkSecondsTotal: talkSecondsTotal,
|
|
||||||
PTTTogglesTotal: pttTogglesTotal,
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user