143 lines
3.3 KiB
Lua

local icons = require "icons"
local colors = require("colors").sections.widgets.wifi
sbar.exec(
"killall network_load >/dev/null; $CONFIG_DIR/helpers/event_providers/network_load/bin/network_load en0 network_update 2.0"
)
local popup_width = 250
local wifi = sbar.add("item", "widgets.wifi", {
position = "right",
padding_right = 8,
padding_left = 0,
icon = {
color = colors.icon,
padding_left = 8
},
label = {
padding_right = 8,
},
popup = {
align = "center",
height = 30,
y_offset = 2,
},
})
local ip = sbar.add("item", {
position = "popup." .. wifi.name,
icon = {
align = "left",
string = "IP:",
width = popup_width / 2,
},
label = {
string = "???.???.???.???",
width = popup_width / 2,
align = "right",
},
background = { drawing = false },
})
local router = sbar.add("item", {
position = "popup." .. wifi.name,
icon = {
align = "left",
string = "Router:",
width = popup_width / 2,
},
label = {
string = "???.???.???.???",
width = popup_width / 2,
align = "right",
},
background = { drawing = false },
})
wifi:subscribe({ "wifi_change", "system_woke", "forced" }, function()
sbar.exec([[ipconfig getsummary en0 | awk -F ' SSID : ' '/ SSID : / {print $2}']], function(wifi_name)
local is_connected = not (wifi_name == "")
wifi:set {
icon = {
string = is_connected and icons.wifi.connected or icons.wifi.disconnected,
},
label = {
string = is_connected and wifi_name or "",
}
}
sbar.exec([[sleep 2; scutil --nwi | grep -m1 'utun' | awk '{ print $1 }']], function(vpn)
local is_vpn_connected = not (vpn == "")
if is_vpn_connected then
wifi:set {
icon = {
string = icons.wifi.vpn,
color = colors.green,
},
}
end
end)
end)
end)
local function hide_details()
wifi:set { popup = { drawing = false } }
end
local function toggle_details()
local should_draw = wifi:query().popup.drawing == "off"
if should_draw then
wifi:set { popup = { drawing = true } }
sbar.exec("ipconfig getifaddr en0", function(result)
ip:set { label = result }
end)
sbar.exec("networksetup -getinfo Wi-Fi | awk -F 'Router: ' '/^Router: / {print $2}'", function(result)
router:set { label = result }
end)
else
hide_details()
end
end
wifi:subscribe("mouse.clicked", function()
sbar.animate("tanh", 8, function()
wifi:set({
background = {
shadow = {
distance = 0,
},
},
y_offset = -4,
padding_left = 4,
padding_right = 4,
})
wifi:set({
background = {
shadow = {
distance = 4,
},
},
y_offset = 0,
padding_left = 0,
padding_right = 8,
})
end)
toggle_details()
end)
-- wifi:subscribe("mouse.exited.global", hide_details)
local function copy_label_to_clipboard(env)
local label = sbar.query(env.NAME).label.value
sbar.exec('echo "' .. label .. '" | pbcopy')
sbar.set(env.NAME, { label = { string = icons.clipboard, align = "center" } })
sbar.delay(1, function()
sbar.set(env.NAME, { label = { string = label, align = "right" } })
end)
end
ip:subscribe("mouse.clicked", copy_label_to_clipboard)
router:subscribe("mouse.clicked", copy_label_to_clipboard)