diff --git a/bot.py b/bot.py index 564255c..f81ef10 100644 --- a/bot.py +++ b/bot.py @@ -30,17 +30,17 @@ scheduler: Scheduler | None = None @bot.event async def on_ready(): global scheduler - print(f"Бот вошёл как {bot.user}") + logger.info(f"Бот вошёл как {bot.user}") for cog_class in ALL_COMMANDS: cog = cog_class() await bot.add_cog(cog) for cog in bot.cogs: - print(f" Загружен: {cog}") + logger.info(f" Загружен: {cog}") # Запуск планировщика morning_time = os.getenv("MORNING_TIME", "07:00") scheduler = Scheduler(bot, morning_time) - print(f" Планировщик запущен (время: {morning_time})") + logger.info(f" Планировщик запущен (время: {morning_time})") bot_ready.set() @@ -116,20 +116,20 @@ def console_input(): try: asyncio.run_coroutine_threadsafe(bot.close(), bot.loop).result(timeout=5) except Exception as e: - print(f"Ошибка при остановке бота: {e}") + logger.error(f"Ошибка при остановке бота: {e}") break if __name__ == "__main__": token = os.getenv("DISCORD_TOKEN") if not token: - print("Ошибка: токен не найден в .env") + logger.error("Токен Discord не найден в .env") sys.exit(1) # Консольный ввод работает только в интерактивном терминале # В Docker stdin недоступен — пропускаем консольный режим if sys.stdin.isatty(): - print("Введите 'stop' для остановки бота") + logger.info("Введите 'stop' для остановки бота") thread = threading.Thread(target=console_input, daemon=True) thread.start() @@ -137,18 +137,18 @@ if __name__ == "__main__": bot.run(token) except discord.LoginFailure as e: logger.critical(f"Ошибка авторизации бота: {e}", exc_info=True) - print(f"❌ Токен неверный или бот отключён. Код ошибки: {e}") + logger.error("Токен неверный или бот отключён. Код ошибки: %s", e) sys.exit(1) except discord.HTTPException as e: logger.critical(f"HTTP ошибка при подключении к Discord: {e}", exc_info=True) - print(f"❌ Сбой соединения с Discord API. Проверьте доступность сервиса.") + logger.error("Сбой соединения с Discord API. Проверьте доступность сервиса.") sys.exit(1) except Exception as e: logger.critical(f"Непредвиденная ошибка при запуске бота: {e}", exc_info=True) - print(f"❌ Критическая ошибка при запуске. Код ошибки: {type(e).__name__}") + logger.error("Критическая ошибка при запуске. Код ошибки: %s", type(e).__name__) sys.exit(1) except KeyboardInterrupt: - print("\nОстановка бота...") + logger.info("Остановка бота...") stop_event.set() if scheduler: scheduler.stop() diff --git a/commands/help.py b/commands/help.py index 9b6eb3b..502652d 100644 --- a/commands/help.py +++ b/commands/help.py @@ -30,5 +30,3 @@ class Help(commands.Cog): await ctx.send(message) -if __name__ == "__main__": - print("Cog loaded!") diff --git a/console_commands/stop.py b/console_commands/stop.py index ee6fd10..9836120 100644 --- a/console_commands/stop.py +++ b/console_commands/stop.py @@ -1,4 +1,7 @@ import asyncio +import logging + +logger = logging.getLogger(__name__) def stop(stop_event, bot): @@ -7,4 +10,4 @@ def stop(stop_event, bot): try: asyncio.run_coroutine_threadsafe(bot.close(), bot.loop).result(timeout=5) except Exception as e: - print(f"Ошибка при остановке бота: {e}") + logger.error("Ошибка при остановке бота: %s", e) diff --git a/utils/pogoda.py b/utils/pogoda.py index e7e5361..2f9eef9 100644 --- a/utils/pogoda.py +++ b/utils/pogoda.py @@ -1,7 +1,10 @@ import asyncio +import logging import requests from requests.exceptions import ConnectionError, Timeout, SSLError +logger = logging.getLogger(__name__) + API_URL_WEATHER = "https://wttr.in/Magnitogorsk?format=j1&lang=ru" _session = requests.Session() @@ -17,12 +20,12 @@ async def fetch_weather(api_url, timeout=10, max_retries=3): except (SSLError, ConnectionError, Timeout): if attempt < max_retries - 1: delay = 2 ** attempt - print(f"Попытка {attempt + 1} не удалась. Повтор через {delay} сек...") + logger.warning("Попытка %d не удалась. Повтор через %d сек...", attempt + 1, delay) await asyncio.sleep(delay) continue break except requests.RequestException as e: - print(f"Ошибка при получении данных: {e}") + logger.error("Ошибка при получении данных: %s", e) break # Fallback: Open-Meteo API (без ключа, HTTPS) @@ -59,12 +62,12 @@ async def fetch_open_meteo(lat=53.4069, lon=58.9797, timeout=10, max_retries=3): except (SSLError, ConnectionError, Timeout): if attempt < max_retries - 1: delay = 2 ** attempt - print(f"Попытка {attempt + 1} не удалась. Повтор через {delay} сек...") + logger.warning("Попытка %d не удалась. Повтор через %d сек...", attempt + 1, delay) await asyncio.sleep(delay) continue break except requests.RequestException as e: - print(f"Ошибка при получении данных: {e}") + logger.error("Ошибка при получении данных: %s", e) return None return None