#!/usr/bin/env bash

#.o+°"°+o._.o+° 
#             / 
#   LOL STAT  > 
#             \ 
#.o+°"°+o._.o+°`

# https://github.com/chiptune/lolstat

ver="0.3.7"

tmp="/dev/shm/lolstat-" # tmp file path
timer=2          # use i3status.conf interval

s0="\u0020"      # space
s1="${s0}|${s0}" # separator
l0="\u25cb"      # led off
l1="\u25c9"      # led on
warn="\u26a0"    # warning
dead="\u2620"    # he's dead jim
ok="\u263a"      # ok status
nok="\u2639"     # not ok status

# unicode glyphs
home="\u2302"
cloud="\u2601"
data="\u26c0"

kbd="\u2328"
wave="\u223f"
star="\u2605"

n=$[$(cat "${tmp}count" 2>/dev/null)]
if [ ${n} -eq 0 ]; then n=0; fi
if [ ${n} -eq 150 ]; then n=0; fi
echo $[${n}+1] > "${tmp}count"

ts=$(date "+%s%N")
ts_p=$[$(cat "${tmp}time" 2>/dev/null | cut -d' ' -f1)]
if [ $ts_p -eq 0 ]; then ts_p=$ts; ts=$[$ts+1000000]; fi
echo -ne "${ts} ${ts_p}" > "${tmp}time"
t=$(mawk '{printf "%.*f",3,$1/1000000000}' <<< $[$ts-$ts_p])

if [ -f "${tmp}ver" ]; then
	if [ "${ver}" != $(cat "${tmp}ver") ]; then rm "${tmp}"*; fi
else
	echo "${ver}" > ${tmp}'ver'
fi

if [ ${n} -eq 0 ]; then
	curl -o "${tmp}ip" -s "http://ipecho.net/plain"
	curl -o "${tmp}geo" -s "http://freegeoip.net/json/$(cat "${tmp}ip")"
fi

function bar()
	{
	local bar="▯▯▯▯▯▯"
	if   [ ${1} -gt 90 ]; then bar="▮▮▮▮▮▮";
	elif [ ${1} -gt 74 ]; then bar="▮▮▮▮▮▯";
	elif [ ${1} -gt 58 ]; then bar="▮▮▮▮▯▯";
	elif [ ${1} -gt 42 ]; then bar="▮▮▮▯▯▯";
	elif [ ${1} -gt 26 ]; then bar="▮▮▯▯▯▯";
	elif [ ${1} -gt 10 ]; then bar="▮▯▯▯▯▯";
	fi
	echo -ne "${bar}${1}%"
	}

function upd() # countdown to next update
	{
	echo -ne "${s0}$(printf '%03d' $[((150-${n})*${timer})])"
	}

function disk()
	{
	local data=$(df 2>/dev/null | grep -m 1 "${1}")
	if [ -n "${data}" ]; then
		echo -ne "${s1}${2}$(mawk '{FS=" "}{printf "%.*f",1,100/($3+$4)*$3}' <<< "${data}")%"
	fi
	}

function io()
	{
	if [ -r "/sys/block/${1}/stat" ]; then
		if [ ${n} -eq 0 ]; then cat "/sys/block/${1}/stat" | mawk '{print $3,$7}' > "${tmp}io"; fi
		local data=$(cat "/sys/block/${1}/stat" | mawk '{print $3,$7}')" "$(cat "${tmp}io" 2>/dev/null | mawk '{print $1,$2}');
		echo "${data}" > "${tmp}io"
		local bs=$(cat "/sys/block/${1}/queue/physical_block_size") #sudo dd if=/dev/sda1 of=/dev/null count=1
		local io=$(mawk 'BEGIN{FS=" ";r='${bs}'/1024/'${t}'}{printf "%s%03d'${s0}'%s%03d",($1-$3<r)?"'${l0}'":"'${l1}'",($1-$3)*r,($2-$4<r)?"'${l0}'":"'${l1}'",($2-$4)*r}' <<< "${data}"})
	else
		local io="?"
	fi
	echo -ne "${s1}${1}${s0}${io}"
	}

function cpu()
	{
	# user nice system idle iowait irq softirq
	local data=$(cat /proc/stat | mawk '/cpu\ /{printf "%.*f %.*f",0,$2+$3+$4,0,$2+$3+$4+$5}')' '$(cat "${tmp}cpu" 2>/dev/null | mawk '{print $1,$2}')
	echo -ne "${data}" > "${tmp}cpu"
	local cpu=$(mawk 'BEGIN{FS=" "}{printf "%02d",100/($2-$4)*($1-$3)}' <<< "${data}")
	local freq=$(lscpu | mawk '/CPU\ MHz/{printf "%04dMHz",$NF}')
	echo -ne "${s1}CPU${s0}${freq}${s0}$(bar "${cpu}")"
	}

function ram()
	{
	local ram=$(mawk 'BEGIN{FS=" "}{printf "%02d",100/$1*($1-$2)}' <<< $(mawk '/Mem/{print $2" "}' /proc/meminfo))
	echo -ne "${s1}RAM${s0}$(bar "${ram}")"
	}

function netw()
	{
	if [ ${n} -eq 0 ]; then
		rm "${tmp}netw" 2>/dev/null
		/sbin/ifconfig -s | tail -n +2 | cut -d' ' -f1 | while read i;
		do
			local data=$(/sbin/ifconfig "${i}" | tail -n +2)
			local ip=$(echo "${data}" | grep "inet\ " | mawk '{print $2}')
			if [ "${ip}" = "127.0.0.1" ]; then continue; fi
			echo -e "${i} ${ip}" >> "${tmp}netw"
			local rx=$(cat "/sys/class/net/${i}/statistics/rx_bytes")
			local tx=$(cat "/sys/class/net/${i}/statistics/tx_bytes")
			echo -ne "${rx} ${tx}" > "${tmp}netw-${i}"
		done
	fi
	cat "${tmp}netw" 2>/dev/null | while read i;
	do
		local nw=$(echo "$i" | cut -d' ' -f1)
		local ip=$(echo "$i" | cut -d' ' -f2)
		local rx=$(cat "/sys/class/net/${nw}/statistics/rx_bytes")
		local tx=$(cat "/sys/class/net/${nw}/statistics/tx_bytes")
		local rt_dat="${rx} ${tx} $(cat "${tmp}netw-${nw}" | mawk '{print $1,$2}')"
		echo -ne "${rt_dat}" > "${tmp}netw-${nw}"
		local rt=$(mawk 'BEGIN{FS=" ";r=1024*'${t}'}{printf "%s%05.*f'${s0}'%s%05.*f",($1==$3)?"'${l0}'":"'${l1}'",1,($1-$3)/r,($2==$4)?"'${l0}'":"'${l1}'",1,($2-$4)/r}' <<< "${rt_dat}")
		local data=$(/sbin/iwconfig "${nw}" 2>/dev/null)
		if [ -z "${data}" ]; then
			echo -ne "${s1}${nw}${s0}${ip}${s0}${rt}"
		else
			local ssid=$(sed -ne 's/.*ESSID:"*\([^ ]*\).*"\ \ /\1/p' <<< "${data}")
			local q=$(sed -ne 's/.*Link\ Quality="*\([^ ]*\).*/\1/p' <<< "${data}" | mawk 'BEGIN{FS="/"}{printf "%02d",100/$2*$1}')
			#local br=$(printf "%02dMb/s" $(sed -ne 's/.*Bit\ Rate="*\([^ ]*\).*/\1/p' <<< "${data}")) # Mb/s
			echo -ne "${s1}${nw}${s0}${ip}${wave}${ssid}${s0}"$(bar "${q}")"${s0}${rt}"
		fi
	done
	}

function url()
	{
	if [ ${n} -eq 0 ]; then
		ping -c1 $1 | mawk '/time\=/{print $(NF-1)}' | sed -e 's/time=//' > "${tmp}ping-$1"
	fi
	local time=$(cat "${tmp}ping-$1" 2>/dev/null)
	local name=$1; if [ $2 ]; then name=$2; fi
	if [ "${time}" == "" ]; then
		time="${dead}"
	else
		time=$(mawk '{printf "%s%04.*f",($1<100)?"'${ok}'":"'${nok}'",2,$1/1000}' <<< "${time}")
	fi
	echo -ne "${s1}${name}${s0}${time}"
	}

function weather()
	{
	if [ ${n} -eq 0 ]; then
		local coord=$(cat "${tmp}geo")
		local lon=$(echo -ne "${coord}" | sed -e 's/.*"longitude":\([^,]*\).*/\1/')
		local lat=$(echo -ne "${coord}" | sed -e 's/.*"latitude":\([^,]*\).*/\1/')
		local data=$(curl -s "http://api.openweathermap.org/data/2.5/weather?lon="${lon}"&lat="${lat}"&units=metric&APPID=c8236a643beb666d2042d55869b69258")
		local temp=$(echo -ne "${data}" | sed -ne 's/.*"temp":"*\([^ ]*\).*",/\1/p' | mawk '{printf "%02.*f",1,$1}')
		local code=$(echo "${data}" | sed -e 's/.*"icon":"\([^"]*\).*/\1/')
		case "${code}" in
			"01d"|"01n") local icon="\u2600";; # clear sky
			"02d"|"02n") local icon="\u2601";; # few clouds
			"03d"|"03n") local icon="\u2601";; # scattered clouds
			"04d"|"04n") local icon="\u2601";; # broken clouds
			"09d"|"09n") local icon="\u2602";; # shower rain
			"10d"|"10n") local icon="\u2614";; # rain
			"11d"|"11n") local icon="\u2608";; # thunderstorm
			"13d"|"13n") local icon="\u2603";; # snow
		esac
		echo "${icon}${temp}°" > "${tmp}weather"
	fi
	echo -ne "${s1}$(cat "${tmp}weather" 2>/dev/null)"
	}

function clock()
	{
	echo -ne "${s1}$(date "+%d/%m${s0}\u231a${s0}%H:%M")"
	}

function window()
	{
	local id=$(xprop -root 2>/dev/null | mawk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}')
	xprop -id ${id} | mawk '/WM_NAME\(STRING\)/{$1=$2="";print}' | cut -d'"' -f2
	}

function power()
	{
	if [ $(which "acpi") ]; then
		if [ ${n} -eq 0 ]; then
			acpi -V | head -1 | cut -d',' -f2 | sed -e 's/%//' > "${tmp}power";
		fi
		echo -ne "${s0}\u26a1$[$(cat "${tmp}power" 2>/dev/null)]%"
	fi
	}

function mixer()
	{
	# TODO: replace by "--" if mute
	if [ $(which "amixer") ]; then
		echo -ne "${s0}\u266c$(mawk 'BEGIN{printf "%02d","'$(amixer get ${1} | tail -1 | cut -d'[' -f2 | cut -d'%' -f1)'"}')%";
	fi
	}

# my current setup
echo -ne "${USER}$(upd)$(disk "/dev/sda" "/")$(disk "/home" "${home}")$(disk "/cloud" "${cloud}")$(disk "/data" "${data}")$(io "sda")$(cpu)$(ram)$(netw)$(url "poulet.zoy.org" "lol")$(weather)$(clock)$(power)$(mixer "Master")"

exit
