""" Management command для запуска Telegram бота. """ from django.core.management.base import BaseCommand from apps.notifications.telegram_bot import TelegramBot import asyncio import logging logger = logging.getLogger(__name__) class Command(BaseCommand): help = 'Запуск Telegram бота для уведомлений' def add_arguments(self, parser): """Добавление аргументов команды.""" parser.add_argument( '--no-polling', action='store_true', help='Не запускать polling (только инициализация)' ) def handle(self, *args, **options): """Запуск бота.""" self.stdout.write(self.style.SUCCESS('🤖 Запуск Telegram бота...')) bot = TelegramBot() try: if options['no_polling']: self.stdout.write(self.style.WARNING('Режим без polling')) asyncio.run(self._init_only(bot)) else: # Получаем информацию о боте перед запуском asyncio.run(self._show_bot_info(bot)) asyncio.run(self._run_bot(bot)) except KeyboardInterrupt: self.stdout.write(self.style.WARNING('\n⏹️ Остановка бота...')) asyncio.run(bot.stop()) self.stdout.write(self.style.SUCCESS('✅ Бот остановлен')) except Exception as e: self.stdout.write(self.style.ERROR(f'❌ Ошибка: {str(e)}')) logger.error(f'Error running Telegram bot: {e}', exc_info=True) async def _init_only(self, bot): """Только инициализация без polling.""" await bot.application.initialize() self.stdout.write(self.style.SUCCESS('✅ Бот инициализирован')) async def _run_bot(self, bot): """Запустить бота и держать его активным.""" import signal # Запускаем бота await bot.start() # Держим бота активным stop_event = asyncio.Event() def signal_handler(signum, frame): stop_event.set() signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) self.stdout.write(self.style.SUCCESS('✅ Бот работает. Нажмите Ctrl+C для остановки.')) # Ждем сигнала остановки await stop_event.wait() async def _show_bot_info(self, bot): """Показать информацию о боте.""" try: from telegram import Bot telegram_bot = Bot(token=bot.token) me = await telegram_bot.get_me() self.stdout.write(self.style.SUCCESS('')) self.stdout.write(self.style.SUCCESS('=' * 60)) self.stdout.write(self.style.SUCCESS('✅ Бот успешно авторизован!')) self.stdout.write(self.style.SUCCESS('=' * 60)) self.stdout.write(self.style.SUCCESS(f'📛 Имя: {me.first_name}')) self.stdout.write(self.style.SUCCESS(f'👤 Username: @{me.username}')) self.stdout.write(self.style.SUCCESS(f'🆔 ID: {me.id}')) self.stdout.write(self.style.SUCCESS(f'🔗 Ссылка: https://t.me/{me.username}')) self.stdout.write(self.style.SUCCESS('=' * 60)) self.stdout.write(self.style.SUCCESS('')) await telegram_bot.close() except Exception as e: self.stdout.write(self.style.WARNING(f'⚠️ Не удалось получить информацию о боте: {str(e)}'))