Gop*_*iva 5 applescript automation hammerspoon
我想有一个Hammerspoon wifi观察器,它定期检查,如果没有连接将禁用wifi.
以下脚本执行此操作,
function checkAndDisableWifi()
hs.timer.doAfter(45, function()
local current_network = hs.wifi.currentNetwork()
if current_network == nil then
hs.wifi.setPower(false)
hs.notify.new({title="Hammerspoon",informativeText="Disabling wifi due to inactivity"}):send()
end
end)
end
function wifi_timer_callback()
local wifi_state = hs.wifi.interfaceDetails().power
if wifi_state then
local current_network = hs.wifi.currentNetwork()
if current_network == nil then
hs.wifi.setPower(false)
hs.notify.new({title="Hammerspoon",informativeText="Disabling wifi due to inactivity"}):send()
end
else
hs.wifi.setPower(true)
checkAndDisableWifi()
end
end
local wifi_timer = hs.timer.doEvery((10*60), wifi_timer_callback)
wifi_timer:start()
Run Code Online (Sandbox Code Playgroud)
在这里,我面临一个问题,比如用户是否已通过LAN连接.在这个时间点我不需要启用这个观察者(以便停止开启和关闭wifi).所以我需要的是,是否有任何API可以告诉我用户是通过局域网连接还是至少连接到互联网?
我清楚了吗?
在发布问题后,我得到了一个类似于@TheFrenchPlays 的想法。这是我目前通过锤勺扩展这个想法的方法,
status, data, headers = hs.http.get("http://google.com")
Run Code Online (Sandbox Code Playgroud)
因此,当您检查状态变量时,如果在线,则会给出 200,如果离线,则会给出 0。因此,通过检查这个变量,我可以解决这个问题。
如果我没有错的话,如果hammerspoon公开一个API,无论是否连接都返回一个BOOL,那就太好了。也可通过 WiFi 或 LAN。
更新:目前,当系统通过 LAN 连接时,这种解决方法并不能完全解决问题。由于我不知道它是通过LAN还是WiFi连接的,所以我无法直接关闭WiFi。因此当前的解决方法似乎很乏味
function checkAndDisableWifi()
hs.timer.doAfter(45, function()
local current_network = hs.wifi.currentNetwork()
if current_network == nil then
disableWifi()
end
end)
end
function disableWifi()
hs.wifi.setPower(false)
hs.notify.new({title="Hammerspoon",informativeText="Disabling wifi due to inactivity"}):send()
end
function wifi_timer_callback()
local status, data, headers = hs.http.get("http://google.com")
local wifi_state = hs.wifi.interfaceDetails().power
local current_network = hs.wifi.currentNetwork()
if not status == 200 then -- user is offline mean not connected to LAN. So do WiFi check
if wifi_state and current_network == nil then
disableWifi()
else
hs.wifi.setPower(true)
checkAndDisableWifi()
end
else
--[[
since user is connected to online, check whether user is connected through wifi or not. If wifi is on and not connected to any network then disable wifi
--]]
if wifi_state and current_network == nil then
disableWifi()
end
end
end
local wifi_timer = hs.timer.doEvery((10*60), wifi_timer_callback)
wifi_timer:start()
Run Code Online (Sandbox Code Playgroud)
更新2:
看起来Hammerspoon (0.9.47) 已经解决了这个问题。使用 Chris 给出的解决方案更新代码,
if hs.network.interfaceDetails(v4) then
if hs.network.interfaceDetails(v4)["AirPort"] then
print("on wifi")
else
print("on Lan")
end
else
print("not connected to internet")
end
Run Code Online (Sandbox Code Playgroud)