Files
Ultroid-fork/plugins/weather.py
github-actions[bot] e8965cf0c4 format: auto-format code by ruff.
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-06-08 18:53:15 +00:00

179 lines
7.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Ultroid ~ UserBot
# Copyright (C) 2023-2024 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
# <https://www.github.com/TeamUltroid/Ultroid/blob/main/LICENSE/>.
"""
**Get Weather Data using OpenWeatherMap API**
❍ Commands Available -
• `{i}weather` <city name>
Shows the Weather of Cities
• `{i}air` <city name>
Shows the Air Condition of Cities
"""
import datetime
import time
from datetime import timedelta
import aiohttp
import pytz
from . import async_searcher, get_string, udB, ultroid_cmd
async def get_timezone(offset_seconds, use_utc=False):
offset = timedelta(seconds=offset_seconds)
hours, remainder = divmod(offset.seconds, 3600)
sign = "+" if offset.total_seconds() >= 0 else "-"
timezone = "UTC" if use_utc else "GMT"
if use_utc:
for m in pytz.all_timezones:
tz = pytz.timezone(m)
now = datetime.datetime.now(tz)
if now.utcoffset() == offset:
return f"{m} ({timezone}{sign}{hours:02d})"
else:
for m in pytz.all_timezones:
tz = pytz.timezone(m)
if m.startswith("Australia/"):
now = datetime.datetime.now(tz)
if now.utcoffset() == offset:
return f"{m} ({timezone}{sign}{hours:02d})"
for m in pytz.all_timezones:
tz = pytz.timezone(m)
now = datetime.datetime.now(tz)
if now.utcoffset() == offset:
return f"{m} ({timezone}{sign}{hours:02d})"
return "Timezone not found"
async def getWindinfo(speed: str, degree: str) -> str:
dirs = ["N", "NE", "E", "SE", "S", "SW", "W", "NW"]
ix = round(degree / (360.00 / len(dirs)))
kmph = str(float(speed) * 3.6) + " km/h"
return f"[{dirs[ix % len(dirs)]}] {kmph}"
async def get_air_pollution_data(latitude, longitude, api_key):
url = f"http://api.openweathermap.org/data/2.5/air_pollution?lat={latitude}&lon={longitude}&appid={api_key}"
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
data = await response.json()
if "list" in data:
air_pollution = data["list"][0]
return air_pollution
else:
return None
@ultroid_cmd(pattern="weather ?(.*)")
async def weather(event):
if event.fwd_from:
return
msg = await event.eor(get_string("com_1"))
x = udB.get_key("OPENWEATHER_API")
if x is None:
await event.eor(
"No API found. Get One from [Here](https://api.openweathermap.org)\nAnd Add it in OPENWEATHER_API Redis Key",
time=8,
)
return
input_str = event.pattern_match.group(1)
if not input_str:
await event.eor("No Location was Given...", time=5)
return
elif input_str == "butler":
await event.eor("search butler,au for australila", time=5)
sample_url = f"https://api.openweathermap.org/data/2.5/weather?q={input_str}&APPID={x}&units=metric"
try:
response_api = await async_searcher(sample_url, re_json=True)
if response_api["cod"] == 200:
country_time_zone = int(response_api["timezone"])
tz = f"{await get_timezone(country_time_zone)}"
sun_rise_time = int(response_api["sys"]["sunrise"]) + country_time_zone
sun_set_time = int(response_api["sys"]["sunset"]) + country_time_zone
await msg.edit(
f"{response_api['name']}, {response_api['sys']['country']}\n\n"
f"╭────────────────•\n"
f"╰➢ **𝖶𝖾𝖺𝗍𝗁𝖾𝗋:** {response_api['weather'][0]['description']}\n"
f"╰➢ **𝖳𝗂𝗆𝖾𝗓𝗈𝗇𝖾:** {tz}\n"
f"╰➢ **𝖲𝗎𝗇𝗋𝗂𝗌𝖾:** {time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(sun_rise_time))}\n"
f"╰➢ **𝖲𝗎𝗇𝗌𝖾𝗍:** {time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(sun_set_time))}\n"
f"╰➢ **𝖶𝗂𝗇𝖽:** {await getWindinfo(response_api['wind']['speed'], response_api['wind']['deg'])}\n"
f"╰➢ **𝖳𝖾𝗆𝗉𝖾𝗋𝖺𝗍𝗎𝗋𝖾:** {response_api['main']['temp']}°C\n"
f"╰➢ **𝖥𝖾𝖾𝗅𝗌 𝗅𝗂𝗄𝖾:** {response_api['main']['feels_like']}°C\n"
f"╰➢ **𝖬𝗂𝗇𝗂𝗆𝗎𝗆:** {response_api['main']['temp_min']}°C\n"
f"╰➢ **𝖬𝖺𝗑𝗂𝗆𝗎𝗆:** {response_api['main']['temp_max']}°C\n"
f"╰➢ **𝖯𝗋𝖾𝗌𝗌𝗎𝗋𝖾:** {response_api['main']['pressure']} hPa\n"
f"╰➢ **𝖧𝗎𝗆𝗂𝖽𝗂𝗍𝗒:** {response_api['main']['humidity']}%\n"
f"╰➢ **𝖵𝗂𝗌𝗂𝖻𝗂𝗅𝗂𝗍𝗒:** {response_api['visibility']} m\n"
f"╰➢ **𝖢𝗅𝗈𝗎𝖽𝗌:** {response_api['clouds']['all']}%\n"
f"╰────────────────•\n\n"
)
else:
await msg.edit(response_api["message"])
except Exception as e:
await event.eor(f"An unexpected error occurred: {str(e)}", time=5)
@ultroid_cmd(pattern="air ?(.*)")
async def air_pollution(event):
if event.fwd_from:
return
msg = await event.eor(get_string("com_1"))
x = udB.get_key("OPENWEATHER_API")
if x is None:
await event.eor(
"No API found. Get One from [Here](https://api.openweathermap.org)\nAnd Add it in OPENWEATHER_API Redis Key",
time=8,
)
return
input_str = event.pattern_match.group(1)
if not input_str:
await event.eor("`No Location was Given...`", time=5)
return
if input_str.lower() == "perth":
geo_url = f"https://geocode.xyz/perth%20au?json=1"
else:
geo_url = f"https://geocode.xyz/{input_str}?json=1"
geo_data = await async_searcher(geo_url, re_json=True)
try:
longitude = geo_data["longt"]
latitude = geo_data["latt"]
except KeyError as e:
LOGS.info(e)
await event.eor("`Unable to find coordinates for the given location.`", time=5)
return
try:
city = geo_data["standard"]["city"]
prov = geo_data["standard"]["prov"]
except KeyError as e:
LOGS.info(e)
await event.eor("`Unable to find city for the given coordinates.`", time=5)
return
air_pollution_data = await get_air_pollution_data(latitude, longitude, x)
if air_pollution_data is None:
await event.eor(
"`Unable to fetch air pollution data for the given location.`", time=5
)
return
await msg.edit(
f"{city}, {prov}\n\n"
f"╭────────────────•\n"
f"╰➢ **𝖠𝖰𝖨:** {air_pollution_data['main']['aqi']}\n"
f"╰➢ **𝖢𝖺𝗋𝖻𝗈𝗇 𝖬𝗈𝗇𝗈𝗑𝗂𝖽𝖾:** {air_pollution_data['components']['co']}µg/m³\n"
f"╰➢ **𝖭𝗈𝗂𝗍𝗋𝗈𝗀𝖾𝗇 𝖬𝗈𝗇𝗈𝗑𝗂𝖽𝖾:** {air_pollution_data['components']['no']}µg/m³\n"
f"╰➢ **𝖭𝗂𝗍𝗋𝗈𝗀𝖾𝗇 𝖣𝗂𝗈𝗑𝗂𝖽𝖾:** {air_pollution_data['components']['no2']}µg/m³\n"
f"╰➢ **𝖮𝗓𝗈𝗇𝖾:** {air_pollution_data['components']['o3']}µg/m³\n"
f"╰➢ **𝖲𝗎𝗅𝗉𝗁𝗎𝗋 𝖣𝗂𝗈𝗑𝗂𝖽𝖾:** {air_pollution_data['components']['so2']}µg/m³\n"
f"╰➢ **𝖠𝗆𝗆𝗈𝗇𝗂𝖺:** {air_pollution_data['components']['nh3']}µg/m³\n"
f"╰➢ **𝖥𝗂𝗇𝖾 𝖯𝖺𝗋𝗍𝗂𝖼𝗅𝖾𝗌 (PM₂.₅):** {air_pollution_data['components']['pm2_5']}\n"
f"╰➢ **𝖢𝗈𝖺𝗋𝗌𝖾 𝖯𝖺𝗋𝗍𝗂𝖼𝗅𝖾𝗌 (PM₁₀):** {air_pollution_data['components']['pm10']}\n"
f"╰────────────────•\n\n"
)