142 lines
4.2 KiB
Python
142 lines
4.2 KiB
Python
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) |