forked from oniichaNj/go-dwmstatus
-
Notifications
You must be signed in to change notification settings - Fork 0
/
dwmstatus.go
176 lines (155 loc) · 3.78 KB
/
dwmstatus.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
package main
// #cgo LDFLAGS: -lX11 -lasound
// #include <X11/Xlib.h>
// #include "getvol.h"
import "C"
import (
"fmt"
"io/ioutil"
"log"
"net"
"strings"
"time"
)
var dpy = C.XOpenDisplay(nil)
func getVolumePerc() int {
return int(C.get_volume_perc())
}
func getBatteryPercentage(path string) (perc int, err error) {
energy_now, err := ioutil.ReadFile(fmt.Sprintf("%s/charge_now", path))
if err != nil {
perc = -1
return
}
energy_full, err := ioutil.ReadFile(fmt.Sprintf("%s/charge_full", path))
if err != nil {
perc = -1
return
}
var enow, efull int
fmt.Sscanf(string(energy_now), "%d", &enow)
fmt.Sscanf(string(energy_full), "%d", &efull)
perc = enow * 100 / efull
return
}
func getBatteryChargingStatus(path string) (isCharging bool, err error) {
status, err := ioutil.ReadFile(fmt.Sprintf("%s/status", path))
if err != nil {
return
}
isCharging = (string(status) == "Charging\n")
return
}
func getBatterySymbol(bat_percent int, charging bool) (symbol string) {
bat_full := ""
bat_3quater := ""
bat_half := ""
bat_quater := ""
bat_empty := ""
charging_symbol := ""
if bat_percent > 75 {
symbol = bat_full
} else if bat_percent > 50 {
symbol = bat_3quater
} else if bat_percent > 25 {
symbol = bat_half
} else if bat_percent > 10 {
symbol = bat_quater
} else {
symbol = bat_empty
}
if charging {
symbol = charging_symbol
}
return
}
func getLoadAverage(file string) (lavg string, err error) {
loadavg, err := ioutil.ReadFile(file)
if err != nil {
return "Couldn't read loadavg", err
}
lavg = strings.Join(strings.Fields(string(loadavg))[:3], " ")
return
}
func setStatus(s *C.char) {
C.XStoreName(dpy, C.XDefaultRootWindow(dpy), s)
C.XSync(dpy, 1)
}
func nowPlaying(addr string) (np string, err error) {
conn, err := net.Dial("tcp", addr)
if err != nil {
np = "Couldn't connect to mpd."
return
}
defer conn.Close()
reply := make([]byte, 512)
conn.Read(reply) // The mpd OK has to be read before we can actually do things.
message := "status\n"
conn.Write([]byte(message))
conn.Read(reply)
r := string(reply)
arr := strings.Split(string(r), "\n")
if arr[8] != "state: play" { //arr[8] is the state according to the mpd documentation
status := strings.SplitN(arr[8], ": ", 2)
np = fmt.Sprintf("mpd - [%s]", status[1]) //status[1] should now be stopped or paused
return
}
message = "currentsong\n"
conn.Write([]byte(message))
conn.Read(reply)
r = string(reply)
arr = strings.Split(string(r), "\n")
if len(arr) > 5 {
var artist, title string
for _, info := range arr {
field := strings.SplitN(info, ":", 2)
switch field[0] {
case "Artist":
artist = strings.TrimSpace(field[1])
case "Title":
title = strings.TrimSpace(field[1])
default:
//do nothing with the field
}
}
np = artist + " - " + title
return
} else { //This is a nonfatal error.
np = "Playlist is empty."
return
}
}
func formatStatus(format string, args ...interface{}) *C.char {
status := fmt.Sprintf(format, args...)
return C.CString(status)
}
func main() {
if dpy == nil {
log.Fatal("Can't open display")
}
for {
t := time.Now().Format("Mon 02 15:04")
b, err := getBatteryPercentage("/sys/class/power_supply/BAT0")
if err != nil {
log.Println(err)
}
bc, err := getBatteryChargingStatus("/sys/class/power_supply/BAT0")
if err != nil {
log.Println(err)
}
l, err := getLoadAverage("/proc/loadavg")
if err != nil {
log.Println(err)
}
m, err := nowPlaying("localhost:6600")
if err != nil {
log.Println(err)
}
bat_symbol := getBatterySymbol(b, bc)
vol := getVolumePerc()
s := formatStatus(" %s :: %d%% :: %s %s %s %d%%", m, vol, l, t, bat_symbol, b)
// fmt.Printf(" %s :: %d%% :: %s %s %s %d%%", m, vol, l, t, bat_symbol, b)
setStatus(s)
time.Sleep(time.Second)
}
}