81 lines
3.3 KiB
Python
81 lines
3.3 KiB
Python
import discord
|
||
from discord.ext import commands
|
||
import requests
|
||
|
||
|
||
class Pogoda(commands.Cog):
|
||
"""Команда !pogoda — прогноз погоды для Магнитогорска"""
|
||
|
||
def __init__(self):
|
||
self.api_url = "https://wttr.in/Magnitogorsk?format=j1&lang=ru"
|
||
|
||
@commands.command(name="pogoda")
|
||
async def pogoda(self, ctx):
|
||
try:
|
||
response = requests.get(self.api_url, timeout=10)
|
||
response.raise_for_status()
|
||
data = response.json()
|
||
except requests.RequestException as e:
|
||
await ctx.send(f"Ошибка при получении данных: {e}")
|
||
return
|
||
|
||
current = data.get("current_condition", [{}])[0]
|
||
if not current:
|
||
await ctx.send("Не удалось получить данные о погоде.")
|
||
return
|
||
|
||
temp = current.get("temp_C", "—")
|
||
feels_like = current.get("FeelsLikeC", "—")
|
||
description = self._translate_weather(current.get("weatherDesc", [{}])[0].get("value", "—"))
|
||
humidity = current.get("humidity", "—")
|
||
wind_kmh = current.get("windspeedKmph", "—")
|
||
wind = round(int(wind_kmh) / 3.6, 1) if wind_kmh != "—" else "—"
|
||
pressure_mb = current.get("pressure", "—")
|
||
|
||
pressure_mm = self._pressure_to_mmhg(pressure_mb)
|
||
|
||
await ctx.send(
|
||
f"[TEMP] Температура: {temp}°C (ощущается как {feels_like}°C)\n"
|
||
f"[DESC] Описание: {description}\n"
|
||
f"[HUMID] Влажность: {humidity}%\n"
|
||
f"[WIND] Ветер: {wind} м/с\n"
|
||
f"[PRESS] Давление: {pressure_mm} мм рт. ст."
|
||
)
|
||
|
||
def _translate_weather(self, en):
|
||
mapping = {
|
||
"Sunny": "Ясно",
|
||
"Clear": "Ясно",
|
||
"Partly cloudy": "Переменная облачность",
|
||
"Cloudy": "Облачно",
|
||
"Overcast": "Пасмурно",
|
||
"Mist": "Туман",
|
||
"Fog": "Туман",
|
||
"Patchy rain nearby": "Местами дождь",
|
||
"Light rain": "Небольшой дождь",
|
||
"Moderate rain": "Умеренный дождь",
|
||
"Heavy rain": "Сильный дождь",
|
||
"Patchy snow nearby": "Местами снег",
|
||
"Light snow": "Небольшой снег",
|
||
"Heavy snow": "Сильный снег",
|
||
"Patchy sleet nearby": "Местами слякоть",
|
||
"Blowing snow": "Метель",
|
||
"Thundery outbreaks in nearby": "Гроза вблизи",
|
||
"Moderate or heavy snow in area": "Снег",
|
||
"Moderate or heavy rain in area": "Дождь",
|
||
"Moderate or heavy freezing rain in area": "Ледяной дождь",
|
||
"Moderate or heavy sleet in area": "Слякоть",
|
||
"Ice pellets": "Ледяные кристаллы",
|
||
"Haze": "Дымка",
|
||
"Foggy": "Туманно",
|
||
}
|
||
for key, value in mapping.items():
|
||
if key.lower() in en.lower():
|
||
return value
|
||
return en
|
||
|
||
def _pressure_to_mmhg(self, mb):
|
||
if mb == "—":
|
||
return "—"
|
||
return round(int(mb) * 0.750062, 1)
|