68 lines
2.9 KiB
Python
68 lines
2.9 KiB
Python
import os
|
|
import django
|
|
import asyncio
|
|
from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
|
from django.core.management.base import BaseCommand
|
|
from telegram.ext import Application
|
|
from bot.utils.bot_setup import setup_bot
|
|
from bot.utils.scheduler import setup_scheduler
|
|
from dotenv import load_dotenv
|
|
from bot.operations.users import show_users
|
|
|
|
# Загрузка переменных окружения
|
|
load_dotenv()
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = "Запуск Telegram бота"
|
|
|
|
def handle(self, *args, **options):
|
|
print("Запуск Telegram бота...")
|
|
|
|
# Настройка Django окружения
|
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "touchh.settings")
|
|
django.setup()
|
|
|
|
# Создание приложения Telegram
|
|
bot_token = os.getenv("TELEGRAM_BOT_TOKEN")
|
|
if not bot_token:
|
|
raise ValueError("Токен бота не найден в переменных окружения.")
|
|
application = Application.builder().token(bot_token).build()
|
|
|
|
# Настройка бота и обработчиков
|
|
setup_bot(application)
|
|
|
|
async def main():
|
|
print("Настройка планировщика...")
|
|
scheduler = setup_scheduler()
|
|
scheduler.start()
|
|
|
|
try:
|
|
print("Инициализация Telegram бота...")
|
|
await application.initialize() # Инициализация приложения
|
|
print("Бот запущен. Ожидание сообщений...")
|
|
await application.start() # Запуск приложения
|
|
await application.updater.start_polling() # Запуск обработки сообщений
|
|
|
|
# Бесконечный цикл для удержания приложения активным
|
|
while True:
|
|
await asyncio.sleep(3600) # Ожидание 1 час
|
|
except Exception as e:
|
|
print(f"Ошибка во время работы бота: {e}")
|
|
finally:
|
|
print("Остановка Telegram бота...")
|
|
await application.stop() # Завершаем приложение перед shutdown
|
|
print("Остановка планировщика...")
|
|
scheduler.shutdown(wait=False)
|
|
print("Планировщик остановлен.")
|
|
|
|
try:
|
|
asyncio.run(main())
|
|
except RuntimeError as e:
|
|
if str(e) == "This event loop is already running":
|
|
print("Цикл событий уже запущен. Используем другой подход для запуска.")
|
|
loop = asyncio.get_event_loop()
|
|
loop.run_until_complete(main())
|
|
else:
|
|
raise
|