diff --git a/CODE_REVIEW.md b/CODE_REVIEW.md index 1e9047d..7df0c27 100644 --- a/CODE_REVIEW.md +++ b/CODE_REVIEW.md @@ -157,7 +157,7 @@ def pressure_to_mmhg(mb): --- -### H4. Cog-классы добавляются в `on_ready` -- риск дублирования +### H4. Cog-классы добавляются в `on_ready` -- риск дублирования — **ИСПРАВЛЕНО** **Файл:** `bot.py`, строки 44-49 @@ -539,7 +539,7 @@ DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for r 3. [x] H1: Защитить `format_weather_data_for_console` от пустого списка — **выполнено** 4. [x] H2: Отсортировать ключи `translate_weather` по убыванию длины — **выполнено** 5. [x] H3: Исправить `pressure_to_mmhg` -- `not mb` -> `mb is None or mb == ""` — **выполнено** -6. [ ] H4: Добавить защиту от дублирования cogs в `on_ready` +6. [x] H4: Добавить защиту от дублирования cogs в `on_ready` — **выполнено** 7. [ ] H5: Заменить `asyncio.run()` на `async def` в fetch-тестах (50+ тестов) 8. [ ] H6: Добавить HTTPError в retry-блок `fetch_weather` 9. [ ] H7: Добавить HTTPException/BadRequest в `on_command_error` diff --git a/bot.py b/bot.py index d17702c..d6ee391 100644 --- a/bot.py +++ b/bot.py @@ -45,6 +45,10 @@ class BotRunner: @self.bot.event async def on_ready() -> None: logger.info("Бот вошёл как %s", self.bot.user) + # on_ready может сработать несколько раз (reconnect) — защита от дублирования cogs + if self.bot.cogs: + logger.info("Cog-модули уже загружены, пропускаю") + return for cog_class in ALL_COMMANDS: cog = cog_class() await self.bot.add_cog(cog)