bnovo plugin
scheduller
This commit is contained in:
@@ -5,63 +5,56 @@ 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()
|
||||
from scheduler.tasks import load_tasks_to_scheduler
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = "Запуск Telegram бота"
|
||||
help = "Запуск Telegram бота и планировщика"
|
||||
|
||||
def handle(self, *args, **options):
|
||||
print("Запуск Telegram бота...")
|
||||
|
||||
# Настройка Django окружения
|
||||
# Установка Django окружения
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "touchh.settings")
|
||||
django.setup()
|
||||
|
||||
# Создание приложения Telegram
|
||||
# Создаем новый цикл событий
|
||||
loop = asyncio.new_event_loop()
|
||||
asyncio.set_event_loop(loop)
|
||||
|
||||
# Настройка планировщика
|
||||
scheduler = AsyncIOScheduler(event_loop=loop)
|
||||
scheduler.start()
|
||||
|
||||
# Загрузка задач в планировщик
|
||||
try:
|
||||
load_tasks_to_scheduler(scheduler)
|
||||
except Exception as e:
|
||||
self.stderr.write(f"Ошибка при загрузке задач в планировщик: {e}")
|
||||
return
|
||||
|
||||
# Настройка 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()
|
||||
|
||||
await application.initialize()
|
||||
await application.start()
|
||||
await application.updater.start_polling()
|
||||
self.stdout.write(self.style.SUCCESS("Telegram бот и планировщик успешно запущены."))
|
||||
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("Планировщик остановлен.")
|
||||
await asyncio.sleep(3600)
|
||||
except asyncio.CancelledError:
|
||||
await application.stop()
|
||||
scheduler.shutdown()
|
||||
|
||||
# Запуск асинхронной программы
|
||||
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
|
||||
loop.run_until_complete(main())
|
||||
except KeyboardInterrupt:
|
||||
self.stdout.write(self.style.ERROR("Завершение работы Telegram бота и планировщика"))
|
||||
finally:
|
||||
loop.close()
|
||||
|
||||
@@ -138,18 +138,18 @@ async def check_pms(update, context):
|
||||
|
||||
# Создаем экземпляр PMSIntegrationManager
|
||||
pms_manager = PMSIntegrationManager(hotel_id=hotel_id)
|
||||
await sync_to_async(pms_manager.load_hotel)()
|
||||
await pms_manager.load_hotel()
|
||||
await sync_to_async(pms_manager.load_plugin)()
|
||||
|
||||
# Проверяем, какой способ интеграции использовать
|
||||
if hasattr(pms_manager.plugin, 'fetch_data'):
|
||||
if hasattr(pms_manager.plugin, 'fetch_data') and callable(pms_manager.plugin.fetch_data):
|
||||
# Плагин поддерживает метод fetch_data
|
||||
data = await sync_to_async(pms_manager.plugin.fetch_data)()
|
||||
data = await pms_manager.plugin.fetch_data()
|
||||
elif pms_config.api_url and pms_config.token:
|
||||
# Используем прямой запрос к API
|
||||
from pms_integration.api_client import APIClient
|
||||
api_client = APIClient(base_url=pms_config.api_url, access_token=pms_config.token)
|
||||
data = await sync_to_async(api_client.fetch_reservations)()
|
||||
data = api_client.fetch_reservations()
|
||||
else:
|
||||
# Если подходящий способ не найден
|
||||
await query.edit_message_text("Подходящий способ интеграции с PMS не найден.")
|
||||
@@ -163,7 +163,8 @@ async def check_pms(update, context):
|
||||
await query.edit_message_text(f"Интеграция PMS {pms_config.name} завершена успешно.")
|
||||
except Exception as e:
|
||||
# Обрабатываем и логируем ошибки
|
||||
await query.edit_message_text(f"Ошибка: {str(e)}")
|
||||
await query.edit_message_text(f"❌ Ошибка: {str(e)}")
|
||||
|
||||
|
||||
async def setup_rooms(update: Update, context):
|
||||
"""Настроить номера отеля."""
|
||||
|
||||
Reference in New Issue
Block a user