diff --git a/net-speed-widget/README.md b/net-speed-widget/README.md new file mode 100644 index 0000000..1cac674 --- /dev/null +++ b/net-speed-widget/README.md @@ -0,0 +1,3 @@ +# Net Speed Widget + +The widget and readme is in progress \ No newline at end of file diff --git a/net-speed-widget/icons/down.svg b/net-speed-widget/icons/down.svg new file mode 100644 index 0000000..9a98f39 --- /dev/null +++ b/net-speed-widget/icons/down.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/net-speed-widget/icons/up.svg b/net-speed-widget/icons/up.svg new file mode 100644 index 0000000..e3c12a7 --- /dev/null +++ b/net-speed-widget/icons/up.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/net-speed-widget/net-speed.lua b/net-speed-widget/net-speed.lua new file mode 100644 index 0000000..d0eaaff --- /dev/null +++ b/net-speed-widget/net-speed.lua @@ -0,0 +1,128 @@ +------------------------------------------------- +-- Net Speed Widget for Awesome Window Manager +-- Shows current upload/download speed +-- More details could be found here: +-- https://github.com/streetturtle/awesome-wm-widgets/tree/master/net-speed-widget + +-- @author Pavel Makhov +-- @copyright 2020 Pavel Makhov +------------------------------------------------- + +local naughty = require("naughty") +local watch = require("awful.widget.watch") +local wibox = require("wibox") + +local HOME_DIR = os.getenv("HOME") +local WIDGET_DIR = HOME_DIR .. '/.config/awesome/awesome-wm-widgets/net-speed-widget/' +local ICONS_DIR = WIDGET_DIR .. 'icons/' + +local function show_warning(message) + naughty.notify { + preset = naughty.config.presets.critical, + title = 'Net Speed Widget', + text = message + } +end + +local net_speed_widget = wibox.widget { + { + id = 'rx_speed', + forced_width = 55, + align = 'right', + widget = wibox.widget.textbox + }, + { + image = ICONS_DIR .. 'down.svg', + widget = wibox.widget.imagebox + }, + { + image = ICONS_DIR .. 'up.svg', + widget = wibox.widget.imagebox + }, + { + id = 'tx_speed', + forced_width = 55, + align = 'left', + widget = wibox.widget.textbox + }, + layout = wibox.layout.fixed.horizontal, + set_rx_text = function(self, new_rx_speed) + self:get_children_by_id('rx_speed')[1]:set_text(tostring(new_rx_speed)) + end, + set_tx_text = function(self, new_tx_speed) + self:get_children_by_id('tx_speed')[1]:set_text(tostring(new_tx_speed)) + end +} + +local prev_rx = 0 +local prev_tx = 0 + +local function convert_to_h(bytes) + local speed + local dim + local bits = bytes * 8 + if bits < 1000 then + speed = bits + dim = 'b/s' + elseif bits < 1000000 then + speed = bits/1000 + dim = 'kb/s' + elseif bits < 1000000000 then + speed = bits/1000000 + dim = 'mb/s' + elseif bits < 1000000000000 then + speed = bits/1000000000 + dim = 'gb/s' + else + speed = tonumber(bits) + dim = 'b/s' + end + return math.floor(speed + 0.5) .. dim +end + +local function split(string_to_split, separator) + if separator == nil then separator = "%s" end + local t = {} + + for str in string.gmatch(string_to_split, "([^".. separator .."]+)") do + table.insert(t, str) + end + + return t +end + +local function worker(args) + + local args = args or {} + + if args.interface == nil then + show_warning("Interface name is not specified") + return + end + + local interface = args.interface + + local update_widget = function(widget, stdout, stderr) + + local cur_vals = split(stdout, '\r\n') + + local cur_rx = cur_vals[1] + local cur_tx = cur_vals[2] + + local speed_rx = cur_rx - prev_rx + local speed_tx = cur_tx - prev_tx + + net_speed_widget:set_rx_text(convert_to_h(speed_rx)) + net_speed_widget:set_tx_text(convert_to_h(speed_tx)) + + prev_rx = cur_rx + prev_tx = cur_tx + end + + watch(string.format([[bash -c "cat /sys/class/net/%s/statistics/*_bytes"]], interface), 1, update_widget, net_speed_widget) + + return net_speed_widget + +end + +return setmetatable(net_speed_widget, { __call = function(_, ...) return worker(...) end })