#!/usr/bin/env ruby
# encoding: utf-8
require 'ostruct'
FA_LIGHTNING = "\uf0e7"
FA_PLUG = "\uf1e6"
FA_UNKNOWN = "\uf128"
def color(percent)
if percent < 10
'#FF0000'
elsif percent < 20
'#FF3300'
elsif percent < 30
'#FF6600'
elsif percent < 40
'#FF9900'
elsif percent < 50
'#FFCC00'
elsif percent < 60
'#FFFF00'
elsif percent < 70
'#FFFF33'
elsif percent < 80
'#FFFF66'
else
'#FFFFFF'
end
end
def batt_symbol(percent)
if percent < 10
"\uf244" #
elsif percent < 40
"\uf243" #
elsif percent < 60
"\uf242" #
elsif percent < 80
"\uf241" #
else
"\uf240" #
end
end
def batt_to_s(batteries, battery, short = false)
output = battery[:status] == :charging ? (FA_LIGHTNING + ' ') : ''
batt_color = batteries.all? { |b| b[:percent] < 10 } ? '#FFFFFF' : color(battery[:percent])
if short
output += "#{batt_symbol battery[:percent]}"
else
output += "#{battery[:id]}: #{battery[:percent]}%"
output += " #{battery[:hours].round 1}h" if [:discharging, :charging].include? battery[:status]
end
output
end
data = `acpi`
if not data
puts "\uf00d \uf240"
puts "\uf00d \uf240"
exit 0
end
batteries = data.split("\n").map do |line|
next unless line =~ /^Battery (\d+): ([^,]+), (\d+)%/
data = { id: $1.to_i, status: $2.downcase.to_sym, percent: $3.to_i }
case data[:status]
when :charging
data[:eta] = line.match(/(\d+:\d+:\d+) until charged/).to_a.last
when :discharging
data[:eta] = line.match(/(\d+:\d+:\d+) remaining/).to_a.last
end
if data[:eta]
segs = data[:eta].split ':'
data[:hours] = segs.first.to_f
data[:hours] += segs[1].to_f / 60.0
end
data
end
charging = `acpi -a` =~ /^Adapter \d+: on-line$/
output = charging ? FA_PLUG + ' ' : ''
short_output = output
output += batteries.map { |batt| batt_to_s batteries, batt }.join ' '
short_output += batteries.map { |batt| batt_to_s batteries, batt, true}.join ' '
puts output
puts short_output
exit 33 if batteries.all? { |batt| batt[:percent] < 10 }