weather
This commit is contained in:
142
garfpy/weather.py
Normal file
142
garfpy/weather.py
Normal file
@ -0,0 +1,142 @@
|
||||
import discord
|
||||
import requests
|
||||
import json
|
||||
|
||||
class WeatherAPI:
|
||||
def __init__(self, api_key):
|
||||
self.api_key = api_key
|
||||
self.base_url = "https://api.openweathermap.org/data/2.5/weather"
|
||||
|
||||
def get_weather_by_zip(self, zip_code, country_code='US', units='metric'):
|
||||
"""
|
||||
Get weather data by zip code
|
||||
|
||||
Args:
|
||||
zip_code (str): ZIP code
|
||||
country_code (str): Country code (default: 'US')
|
||||
units (str): 'metric', 'imperial', or 'standard'
|
||||
"""
|
||||
params = {
|
||||
'zip': f'{zip_code},{country_code}',
|
||||
'appid': self.api_key,
|
||||
'units': units
|
||||
}
|
||||
|
||||
try:
|
||||
response = requests.get(self.base_url, params=params)
|
||||
response.raise_for_status()
|
||||
return response.json()
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Error fetching weather data: {e}")
|
||||
return None
|
||||
|
||||
def weather_embed(self, weather_data):
|
||||
if not weather_data:
|
||||
embed = discord.Embed(
|
||||
title="❌ Error",
|
||||
description="Could not fetch weather data",
|
||||
color=discord.Color.red()
|
||||
)
|
||||
return embed
|
||||
|
||||
weather_emojis = {
|
||||
'clear sky': '☀️',
|
||||
'few clouds': '🌤️',
|
||||
'scattered clouds': '⛅',
|
||||
'broken clouds': '☁️',
|
||||
'shower rain': '🌦️',
|
||||
'rain': '🌧️',
|
||||
'thunderstorm': '⛈️',
|
||||
'snow': '❄️',
|
||||
'mist': '🌫️'
|
||||
}
|
||||
|
||||
condition = weather_data['weather'][0]['description'].lower()
|
||||
emoji = weather_emojis.get(condition, '🌍')
|
||||
|
||||
embed = discord.Embed(
|
||||
title=f"{emoji} Weather in {weather_data['name']}",
|
||||
description=f"{weather_data['weather'][0]['description'].title()}",
|
||||
color=discord.Color.blue()
|
||||
)
|
||||
|
||||
embed.add_field(
|
||||
name="🌡️ Temperature",
|
||||
value=f"{weather_data['main']['temp']}°C\nFeels like {weather_data['main']['feels_like']}°C",
|
||||
inline=True
|
||||
)
|
||||
|
||||
embed.add_field(
|
||||
name="💧 Humidity",
|
||||
value=f"{weather_data['main']['humidity']}%",
|
||||
inline=True
|
||||
)
|
||||
|
||||
embed.add_field(
|
||||
name="🗜️ Pressure",
|
||||
value=f"{weather_data['main']['pressure']} hPa",
|
||||
inline=True
|
||||
)
|
||||
|
||||
if 'wind' in weather_data:
|
||||
embed.add_field(
|
||||
name="💨 Wind Speed",
|
||||
value=f"{weather_data['wind']['speed']} m/s",
|
||||
inline=True
|
||||
)
|
||||
|
||||
if 'visibility' in weather_data:
|
||||
embed.add_field(
|
||||
name="👁️ Visibility",
|
||||
value=f"{weather_data['visibility']/1000} km",
|
||||
inline=True
|
||||
)
|
||||
|
||||
embed.set_footer(
|
||||
text=f"Lat: {weather_data['coord']['lat']}, Lon: {weather_data['coord']['lon']}"
|
||||
)
|
||||
|
||||
return embed
|
||||
|
||||
@commands.command(name='weather')
|
||||
async def weather_command(self, ctx, zip_code: str, country_code: str = 'US'):
|
||||
"""
|
||||
Get weather by zip code
|
||||
Usage: !weather 10001 US
|
||||
"""
|
||||
await ctx.typing()
|
||||
|
||||
weather_data = await self.get_weather_by_zip(zip_code, country_code)
|
||||
embed = self.create_weather_embed(weather_data)
|
||||
|
||||
await ctx.send(embed=embed)
|
||||
|
||||
|
||||
|
||||
# def display_weather(self, weather_data):
|
||||
# """Pretty print weather information"""
|
||||
# if not weather_data:
|
||||
# print("No weather data available")
|
||||
# return
|
||||
|
||||
# print(f"\n🌤️ Weather for {weather_data['name']}")
|
||||
# print(f"Temperature: {weather_data['main']['temp']}°C")
|
||||
# print(f"Feels like: {weather_data['main']['feels_like']}°C")
|
||||
# print(f"Condition: {weather_data['weather'][0]['description'].title()}")
|
||||
# print(f"Humidity: {weather_data['main']['humidity']}%")
|
||||
# print(f"Pressure: {weather_data['main']['pressure']} hPa")
|
||||
# if 'visibility' in weather_data:
|
||||
# print(f"Visibility: {weather_data['visibility']/1000} km")
|
||||
|
||||
# if __name__ == "__main__":
|
||||
# API_KEY = "x"
|
||||
|
||||
# weather = WeatherAPI(API_KEY)
|
||||
|
||||
# zip_codes = ['10001', '90210', '60601']
|
||||
|
||||
# for zip_code in zip_codes:
|
||||
# data = weather.get_weather_by_zip(zip_code)
|
||||
# weather.display_weather(data)
|
||||
# print("-" * 40)
|
Reference in New Issue
Block a user