import std/os import std/osproc import std/re import strutils import i3bar_base import std/math const host: string = "web.wilde.cloud" const cmd: string = "ping -4 -c 1 " & host const time_secs: int = 4 let ping_re = re(r"time=[0-9.]+") proc get_ping(): float = var ping: float = -1 let cmdOut = execCmdEx(cmd) let lines = splitLines(cmdOut.output) let ping_line = lines[1] let bounds = findBounds(ping_line, ping_re) if bounds.first > 0: let png = ping_line[bounds.first+5..bounds.last] ping = parseFloat(png) return ping proc getObject(ping: float): i3barData = let niceping = $round(ping,1) var text = "🏓 " & niceping & " ms" var col = foreground if ping < 0: text = "❌ No Pong" col = yellow else: case ping: of 0..100: col = foreground of 101..400: col = yellow of 401..1000: col = alert else: col = red let data = i3barData( full_text: text, color: col, border: blue, background: black ) return data proc main() = var last_ping: float = 0 while true: let ping = get_ping() if ping != last_ping: let data = getObject(ping) outputJSON(data) last_ping = ping sleep(time_secs * 1000) main()