toaruos/util/python-demos/weather_tool.py

116 lines
3.3 KiB
Python
Executable File

#!/usr/bin/python3
"""
Tool to asynchronously fetch weather data from OpenWeatherMap.org
"""
import json
import subprocess
import os
import sys
with open('/etc/weather.json','r') as f:
config = json.loads(f.read())
home = os.environ['HOME']
if os.path.exists(f'{home}/.weather.json'):
with open(f'{home}/.weather.json','r') as f:
x_config = json.loads(f.read())
for k in x_config:
config[k] = x_config[k]
else:
x_config = {}
key = config['key']
city = config['city']
units = config['units']
def write_config():
with open(f'{home}/.weather.json','w') as f:
f.write(json.dumps(x_config))
def write_out(data):
with open('/tmp/weather.json','w') as f:
f.write(data)
try:
os.chmod('/tmp/weather.json',0o666) # Ensure users can write this, too, for now.
# Obviously a better approach would be a per-user file, but whatever.
except:
pass
def update_weather():
with open('/proc/netif','r') as f:
lines = f.readlines()
if len(lines) < 4 or "no network" in lines[0]:
with open('/tmp/weather.json','w') as f:
f.write("")
sys.exit(1)
try:
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={key}&units={units}"
data = subprocess.check_output(['fetch',url]).decode('utf-8').strip()
weather = json.loads(data)
if 'weather' in weather and len(weather['weather']) >= 1:
conditions = weather['weather'][0]
else:
conditions = None
temp = round(weather['main']['temp'])
output = {
'temp': weather['main']['temp'],
'temp_r': round(weather['main']['temp']),
'conditions': conditions['main'] if conditions else None,
'icon': conditions['icon'] if conditions else None,
'humidity': weather['main']['humidity'],
'clouds': weather['clouds']['all'] if 'all' in weather['clouds'] else None,
'city': city,
}
with open('/tmp/weather.json','w') as f:
f.write(json.dumps(output))
return True
except:
with open('/tmp/weather.json','w') as f:
f.write("")
return False
if __name__ == "__main__":
if "--config" in sys.argv:
import yutani
import yutani_mainloop
from input_box import TextInputWindow
if __name__ == '__main__':
yutani.Yutani()
d = yutani.Decor()
def quit():
sys.exit(0)
def set_units(inputbox):
global units
x_config['units'] = inputbox.text()
units = x_config['units']
inputbox.close()
write_config()
update_weather()
quit()
def set_city(inputbox):
global city
x_config['city'] = inputbox.text()
city = x_config['city']
inputbox.close()
TextInputWindow(d,"What units would you like? (metric, imperial, kelvin)","",text=units,callback=set_units, cancel_callback=quit)
TextInputWindow(d,"What city are you in?","",text=city,callback=set_city,cancel_callback=quit)
yutani_mainloop.mainloop()
sys.exit(0)
else:
if not update_weather():
sys.exit(1)