From a5dbf39596c33c29bddb989ff4fcc17550dfa89c Mon Sep 17 00:00:00 2001 From: Mattia Gheda Date: Sun, 20 Apr 2014 20:06:31 -0400 Subject: [PATCH] basic wlan widget (requires nm-tool) --- i3status/wlan.go | 72 +++++++++++++++++++++++++++++++++++++++++++++++ main.go | 5 ++-- test/wlan_test.go | 37 ++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 i3status/wlan.go create mode 100644 test/wlan_test.go diff --git a/i3status/wlan.go b/i3status/wlan.go new file mode 100644 index 0000000..f12cebf --- /dev/null +++ b/i3status/wlan.go @@ -0,0 +1,72 @@ +package i3status + +import ( + "fmt" + "os/exec" + "regexp" + "strconv" + "strings" + "time" +) + +type WlanInfo struct { + NetworkStatus string + NetworkName string + color string +} + +type WlanWidget struct { + BaseWidget +} + +func NewWlanWidget() *WlanWidget { + instanceCount++ + w := WlanWidget{ + BaseWidget: *NewBaseWidget(), + } + return &w +} + +func (w *WlanWidget) basicLoop() { + msg := NewMessage() + msg.Name = "Wlan" + msg.Color = "#ffffff" + msg.Instance = strconv.Itoa(w.Instance) + for { + msg.FullText, msg.Color = w.getStatus() + w.Output <- *msg + time.Sleep(5000 * time.Millisecond) + } +} + +func (w *WlanWidget) getStatus() (string, string) { + info := WlanInfo{} + cmd := exec.Command("nm-tool") + str, _ := cmd.Output() + text := fmt.Sprintf("%s", str) + lines := strings.Split(text, "\n") + re := regexp.MustCompile("[a-zA-Z]+\\s*([a-z]+)") + info.NetworkStatus = re.FindAllString(lines[3], -1)[1] + + if info.NetworkStatus == "connecting" { + info.color = YELLOW + } + + if info.NetworkStatus == "connected" { + info.color = GREEN + } + + if info.NetworkStatus == "disconnected" { + info.color = RED + } else { + re = regexp.MustCompile("\\[.*\\]") + info.NetworkName = re.FindAllString(lines[5], -1)[0] + } + + return fmt.Sprintf("WLAN: %s %s", info.NetworkStatus, info.NetworkName), info.color +} + +func (w *WlanWidget) Start() { + go w.basicLoop() + go w.readLoop() +} diff --git a/main.go b/main.go index 7dbf078..e0b0dc5 100644 --- a/main.go +++ b/main.go @@ -27,11 +27,12 @@ func main() { fmt.Println("[") b := i3status.NewBar() - //b.Add(i3status.NewDateWidget()) + b.Add(i3status.NewDateWidget()) b.Add(i3status.NewTimerWidget()) b.Add(i3status.NewPowerWidget()) b.Add(i3status.NewOnOffWidget()) - b.Add(i3status.NewI3statusWidget()) + b.Add(i3status.NewWlanWidget()) + //b.Add(i3status.NewI3statusWidget()) //b.Add(i3status.NewEchoWidget()) for { diff --git a/test/wlan_test.go b/test/wlan_test.go new file mode 100644 index 0000000..9e5fb42 --- /dev/null +++ b/test/wlan_test.go @@ -0,0 +1,37 @@ +package i3status_test + +import ( + "github.com/ghedamat/go-i3status/i3status" + . "github.com/smartystreets/goconvey/convey" + "testing" +) + +func TestWlanWidgetConstructor(t *testing.T) { + Convey("Given two channels", t, func() { + c := make(chan i3status.Message) + i := make(chan i3status.Entry) + Convey("When wlan is created", func() { + w := i3status.NewWlanWidget() + w.SetChannels(c, i) + Convey("output channel is available", func() { + So(w.Output, ShouldEqual, c) + }) + }) + }) +} + +func TestWlanWidgetHasMessage(t *testing.T) { + Convey("Given a widget", t, func() { + c := make(chan i3status.Message) + i := make(chan i3status.Entry) + w := i3status.NewWlanWidget() + w.SetChannels(c, i) + Convey("When wlan is started", func() { + w.Start() + Convey("output message is available", func() { + msg := <-c + So(msg.FullText, ShouldContainSubstring, "WLAN") + }) + }) + }) +}