1
0
mirror of https://github.com/taigrr/wtf synced 2025-01-18 04:03:14 -08:00
wtf/power/battery.go
Chris Cummer 9f1bad6571 Closes #52. Add Power module
This module displaysw which source is providing power (AC or battery)
and for the battery displays the current charge capacity, how long it
will last, and the battery state.
2018-05-24 22:01:55 -07:00

117 lines
2.1 KiB
Go

package power
import (
"fmt"
"os/exec"
"regexp"
"strconv"
"strings"
"github.com/senorprogrammer/wtf/wtf"
)
const TimeRegExp = "^(?:\\d|[01]\\d|2[0-3]):[0-5]\\d"
type Battery struct {
args []string
cmd string
result string
Charge string
Remaining string
}
func NewBattery() *Battery {
battery := Battery{
args: []string{"-g", "batt"},
cmd: "pmset",
}
return &battery
}
/* -------------------- Exported Functions -------------------- */
func (battery *Battery) Refresh() {
data := battery.execute()
battery.result = battery.parse(data)
}
func (battery *Battery) String() string {
return battery.result
}
/* -------------------- Unexported Functions -------------------- */
func (battery *Battery) execute() string {
cmd := exec.Command(battery.cmd, battery.args...)
return wtf.ExecuteCommand(cmd)
}
func (battery *Battery) parse(data string) string {
lines := strings.Split(data, "\n")
if len(lines) < 2 {
return "unknown (1)"
}
stats := strings.Split(lines[1], "\t")
if len(stats) < 2 {
return "unknown (2)"
}
details := strings.Split(stats[1], "; ")
if len(details) < 3 {
return "unknown (3)"
}
str := ""
str = str + fmt.Sprintf(" %10s: %s\n", "Charge", battery.formatCharge(details[0]))
str = str + fmt.Sprintf(" %10s: %s\n", "Remaining", battery.formatRemaining(details[2]))
str = str + fmt.Sprintf(" %10s: %s\n", "State", battery.formatState(details[1]))
return str
}
func (battery *Battery) formatCharge(data string) string {
percent, _ := strconv.ParseFloat(strings.Replace(data, "%", "", -1), 32)
color := ""
switch {
case percent >= 70:
color = "[green]"
case percent >= 35:
color = "[yellow]"
default:
color = "[red]"
}
return color + data + "[white]"
}
func (battery *Battery) formatRemaining(data string) string {
r, _ := regexp.Compile(TimeRegExp)
result := r.FindString(data)
if result == "" {
result = "∞"
}
return result
}
func (battery *Battery) formatState(data string) string {
color := ""
switch data {
case "charging":
color = "[green]"
case "discharging":
color = "[yellow]"
default:
color = "[white]"
}
return color + data + "[white]"
}