mirror of
https://github.com/Lyxminxx/weatherCLI.git
synced 2026-10-11 20:57:46 +02:00
Added comments for readability
This commit is contained in:
1 parent
0503e6eaeb
commit
61ace33c31
3 files changed
+48
-26
No files matched your search
+10
-8
@@ -1,29 +1,31 @@
|
|||||||
|
# Imports
|
||||||
import requests
|
import requests
|
||||||
from os import system, name
|
from os import system, name
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
# Gets the weather info of a city based on the url provided.
|
||||||
def get_Weather(url):
|
def get_Weather(url):
|
||||||
|
# Gets the useragent from .env
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
|
|
||||||
# Retrieve the user-agent from the environment variable
|
|
||||||
user_agent = os.getenv("USER_AGENT")
|
user_agent = os.getenv("USER_AGENT")
|
||||||
|
|
||||||
# Use the user-agent in your headers
|
|
||||||
headers = {
|
headers = {
|
||||||
"User-Agent": user_agent
|
"User-Agent": user_agent
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Gets the weather info based on url, and adds the User-Agent for identification
|
||||||
response = requests.get(url, headers=headers)
|
response = requests.get(url, headers=headers)
|
||||||
|
|
||||||
|
# Checks if we get a valid reponse
|
||||||
if response.status_code == 200:
|
if response.status_code == 200:
|
||||||
try:
|
try:
|
||||||
|
# Gets all weatherdata in a json format
|
||||||
data = response.json()
|
data = response.json()
|
||||||
details = data['properties']['timeseries'][0]['data']['instant']['details']
|
details = data['properties']['timeseries'][0]['data']['instant']['details']
|
||||||
|
# Sets the temperature and precipitation to either reflect the current weather conditions or sets it to None and 0 if the response doesn't work
|
||||||
airtemp = details.get('air_temperature', None)
|
airtemp = details.get('air_temperature', None)
|
||||||
precipitation = details.get('precipitation_amount', 0) # Defaults to 0 if missing
|
precipitation = details.get('precipitation_amount', 0)
|
||||||
|
|
||||||
except (KeyError, IndexError):
|
except (KeyError, IndexError):
|
||||||
airtemp = None
|
airtemp = None
|
||||||
@@ -31,9 +33,9 @@ def get_Weather(url):
|
|||||||
else:
|
else:
|
||||||
airtemp = None
|
airtemp = None
|
||||||
precipitation = 0
|
precipitation = 0
|
||||||
|
# Returns a dictionary with the weather conditions
|
||||||
return {"airtemp":airtemp,"precipitation":precipitation}
|
return {"airtemp":airtemp,"precipitation":precipitation}
|
||||||
|
|
||||||
|
|
||||||
def clear():
|
def clear():
|
||||||
|
|
||||||
# for windows
|
# for windows
|
||||||
|
|||||||
@@ -1,74 +1,93 @@
|
|||||||
|
# Imports
|
||||||
from functions import *
|
from functions import *
|
||||||
from possistions import *
|
from possistions import *
|
||||||
import readchar
|
import readchar
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
def selectCity():
|
def selectCity():
|
||||||
|
# Gets all cities from the dictionary in the possistions.py
|
||||||
from possistions import cities
|
from possistions import cities
|
||||||
|
# Gets city names
|
||||||
cities = list(cities.keys())
|
cities = list(cities.keys())
|
||||||
|
# Adds exit option
|
||||||
cities.append('Exit')
|
cities.append('Exit')
|
||||||
|
# For checking the selected city
|
||||||
selected = 0
|
selected = 0
|
||||||
|
# To enable and disable searchmode
|
||||||
search_mode = False
|
search_mode = False
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
clear() # Assuming you have a 'clear' function that clears the screen
|
# Just clears the screen
|
||||||
|
clear()
|
||||||
print('Select a city or hit "/" to search:')
|
print('Select a city or hit "/" to search:')
|
||||||
|
# Prints all cities and adds indentation before the name. Also adds an arrow to show which option is selected.
|
||||||
for i, city in enumerate(cities):
|
for i, city in enumerate(cities):
|
||||||
prefix = "> " if i == selected else " "
|
prefix = "> " if i == selected else " "
|
||||||
print(prefix + city)
|
print(prefix + city)
|
||||||
|
# Starts listening for keypresses
|
||||||
key = readchar.readkey()
|
key = readchar.readkey()
|
||||||
|
# Moves up if the up arrow or k is pressed
|
||||||
if key == readchar.key.UP or key == 'k' and selected > 0:
|
if key == readchar.key.UP or key == 'k' and selected > 0:
|
||||||
selected -= 1
|
selected -= 1
|
||||||
|
# Moves down if the down arrow or j is pressed
|
||||||
elif key == readchar.key.DOWN or key == 'j' and selected < len(cities) - 1:
|
elif key == readchar.key.DOWN or key == 'j' and selected < len(cities) - 1:
|
||||||
selected += 1
|
selected += 1
|
||||||
|
# selects option if Enter is pressed
|
||||||
elif key == readchar.key.ENTER:
|
elif key == readchar.key.ENTER:
|
||||||
clear()
|
clear()
|
||||||
|
# As long as it is not exit return the option that is selected
|
||||||
if cities[selected] != 'Exit':
|
if cities[selected] != 'Exit':
|
||||||
return cities[selected]
|
return cities[selected]
|
||||||
|
# If it is exit, stop the program
|
||||||
else:
|
else:
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
# Checks if / is pressed
|
||||||
elif key == "/":
|
elif key == "/":
|
||||||
|
# Enables searchmode
|
||||||
search_mode = True
|
search_mode = True
|
||||||
search_query = ""
|
search_query = ""
|
||||||
all_cities = cities # Keep original city list
|
all_cities = cities
|
||||||
filtered_cities = all_cities # Start with all cities
|
filtered_cities = all_cities
|
||||||
|
|
||||||
while search_mode:
|
while search_mode:
|
||||||
clear()
|
clear()
|
||||||
print(f"Search mode ON | Query: {search_query}")
|
print(f"Search mode ON | Query: {search_query}")
|
||||||
|
|
||||||
# Show filtered results
|
#Prints all cities that match the query with indentation
|
||||||
for city in filtered_cities:
|
for city in filtered_cities:
|
||||||
print(" " + city)
|
print(" " + city)
|
||||||
|
|
||||||
key = readchar.readkey()
|
key = readchar.readkey()
|
||||||
|
# If esc is pressed, exit search mode
|
||||||
if key == readchar.key.ESC: # Exit search mode
|
if key == readchar.key.ESC:
|
||||||
search_mode = False
|
search_mode = False
|
||||||
filtered_cities = all_cities # Reset filter
|
filtered_cities = all_cities
|
||||||
search_query = ""
|
search_query = ""
|
||||||
|
# Removes the last letter as long as the query is more than 0 characters long
|
||||||
elif key == readchar.key.BACKSPACE and len(search_query) > 0: # Delete last character
|
elif key == readchar.key.BACKSPACE and len(search_query) > 0:
|
||||||
search_query = search_query[:-1]
|
search_query = search_query[:-1]
|
||||||
|
# If enter is pressed it returns all cities that match the query
|
||||||
elif key == readchar.key.ENTER: # Exit search mode
|
elif key == readchar.key.ENTER:
|
||||||
cities = filtered_cities
|
cities = filtered_cities
|
||||||
search_mode = False
|
search_mode = False
|
||||||
|
# Any other key will be added to the query
|
||||||
else:
|
else:
|
||||||
search_query += key # Append new character
|
search_query += key
|
||||||
|
# Makes an array with all cities that match the query
|
||||||
# Update filtered cities based on search query
|
|
||||||
filtered_cities = [city for city in all_cities if search_query.lower() in city.lower()]
|
filtered_cities = [city for city in all_cities if search_query.lower() in city.lower()]
|
||||||
|
# Adds Exit if it isn't in the filtered list.
|
||||||
if "Exit" not in filtered_cities:
|
if "Exit" not in filtered_cities:
|
||||||
filtered_cities.append("Exit")
|
filtered_cities.append("Exit")
|
||||||
|
|
||||||
|
# Runs the menu and saves the selected city
|
||||||
|
|
||||||
# Call the function to display and select a city
|
|
||||||
selected_city = selectCity()
|
selected_city = selectCity()
|
||||||
|
|
||||||
|
# Gets the airtemperature of the selected city
|
||||||
airtemp = get_Weather(cities[selected_city])['airtemp']
|
airtemp = get_Weather(cities[selected_city])['airtemp']
|
||||||
|
# Gets the amount of precipitation (rain) of the selected city
|
||||||
precipitation = get_Weather(cities[selected_city])['precipitation']
|
precipitation = get_Weather(cities[selected_city])['precipitation']
|
||||||
|
|
||||||
|
# outputs based on temperature and precipitation
|
||||||
if airtemp is None:
|
if airtemp is None:
|
||||||
print("Cannot fetch weatherdata, stick your head out of the window or smth IDK...")
|
print("Cannot fetch weatherdata, stick your head out of the window or smth IDK...")
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
# Add your cities here, by setting latitude and longitude.
|
||||||
cities = {
|
cities = {
|
||||||
"Oslo" : "https://api.met.no/weatherapi/nowcast/2.0/complete?lat=59.9333&lon=10.7166",
|
"Oslo" : "https://api.met.no/weatherapi/nowcast/2.0/complete?lat=59.9333&lon=10.7166",
|
||||||
"Trondheim" : "https://api.met.no/weatherapi/nowcast/2.0/complete?lat=63.4308&lon=10.4034",
|
"Trondheim" : "https://api.met.no/weatherapi/nowcast/2.0/complete?lat=63.4308&lon=10.4034",
|
||||||
|
|||||||
Reference in new issue
Block a user