169 Commits

Author SHA1 Message Date
deadzilla
517bb4b9fa docs: update README to reflect current project state
- Weather API: wttr.in + Open-Meteo → Yandex Weather API (api.weather.yandex.ru)
- Add required YANDEX_WEATHER_API_KEY env var and config validation section
- Add new env vars: CAT_API_KEY, YANDEX_WEATHER_API_RATE/BURST
- Document new functions: yandex_condition_to_russian(), get_weather_description()
- Document new file: utils/compat.py (Python 3.14+ monkey-patch)
- Update rate limiters: cat_limiter, yandex_weather_limiter, habr_rss_limiter + factory functions
- Remove outdated: fetch_open_meteo(), open_meteo_limiter, weather_limiter (wttr.in)
- Update requirements versions
- Add BotRunner and TextHelpCommand sections
- Note morning digest format: plain text + cat as separate message
2026-07-20 23:38:57 +05:00
deadzilla
48e64c2bc8 Replace wttr.in/Open-Meteo with Yandex Weather API
- Switch from wttr.in + Open-Meteo fallback to Yandex Weather API
- Add YANDEX_WEATHER_API_KEY to .env and config validation
- Enrich weather output: wind gusts, wind direction (Russian)
- Pressure now in mmHg directly from Yandex (no conversion needed)
- Update rate limiter: weather_limiter + open_meteo_limiter → yandex_weather_limiter
- Remove dead code: API_URL_WEATHER, fetch_open_meteo, translate_weather
- Update all tests (271 passed)
2026-07-20 23:31:11 +05:00
deadzilla
ee04f67506 заменён AGENTS.md на глобальный шаблон Global Instructions
Проектные инструкции удалены, заменены на универсальные
правила для ассистента (priorities, boundaries, workflow, testing, safety)
2026-07-20 21:58:17 +05:00
deadzilla
cc618af445 добавлены открытые задачи в ISSUES.md по результатам код-ревью
- высокий: ruff format на 5 файлах
- средний: pyproject.toml, дублирование в news.py, хардкод города,
  Scheduler без callback, неверный тест HTTP-ошибки
- низкий: list comprehension в stats.py, дублирование в TextHelpCommand,
  try/except в morning.py, файл nul
2026-07-20 21:55:38 +05:00
deadzilla
0d98d31e61 ISSUES.md: задача Dockerfile+tests отмечена как отклонена (Docker — production) 2026-07-14 22:54:47 +05:00
deadzilla
60e7faca5f Откат: тесты и pytest удалены из Dockerfile (Docker — production-окружение) 2026-07-14 22:53:57 +05:00
deadzilla
f45beef888 ISSUES.md: отмечены все 5 задач низкого приоритета как выполненные 2026-07-14 22:51:10 +05:00
deadzilla
cd014b171f rate_limiter: добавлен комментарий, поясняющий дизайн глобальных синглтонов и factory-функций 2026-07-14 22:50:45 +05:00
deadzilla
d85f28f042 Удалены избыточные проверки ctx в on_command_error (ctx всегда передан discord.py) 2026-07-14 22:48:30 +05:00
deadzilla
bb9e50fb05 Убраны приватные атрибуты с объекта discord.py Bot: START_TIME вынесен на уровень модуля, _scheduler удалён (не использовался) 2026-07-14 22:46:57 +05:00
deadzilla
5a65be97d9 Dockerfile: добавлено копирование tests/ и установка pytest для отладки в контейнере 2026-07-14 22:43:19 +05:00
deadzilla
29313530f3 Удалены избыточные @pytest.mark.asyncio (asyncio_mode = auto в pytest.ini) 2026-07-14 22:41:10 +05:00
deadzilla
003bd0552f Отмечены все 4 задачи среднего уровня как выполненные в ISSUES.md 2026-07-14 22:27:59 +05:00
deadzilla
3888c3cd01 fetch_cat() передаёт x-api-key при наличии CAT_API_KEY в окружении 2026-07-14 22:27:30 +05:00
deadzilla
0d5d8dbe7b Удалён лишний __init__ в Pg; API_URL_WEATHER используется напрямую 2026-07-14 22:23:38 +05:00
deadzilla
bb9f291623 Scheduler.__init__ больше не создаёт task синхронно; start() стал async-методом 2026-07-14 22:20:45 +05:00
deadzilla
66b16e95f4 Вынесен импорт fromstring из fetch_rss на уровень модуля 2026-07-14 22:15:14 +05:00
deadzilla
d4b457f94e docs: помечены закрытые критические задачи в ISSUES.md 2026-07-14 22:04:38 +05:00
deadzilla
3bea7abaea fix: translate_weather() проверяет точное совпадение перед substring
Точное совпадение (case-insensitive) теперь имеет приоритет над
substring-matching, что исключает ложные совпадения вида
'Heavy rain' внутри 'Heavy rain shower'.
2026-07-14 22:03:18 +05:00
deadzilla
0c6e10a482 fix: setup_logging() вызывается до первого logger.info()
Первый лог-сообщение '=== Запуск Discord бота ===' больше не теряется,
так как логгер настроен до его вывода.
2026-07-14 22:03:13 +05:00
deadzilla
9b04bc0c93 fix: setup_logging() больше не создаёт дублирующиеся handlers
Добавлен root.handlers.clear() перед добавлением новых хендлеров.
Решает проблему накопления StreamHandler/RotatingFileHandler при
повторных вызовах setup_logging().
2026-07-14 22:03:08 +05:00
deadzilla
250452ad60 Добавлены открытые задачи после кодревью (12 issue) 2026-07-12 23:39:56 +05:00
deadzilla
90547df975 docs: обновлён ISSUES.md — все задачи (средний + низкий) перенесены в исправленные 2026-07-12 00:18:43 +05:00
deadzilla
1ab3205333 fix: format_articles(None) возвращает graceful fallback вместо TypeError 2026-07-12 00:11:54 +05:00
deadzilla
f825be866b chore: удалена закомментированная устаревшая строка теста pressure_to_mmhg(0) 2026-07-12 00:09:21 +05:00
deadzilla
fb42a90bec fix: requirements.txt использует ~= (compatible release) вместо >= для предсказуемости версий 2026-07-12 00:08:49 +05:00
deadzilla
3982d26c95 fix: Dockerfile копирует conftest.py для запуска тестов в контейнере 2026-07-12 00:08:29 +05:00
deadzilla
5eb4184d63 refactor: RateLimiter принимает _time_func для детерминированных тестов без зависимости от реального времени 2026-07-12 00:08:13 +05:00
deadzilla
3a2c388adf refactor: вынесен monkey-patch asyncio.iscoroutinefunction в utils/compat.py 2026-07-12 00:05:46 +05:00
deadzilla
88ed1a6aa1 docs: обновлён ISSUES.md — 5 задач среднего приоритета перенесены в исправленные 2026-07-12 00:04:10 +05:00
deadzilla
6b0a6cd8a6 refactor: pressure_to_mmhg заменяет Any на float | int | str | None 2026-07-12 00:03:39 +05:00
deadzilla
d94b9c16ab fix: translate_weather обрезает пробелы перед проверкой на пустоту 2026-07-12 00:02:13 +05:00
deadzilla
efee713301 fix: TextHelpCommand показывает standalone-команды (без cog) если они не hidden 2026-07-11 23:59:41 +05:00
deadzilla
49cb1a430b perf: wmo_to_russian использует модульную константу _WMO_MAPPING вместо создания dict при каждом вызове 2026-07-11 23:56:54 +05:00
deadzilla
b22b02d65e fix: _parse_date валидирует формат даты через regex вместо возврата мусора 2026-07-11 23:55:18 +05:00
deadzilla
e957446063 docs: обновлён ISSUES.md — 3 задачи высокого приоритета перенесены в исправленные 2026-07-11 23:50:40 +05:00
deadzilla
048b9a3a91 fix: format_weather_data_for_console заменяет None на эм-дэш вместо вывода 'None' в текст 2026-07-11 23:50:05 +05:00
deadzilla
bc37362959 fix: !nw использует asyncio.gather() для параллельной загрузки RSS вместо последовательной 2026-07-11 23:47:00 +05:00
deadzilla
27eaa677fd fix: fallback morning-дайджеста перебирает каналы целевого сервера вместо всех серверов 2026-07-11 23:45:25 +05:00
deadzilla
e2289e5092 docs: обновлён ISSUES.md — 3 критические задачи перенесены в исправленные 2026-07-11 23:31:27 +05:00
deadzilla
c5c6a51cd2 fix: добавлено закрытие requests.Session при graceful shutdown бота 2026-07-11 23:30:55 +05:00
deadzilla
1fa6deaf67 fix: отсортирован _WEATHER_MAPPING по убыванию длины ключей для корректного substring-matching 2026-07-11 23:27:17 +05:00
deadzilla
b5cbeecb61 docs: заменён format_weather_for_embed на format_weather_for_message в README 2026-07-11 23:23:19 +05:00
deadzilla
cef53197b1 feat: !morning — заменить embed на plain text, кот отдельным сообщением
- Переименован format_weather_for_embed -> format_weather_for_message
- Убран markdown жирный (**text**) из заголовков погоды и статей
- Утренний дайджест отправляется как обычное текстовое сообщение
- Котик отправляется отдельным сообщением перед дайджестом
- Truncation через truncate_message (лимит 2000 символов)
- Обновлены тесты: проверка 2 send() вместо embed
2026-07-09 13:28:39 +05:00
deadzilla
2197a0052d Обновлён README.md: добавлены truncate_message, truncate_embed_text, truncate_embed_field в документацию utils/news.py и тесты 2026-07-09 13:15:03 +05:00
deadzilla
bc843abc63 Добавлены тесты для Cat, News, Morning когов, TextHelpCommand и truncate-функций (282 теста, все проходят) 2026-07-09 13:07:09 +05:00
deadzilla
f417a9abbc Актуализация README.md: убрал несуществующие !hp/help.py/test_help_discord, добавил test_integration, conftest, .gitignore, .pre-commit-config.yaml, обновил зависимости и счётчик тестов (154 → 161) 2026-07-09 12:53:48 +05:00
deadzilla
7cef202c8f refactor(news): Embed → plain text для команды !nw 2026-07-09 12:32:15 +05:00
deadzilla
8d346943da Замена embed-вывода !help на простой текст 2026-07-09 10:17:33 +05:00
deadzilla
d0a4f45e68 feat: удалить команду !hp вместе с тестами 2026-07-09 09:35:49 +05:00