bot refactor
This commit is contained in:
@@ -3,79 +3,14 @@ import django
|
||||
import asyncio
|
||||
from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
||||
from django.core.management.base import BaseCommand
|
||||
from telegram.ext import (
|
||||
Application,
|
||||
CommandHandler,
|
||||
CallbackQueryHandler,
|
||||
MessageHandler,
|
||||
filters,
|
||||
)
|
||||
from bot.handlers import (
|
||||
start,
|
||||
handle_button_click,
|
||||
manage_hotels,
|
||||
hotel_actions,
|
||||
delete_hotel,
|
||||
check_pms,
|
||||
setup_rooms,
|
||||
settings_menu,
|
||||
toggle_telegram,
|
||||
toggle_email,
|
||||
set_notification_time,
|
||||
handle_notification_time,
|
||||
schedule_notifications,
|
||||
show_current_settings,
|
||||
statistics,
|
||||
generate_statistics,
|
||||
stats_select_period,
|
||||
)
|
||||
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
|
||||
|
||||
# Настройка Django окружения
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'touchh.settings')
|
||||
django.setup()
|
||||
|
||||
|
||||
async def start_bot(application):
|
||||
"""Настройка и запуск Telegram бота."""
|
||||
print("Настройка Telegram приложения...")
|
||||
|
||||
# Регистрация обработчиков команд
|
||||
print("Регистрация обработчиков команд...")
|
||||
application.add_handler(CommandHandler("start", start))
|
||||
|
||||
# Регистрация обработчиков кнопок
|
||||
print("Регистрация обработчиков кнопок...")
|
||||
application.add_handler(CallbackQueryHandler(handle_button_click))
|
||||
application.add_handler(CallbackQueryHandler(manage_hotels, pattern="^manage_hotels$"))
|
||||
application.add_handler(CallbackQueryHandler(settings_menu, pattern="^settings$"))
|
||||
application.add_handler(CallbackQueryHandler(toggle_telegram, pattern="^toggle_telegram$"))
|
||||
application.add_handler(CallbackQueryHandler(toggle_email, pattern="^toggle_email$"))
|
||||
application.add_handler(CallbackQueryHandler(set_notification_time, pattern="^set_notification_time$"))
|
||||
application.add_handler(CallbackQueryHandler(show_current_settings, pattern="^current_settings$"))
|
||||
application.add_handler(CallbackQueryHandler(hotel_actions, pattern="^hotel_"))
|
||||
application.add_handler(CallbackQueryHandler(delete_hotel, pattern="^delete_hotel_"))
|
||||
application.add_handler(CallbackQueryHandler(check_pms, pattern="^check_pms_"))
|
||||
application.add_handler(CallbackQueryHandler(setup_rooms, pattern="^setup_rooms_"))
|
||||
application.add_handler(CallbackQueryHandler(statistics, pattern="^stats$"))
|
||||
application.add_handler(CallbackQueryHandler(stats_select_period, pattern="^stats_hotel_"))
|
||||
application.add_handler(CallbackQueryHandler(generate_statistics, pattern="^stats_period_"))
|
||||
|
||||
# Регистрация обработчиков текстовых сообщений
|
||||
print("Регистрация обработчиков текстовых сообщений...")
|
||||
application.add_handler(MessageHandler(filters.TEXT & filters.ChatType.PRIVATE, handle_notification_time))
|
||||
|
||||
# Настройка планировщика
|
||||
print("Настройка планировщика уведомлений...")
|
||||
scheduler = AsyncIOScheduler()
|
||||
scheduler.add_job(schedule_notifications, "cron", minute="*")
|
||||
scheduler.start()
|
||||
|
||||
# Запуск бота
|
||||
print("Запуск Telegram бота...")
|
||||
await application.initialize()
|
||||
await application.start()
|
||||
print("Бот успешно запущен. Ожидание событий...")
|
||||
await application.updater.start_polling()
|
||||
# Загрузка переменных окружения
|
||||
load_dotenv()
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
@@ -84,20 +19,49 @@ class Command(BaseCommand):
|
||||
def handle(self, *args, **options):
|
||||
print("Запуск Telegram бота...")
|
||||
|
||||
# Получаем текущий цикл событий
|
||||
loop = asyncio.get_event_loop()
|
||||
# Настройка Django окружения
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "touchh.settings")
|
||||
django.setup()
|
||||
|
||||
# Создаём экземпляр приложения
|
||||
application = Application.builder().token("8125171867:AAGxDcSpQxJy3_pmq3TDBWtqaAVCj7b-F5k").build()
|
||||
# Создание приложения Telegram
|
||||
bot_token = os.getenv("TELEGRAM_BOT_TOKEN")
|
||||
if not bot_token:
|
||||
raise ValueError("Токен бота не найден в переменных окружения.")
|
||||
application = Application.builder().token(bot_token).build()
|
||||
|
||||
# Добавляем задачу для запуска бота
|
||||
loop.create_task(start_bot(application))
|
||||
# Настройка бота и обработчиков
|
||||
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:
|
||||
loop.run_forever()
|
||||
except KeyboardInterrupt:
|
||||
print("Остановка Telegram бота...")
|
||||
loop.run_until_complete(application.stop())
|
||||
scheduler = AsyncIOScheduler()
|
||||
scheduler.shutdown(wait=False)
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user