Added comments for readability

This commit is contained in:
Lyx committed 2025-03-15 11:35:29 +01:00
1 parent 0503e6eaeb
commit 61ace33c31
3 files changed
+49 -27

No files matched your search

+11 -9
View File
@@ -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
+37 -18
View File
@@ -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
View File
@@ -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",