mirror of https://github.com/einverne/dotfiles.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
3.9 KiB
111 lines
3.9 KiB
--- === SpeedMenu === |
||
--- |
||
--- Menubar netspeed meter |
||
--- |
||
--- Download: [https://github.com/Hammerspoon/Spoons/raw/master/Spoons/SpeedMenu.spoon.zip](https://github.com/Hammerspoon/Spoons/raw/master/Spoons/SpeedMenu.spoon.zip) |
||
|
||
local obj={} |
||
obj.__index = obj |
||
|
||
-- Metadata |
||
obj.name = "SpeedMenu" |
||
obj.version = "1.0" |
||
obj.author = "ashfinal <[email protected]>" |
||
obj.homepage = "https://github.com/Hammerspoon/Spoons" |
||
obj.license = "MIT - https://opensource.org/licenses/MIT" |
||
|
||
function obj:init() |
||
self.menubar = hs.menubar.new() |
||
obj:rescan() |
||
end |
||
|
||
local function data_diff() |
||
local in_seq = hs.execute(obj.instr) |
||
local out_seq = hs.execute(obj.outstr) |
||
local in_diff = in_seq - obj.inseq |
||
local out_diff = out_seq - obj.outseq |
||
if in_diff/1024 > 1024 then |
||
obj.kbin = string.format("%6.2f", in_diff/1024/1024) .. ' mb/s' |
||
else |
||
obj.kbin = string.format("%6.2f", in_diff/1024) .. ' kb/s' |
||
end |
||
if out_diff/1024 > 1024 then |
||
obj.kbout = string.format("%6.2f", out_diff/1024/1024) .. ' mb/s' |
||
else |
||
obj.kbout = string.format("%6.2f", out_diff/1024) .. ' kb/s' |
||
end |
||
local disp_str = '⥄ ' .. obj.kbout .. '\n⥂ ' .. obj.kbin |
||
if obj.darkmode then |
||
obj.disp_str = hs.styledtext.new(disp_str, {font={size=9.0, color={hex="#FFFFFF"}}}) |
||
else |
||
obj.disp_str = hs.styledtext.new(disp_str, {font={size=9.0, color={hex="#000000"}}}) |
||
end |
||
obj.menubar:setTitle(obj.disp_str) |
||
obj.inseq = in_seq |
||
obj.outseq = out_seq |
||
end |
||
|
||
--- SpeedMenu:rescan() |
||
--- Method |
||
--- Redetect the active interface, darkmode …And redraw everything. |
||
--- |
||
|
||
function obj:rescan() |
||
obj.interface = hs.network.primaryInterfaces() |
||
obj.darkmode = hs.osascript.applescript('tell application "System Events"\nreturn dark mode of appearance preferences\nend tell') |
||
local menuitems_table = {} |
||
if obj.interface then |
||
-- Inspect active interface and create menuitems |
||
local interface_detail = hs.network.interfaceDetails(obj.interface) |
||
if interface_detail.AirPort then |
||
local ssid = interface_detail.AirPort.SSID |
||
table.insert(menuitems_table, { |
||
title = "SSID: " .. ssid, |
||
tooltip = "Copy SSID to clipboard", |
||
fn = function() hs.pasteboard.setContents(ssid) end |
||
}) |
||
end |
||
if interface_detail.IPv4 then |
||
local ipv4 = interface_detail.IPv4.Addresses[1] |
||
table.insert(menuitems_table, { |
||
title = "IPv4: " .. ipv4, |
||
tooltip = "Copy IPv4 to clipboard", |
||
fn = function() hs.pasteboard.setContents(ipv4) end |
||
}) |
||
end |
||
if interface_detail.IPv6 then |
||
local ipv6 = interface_detail.IPv6.Addresses[1] |
||
table.insert(menuitems_table, { |
||
title = "IPv6: " .. ipv6, |
||
tooltip = "Copy IPv6 to clipboard", |
||
fn = function() hs.pasteboard.setContents(ipv6) end |
||
}) |
||
end |
||
local macaddr = hs.execute('ifconfig ' .. obj.interface .. ' | grep ether | awk \'{print $2}\'') |
||
table.insert(menuitems_table, { |
||
title = "MAC Addr: " .. macaddr, |
||
tooltip = "Copy MAC Address to clipboard", |
||
fn = function() hs.pasteboard.setContents(macaddr) end |
||
}) |
||
-- Start watching the netspeed delta |
||
obj.instr = 'netstat -ibn | grep -e ' .. obj.interface .. ' -m 1 | awk \'{print $7}\'' |
||
obj.outstr = 'netstat -ibn | grep -e ' .. obj.interface .. ' -m 1 | awk \'{print $10}\'' |
||
|
||
obj.inseq = hs.execute(obj.instr) |
||
obj.outseq = hs.execute(obj.outstr) |
||
|
||
if obj.timer then |
||
obj.timer:stop() |
||
obj.timer = nil |
||
end |
||
obj.timer = hs.timer.doEvery(1, data_diff) |
||
end |
||
table.insert(menuitems_table, { |
||
title = "Rescan Network Interfaces", |
||
fn = function() obj:rescan() end |
||
}) |
||
obj.menubar:setTitle("⚠︎") |
||
obj.menubar:setMenu(menuitems_table) |
||
end |
||
|
||
return obj
|
||
|