discordBot/commands/pogoda.py

81 lines
3.3 KiB
Python
Raw 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.

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)