nix-configs/modules/de/home/eww/configDir/scripts/bat.nu
2025-03-27 20:06:54 +01:00

78 lines
1.6 KiB
Text
Executable file

#!/usr/bin/env nu
const ICONS = [
[ normal charging];
[ 󰂎 󰢟 ]
[ 󰁺 󰢜 ]
[ 󰁻 󰂆 ]
[ 󰁼 󰂇 ]
[ 󰁽 󰂈 ]
[ 󰁾 󰢝 ]
[ 󰁿 󰂉 ]
[ 󰂀 󰢞 ]
[ 󰂁 󰂊 ]
[ 󰂂 󰂋 ]
[ 󰁹 󰂅 ]
];
const DELAY = 2sec;
def "main auto" [] {
loop {
let paths = ls "/sys/class/power_supply"
| each {|it| $it.name | path basename}
| filter {|it| $it starts-with "BAT"};
if ($paths | is-not-empty) {
let result = $paths
| each {|it| get_and_format $it}
| str join " | "
| prepend "| "
| str join;
print $result
} else {
print ""
}
sleep $DELAY;
}
}
def main [ path: string ] {
loop {
print (get_and_format $path)
sleep $DELAY;
}
}
def get_and_format [ path: string ] {
let fract = get_bat_charge_fraction $path;
let is_charging = get_bat_charging_status $path;
let percent = ($fract * 100) | math round;
return $"<span foreground=\"#d65d0e\">(get_bat_icon $fract $is_charging)</span> ($percent)<span foreground=\"#7c6f64\">%</span>";
}
def get_bat_charge_fraction [
path: string
] {
let energy_full = open $"/sys/class/power_supply/($path)/energy_full" | into float;
let energy_now = open $"/sys/class/power_supply/($path)/energy_now" | into float;
$energy_now / $energy_full
}
def get_bat_charging_status [
path: string
] {
let status = open $"/sys/class/power_supply/($path)/status";
$status like Charging
}
def get_bat_icon [
frac: float
is_charging = false
] {
$ICONS | get (($frac * 10) | math round) | get (if ($is_charging) { "charging" } else { "normal" })
}