diff --git a/bot.py b/bot.py index fd51c3d..e6706cd 100644 --- a/bot.py +++ b/bot.py @@ -175,10 +175,14 @@ class BotRunner: pass # Бот не может писать в канал — игнорируем def _on_shutdown(self) -> None: - """Остановить планировщик при завершении работы бота.""" + """Остановить планировщик и закрыть сетевые сессии.""" if self.scheduler: self.scheduler.stop() logger.info("Планировщик остановлен") + from utils import close_all_sessions + + close_all_sessions() + logger.info("Сетевые сессии закрыты") async def _on_shutdown_async(self) -> None: """Асинхронный хук завершения (discord.py on_shutdown).""" diff --git a/utils/__init__.py b/utils/__init__.py index 0f12141..4d68d36 100644 --- a/utils/__init__.py +++ b/utils/__init__.py @@ -1,5 +1,6 @@ from .pogoda import ( API_URL_WEATHER, + _session as _weather_session, fetch_weather, fetch_open_meteo, format_weather_data_for_console, @@ -8,14 +9,18 @@ from .pogoda import ( translate_weather, wmo_to_russian, ) -from .news import ( +from .news import ( # noqa: E402 + _session as _news_session, RSS_URL_ARTICLES, RSS_URL_POSTS, fetch_rss, format_articles, truncate_title, ) -from .cat import fetch_cat +from .cat import ( # noqa: E402 + _session as _cat_session, + fetch_cat, +) __all__ = [ # Погода @@ -35,4 +40,20 @@ __all__ = [ "truncate_title", # Котики "fetch_cat", + # Lifecycle + "close_all_sessions", ] + + +def close_all_sessions() -> None: + """Закрыть все requests.Session для освобождения сокетов.""" + for session in ( + _weather_session, + _news_session, + _cat_session, + ): + try: + session.close() + except Exception: + pass # Cleanup — игнорируем ошибки +