Added and updated repositories 2026-01-10 01:09:56

This commit is contained in:
github-actions[bot]
2026-01-10 01:09:56 +00:00
parent 1c99e02dd0
commit 572fb61011
67 changed files with 5294 additions and 1704 deletions

View File

@@ -26,70 +26,142 @@
# scope: NumbersAPI 0.0.1
# ---------------------------------------------------------------------------------
import logging
import asyncio
from typing import Optional
import aiohttp
from datetime import datetime
from .. import loader, utils
async def get_fact_about_number(number, fact_type):
url = f"http://numbersapi.com/{number}/{fact_type}"
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
if response.status == 200:
return await response.text()
else:
return "Извините, не удалось получить факт."
async def get_fact_about_date(month, day):
date_str = datetime.now().replace(month=month, day=day).strftime("%m/%d")
url = f"http://numbersapi.com/{date_str}/date"
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
if response.status == 200:
return await response.text()
else:
return "Извините, не удалось получить факт."
logger = logging.getLogger(__name__)
@loader.tds
class NumbersAPI(loader.Module):
"""Many interesting facts about numbers."""
strings = {"name": "NumbersAPI"}
strings = {
"name": "NumbersAPI",
"usage": "<emoji document_id=5854929766146118183>❌</emoji> Usage: .num <number or date> <type>\nExamples: .num 42 math, .num 01.15 date",
"error_date_format": "<emoji document_id=5854929766146118183>❌</emoji> Invalid date format. Use: month.day (e.g., 01.15)",
"error_number_format": "<emoji document_id=5854929766146118183>❌</emoji> Invalid number format.",
"error_invalid_type": "<emoji document_id=5854929766146118183>❌</emoji> Invalid fact type. Available: math, trivia, date",
"error_api": "<emoji document_id=5854929766146118183>❌</emoji> Failed to get fact. Please try again later.",
"fetching": "<emoji document_id=5188311512791393083>🌎</emoji> Fetching fact...",
}
strings_ru = {
"usage": "<emoji document_id=5854929766146118183>❌</emoji> Использование: .num <число или дата> <тип>\nПримеры: .num 42 math, .num 01.15 date",
"error_date_format": "<emoji document_id=5854929766146118183>❌</emoji> Неверный формат даты. Используйте: месяц.день (например, 01.15)",
"error_number_format": "<emoji document_id=5854929766146118183>❌</emoji> Неверный формат числа.",
"error_invalid_type": "<emoji document_id=5854929766146118183>❌</emoji> Неверный тип факта. Доступны: math, trivia, date",
"error_api": "<emoji document_id=5854929766146118183>❌</emoji> Не удалось получить факт. Попробуйте позже.",
"fetching": "<emoji document_id=5188311512791393083>🌎</emoji> Получение факта...",
}
def __init__(self):
self._session: Optional[aiohttp.ClientSession] = None
self.valid_fact_types = ["math", "trivia", "date"]
async def _get_session(self) -> aiohttp.ClientSession:
"""Get or create aiohttp session"""
if self._session is None or self._session.closed:
self._session = aiohttp.ClientSession(
timeout=aiohttp.ClientTimeout(total=15)
)
return self._session
def _parse_date(self, date_str: str) -> Optional[tuple[int, int]]:
"""Parse date string in format MM.DD"""
try:
parts = date_str.split(".")
if len(parts) != 2:
return None
month, day = map(int, parts)
if not (1 <= month <= 12 and 1 <= day <= 31):
return None
return month, day
except ValueError:
return None
def _parse_number(self, num_str: str) -> Optional[int]:
"""Parse number string"""
try:
return int(num_str)
except ValueError:
return None
async def _fetch_fact(self, url: str) -> str:
"""Fetch fact from Numbers API"""
session = await self._get_session()
try:
async with session.get(url) as response:
if response.status == 200:
return await response.text()
else:
logger.error(f"Numbers API error: {response.status}")
return self.strings("error_api")
except asyncio.TimeoutError:
logger.error("Numbers API timeout")
return self.strings("error_api")
except Exception as e:
logger.error(f"Numbers API error: {e}")
return self.strings("error_api")
async def _get_number_fact(self, number: int, fact_type: str) -> str:
"""Get fact about number"""
url = f"http://numbersapi.com/{number}/{fact_type}"
return await self._fetch_fact(url)
async def _get_date_fact(self, month: int, day: int) -> str:
"""Get fact about date"""
date_str = f"{month:02d}/{day:02d}"
url = f"http://numbersapi.com/{date_str}/date"
return await self._fetch_fact(url)
@loader.command(
ru_doc="Дает интересный факт про число или дату\nНапример: .num 10 math или .num 01.01 date",
en_doc="Gives an interesting fact about a number or date\nexample: .num 10 math or .num 01.01 date",
)
async def num(self, message):
args = utils.get_args_raw(message).split()
if len(args) < 2:
await utils.answer(message, "Использование: .num <число или дата> <тип>")
"""Get interesting fact about number or date"""
args = utils.get_args_raw(message)
if not args:
await utils.answer(message, self.strings("usage"))
return
num_or_date = args[0]
fact_type = args[1]
parts = args.split(maxsplit=1)
if len(parts) < 2:
await utils.answer(message, self.strings("usage"))
return
if "." in num_or_date:
try:
month, day = map(int, num_or_date.split("."))
result = await get_fact_about_date(month, day)
except ValueError:
await utils.answer(
message, "Ошибка: некорректный формат даты. Используйте: месяц.день"
)
input_value = parts[0].strip()
fact_type = parts[1].strip().lower()
if fact_type not in self.valid_fact_types:
await utils.answer(message, self.strings("error_invalid_type"))
return
await utils.answer(message, self.strings("fetching"))
if "." in input_value:
date_parts = self._parse_date(input_value)
if date_parts is None:
await utils.answer(message, self.strings("error_date_format"))
return
month, day = date_parts
result = await self._get_date_fact(month, day)
else:
try:
number = int(num_or_date)
result = await get_fact_about_number(number, fact_type)
except ValueError:
await utils.answer(message, "Ошибка: некорректный ввод числа.")
return
number = self._parse_number(input_value)
if number is None:
await utils.answer(message, self.strings("error_number_format"))
return
result = await self._get_number_fact(number, fact_type)
await utils.answer(message, result)