1
0
mirror of https://github.com/taigrr/wtf synced 2025-01-18 04:03:14 -08:00
wtf/modules/power/battery.go
2019-08-05 10:50:12 -07:00

119 lines
2.1 KiB
Go

// +build !linux
package power
import (
"fmt"
"os/exec"
"regexp"
"strconv"
"strings"
"github.com/wtfutil/wtf/utils"
)
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 utils.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]"
}