import i3bar_base import std/os import std/osproc import std/threadpool import strutils const nics: seq[string] = @["wlan0", "enp3s0","wlp2s0","enp0s20f0u3"] # /sys/class/net/*/operstate up or down if connected proc get_ip(nic: string): string = let cmd = "ifconfig " & nic & " | grep inet | awk -F\" \" '{print $2}' | head -1 | awk '{print $1}'" let ip = execCmdEx(cmd) return strip(ip.output) proc get_online_state(nic: string): string = let oper = readFile("/sys/class/net/" & nic & "/operstate") let state = strip(oper) return "[" & state & "]" proc get_net(nic: string): (string, string) = let state = get_online_state(nic) let ip = get_ip(nic) if state == "[down]" or ip == "": return ("disconnected", state) return (ip, state) proc getObject(conn: string): i3barData = var data = newi3barData() data.full_text = conn data.border = purple return data proc get_net_info(nic: string) = var last_ip = "" var last_state = "" while true: let (ip, state) = get_net(nic) if ip != last_ip or state != last_state: let data = getObject(state & " " & ip) outputJSON(data) last_ip = ip last_state = state sleep(1000) proc await_click_info() = while true: let input = parseInput() if input.button == 1: discard execCmd("alacritty -e nmtui-connect") proc get_nic(): string = for nic in nics: if dirExists("/sys/class/net/" & nic): return nic return "no-nic" proc main() = let mynic = get_nic() if dirExists("/sys/class/net/" & mynic): spawn get_net_info(mynic) spawn await_click_info() sync() else: echo "No NIC" main()