fix: H4 — защита от дублирования cogs при reconnect в on_ready

- Добавлена проверка if self.bot.cogs: return перед добавлением cogs
- on_ready может сработать несколько раз при reconnect gateway
- Без защиты команды регистрировались бы заново каждый раз

230 тестов проходят.
This commit is contained in:
deadzilla 2026-07-07 21:47:02 +05:00
parent ea0d50df4f
commit e1ab1e3a61
2 changed files with 6 additions and 2 deletions

View File

@ -157,7 +157,7 @@ def pressure_to_mmhg(mb):
--- ---
### H4. Cog-классы добавляются в `on_ready` -- риск дублирования ### H4. Cog-классы добавляются в `on_ready` -- риск дублирования — **ИСПРАВЛЕНО**
**Файл:** `bot.py`, строки 44-49 **Файл:** `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` от пустого списка — **выполнено** 3. [x] H1: Защитить `format_weather_data_for_console` от пустого списка — **выполнено**
4. [x] H2: Отсортировать ключи `translate_weather` по убыванию длины — **выполнено** 4. [x] H2: Отсортировать ключи `translate_weather` по убыванию длины — **выполнено**
5. [x] H3: Исправить `pressure_to_mmhg` -- `not mb` -> `mb is None or mb == ""` — **выполнено** 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+ тестов) 7. [ ] H5: Заменить `asyncio.run()` на `async def` в fetch-тестах (50+ тестов)
8. [ ] H6: Добавить HTTPError в retry-блок `fetch_weather` 8. [ ] H6: Добавить HTTPError в retry-блок `fetch_weather`
9. [ ] H7: Добавить HTTPException/BadRequest в `on_command_error` 9. [ ] H7: Добавить HTTPException/BadRequest в `on_command_error`

4
bot.py
View File

@ -45,6 +45,10 @@ class BotRunner:
@self.bot.event @self.bot.event
async def on_ready() -> None: async def on_ready() -> None:
logger.info("Бот вошёл как %s", self.bot.user) logger.info("Бот вошёл как %s", self.bot.user)
# on_ready может сработать несколько раз (reconnect) — защита от дублирования cogs
if self.bot.cogs:
logger.info("Cog-модули уже загружены, пропускаю")
return
for cog_class in ALL_COMMANDS: for cog_class in ALL_COMMANDS:
cog = cog_class() cog = cog_class()
await self.bot.add_cog(cog) await self.bot.add_cog(cog)